home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 October / Chip_2001-10_cd1.bin / zkuste / delphi / kolekce / d456 / DCSLIB25.ZIP / DCData.pas < prev    next >
Pascal/Delphi Source File  |  2001-04-02  |  6KB  |  208 lines

  1. {
  2.  BUSINESS CONSULTING
  3.  s a i n t - p e t e r s b u r g
  4.  
  5.          Components Library for Borland Delphi 4.x, 5.x
  6.          Copyright (c) 1998-2001 Alex'EM
  7.  
  8. }
  9. unit DCData;
  10.  
  11. interface
  12. uses
  13.   Windows, SysUtils, DCConst, DCEditTools;
  14.  
  15. const
  16.   RDATA_SUCCESS      = $0000;
  17.   RDATA_RANGEERROR   = $F001;
  18.   RDATA_INVALIDVALUE = $F002;
  19.  
  20. type
  21.   TEditOptions = set of TEditOption;
  22.   TRecordCode  = PChar;
  23.   DResult      = DWORD;
  24.  
  25.   TRecordItemData = packed record
  26.     Flags: WORD;
  27.     case DataType: TPackedDataType of
  28.       daInteger: (Value: integer);
  29.       daFloat  : (Data : Double);
  30.       daString : (Text : PChar);
  31.   end;
  32.  
  33.   PRecordDataItems = ^TRecordDataItems;
  34.   TRecordDataItems = packed array[0..0] of TRecordItemData;
  35.  
  36.   PRecordData_tag = ^TRecordData;
  37.   TRecordData = packed record
  38.     Code : TRecordCode;
  39.     State: TRecordState;
  40.     Count: WORD;
  41.     Data : TRecordDataItems;
  42.   end;
  43.  
  44. // ╠σ≥εΣ√ ≡αßε≥√ ± RecordData
  45. function RDCreate(ACount: integer): PRecordData_tag;
  46. function RDFree(AData: PRecordData_tag): DResult;
  47. function RDSetValue(var AData: PRecordData_tag; AIndex: integer;
  48.   ADataType: TPackedDataType; AValue: string): DResult;
  49. function RDSetCode(var AData: PRecordData_tag; ACode: TRecordCode; ALength: integer): DResult;
  50. function RDSetState(var AData: PRecordData_tag; AState: TRecordState): DResult;
  51. function RDGetValue(AData: PRecordData_tag; AIndex: integer): string;
  52. function RDGetCode(AData: PRecordData_tag): TRecordCode;
  53. function RDGetState(AData: PRecordData_tag): TRecordState;
  54.  
  55. // ╠σ≥εΣ√ ≡αßε≥√ ± RecordItemData
  56. function DISetValue(var AItemData: TRecordItemData; ADataType: TPackedDataType;
  57.   AValue: string): DResult;
  58. function DISetFlag(var AItemData: TRecordItemData; AFlag: integer; AClear: boolean = False): DResult;
  59. function DIGetValue(AItemData: TRecordItemData): string;
  60. function DIGetFlag(AItemData: TRecordItemData; AFlag: integer): integer;
  61.  
  62. implementation
  63.  
  64. function RDCreate(ACount: integer): PRecordData_tag;
  65.  var
  66.   ASize, i: integer;
  67. begin
  68.   ASize := SizeOf(TRecordData)+SizeOf(TRecordItemData)*ACount;
  69.  
  70.   GetMem(Result, ASize);
  71.   FillChar(Result^, ASize, 0);
  72.  
  73.   Result.Count := ACount;
  74.   GetMem(Result.Code, 1); StrCopy(Result.Code, '');
  75.   
  76.   for i := 0 to ACount - 1 do Result.Data[i].Text := nil;
  77. end;
  78.  
  79. function RDFree(AData: PRecordData_tag): DResult;
  80.  var
  81.   i, ASize: integer;
  82.   DataItem: TRecordItemData;
  83. begin
  84.   Result := RDATA_SUCCESS;
  85.   
  86.   if AData = nil then Exit;
  87.  
  88.   ASize  := SizeOf(TRecordData)+SizeOf(TRecordItemData)*AData.Count;
  89.  
  90.   for i := 0 to AData.Count - 1 do
  91.   begin
  92.     DataItem := AData.Data[i];
  93.     if (DataItem.DataType = daString) and Assigned(DataItem.Text) then
  94.       FreeMem(DataItem.Text, StrLen(DataItem.Text));
  95.   end;
  96.  
  97.   ReallocMem(AData.Code, 0);
  98.   FreeMem(AData, ASize);
  99. end;
  100.  
  101. function RDSetValue(var AData: PRecordData_tag; AIndex: integer;
  102.   ADataType: TPackedDataType; AValue: string): DResult;
  103. begin
  104.   if AIndex > AData.Count-1 then
  105.   begin
  106.     Result := RDATA_RANGEERROR;
  107.     Exit;
  108.   end;
  109.   Result := DISetValue(AData.Data[AIndex], ADataType, AValue);
  110. end;
  111.  
  112. function RDSetCode(var AData: PRecordData_tag; ACode: TRecordCode; ALength: integer): DResult;
  113. begin
  114.   Result := RDATA_SUCCESS;
  115.   ReallocMem(AData.Code, SizeOf(Char)*(ALength+1));
  116.   StrCopy(AData.Code, ACode);
  117. end;
  118.  
  119. function RDSetState(var AData: PRecordData_tag; AState: TRecordState): DResult;
  120. begin
  121.   Result := RDATA_SUCCESS;
  122.   AData.State := AState;
  123. end;
  124.  
  125. function RDGetValue(AData: PRecordData_tag; AIndex: integer): string;
  126. begin
  127.   if AIndex > AData.Count-1 then
  128.   begin
  129.     Result := '';
  130.     Exit;
  131.   end;
  132.   Result := DIGetValue(AData.Data[AIndex]);
  133. end;
  134.  
  135. function RDGetCode(AData: PRecordData_tag): TRecordCode;
  136. begin
  137.   Result := AData.Code;
  138. end;
  139.  
  140. function RDGetState(AData: PRecordData_tag): TRecordState;
  141. begin
  142.   Result := AData.State;
  143. end;
  144.  
  145. function DISetValue(var AItemData: TRecordItemData; ADataType: TPackedDataType;
  146.   AValue: string): DResult;
  147. begin
  148.   Result := RDATA_SUCCESS;
  149.   if ADataType <> AItemData.DataType then
  150.   begin
  151.     if (AItemData.DataType = daString) and Assigned(AItemData.Text) then
  152.     begin
  153.       FreeMem(AItemData.Text, StrLen(AItemData.Text));
  154.       AItemData.Text := nil;
  155.     end;
  156.   end;
  157.   AItemData.DataType := ADataType;
  158.   case ADataType of
  159.     daInteger:
  160.       if IsValidInteger(AValue) then
  161.         AItemData.Value := StrToInt(AValue)
  162.       else
  163.         Result := RDATA_INVALIDVALUE;
  164.     daFloat:
  165.       if IsValidFloat(AValue) then
  166.         AItemData.Data := StrToFloat(AValue)
  167.       else
  168.         Result := RDATA_INVALIDVALUE;
  169.     daString:
  170.       begin
  171.         if Assigned(AItemData.Text) then
  172.           ReallocMem(AItemData.Text, SizeOf(Char)*(Length(AValue)+1))
  173.         else
  174.           GetMem(AItemData.Text, SizeOf(Char)*(Length(AValue)+1));
  175.         StrPCopy(AItemData.Text, AValue);
  176.       end;
  177.   end;
  178. end;
  179.  
  180. function DISetFlag(var AItemData: TRecordItemData; AFlag: integer; AClear: boolean = False): DResult;
  181. begin
  182.   Result := RDATA_SUCCESS;
  183.   if AClear then
  184.     AItemData.Flags := AItemData.Flags and (AFlag xor $FFFF)
  185.   else
  186.     AItemData.Flags := AItemData.Flags or AFlag;
  187. end;
  188.  
  189. function DIGetValue(AItemData: TRecordItemData): string;
  190. begin
  191.   case AItemData.DataType of
  192.     daInteger:
  193.       Result := IntToStr(AItemData.Value);
  194.     daFloat:
  195.       Result := FloatToStr(AItemData.Data);
  196.     daString:
  197.       Result := AItemData.Text;
  198.   end;
  199. end;
  200.  
  201. function DIGetFlag(AItemData: TRecordItemData; AFlag: integer): integer;
  202. begin
  203.   Result := AItemData.Flags and AFlag;
  204. end;
  205.  
  206.  
  207. end.
  208.