This is something for the DB-Gurus:
I am working on a TDataset -Descendent that stores the information in a TStrings-Component.
at the moment, it looks like this:
UNIT Cmp_TStringsDataSet;
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
INTERFACE
USES
{$IFnDEF FPC}
DSIntf,
{$ELSE}
{$ENDIF}
SysUtils, Classes, DB;
TYPE
{ TStringsDataSet }
TStringsDataSet = CLASS(TDataSet)
Private
{ Private-Deklarationen }
FStrings: TStrings;
Fopened: Boolean;
Protected
{ Protected-Deklarationen }
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: Boolean): TGetResult; Override;
procedure InternalFirst; override;
PROCEDURE InternalClose; Override;
PROCEDURE InternalHandleException; Override;
PROCEDURE InternalInitFieldDefs; Override;
PROCEDURE InternalOpen; Override;
FUNCTION IsCursorOpen: Boolean; Override;
function GetFieldData(Field: TField; Buffer: Pointer): Boolean; Override;
procedure SetFieldData(Field: TField; Buffer: Pointer); Override;
// Optional.
function GetRecordCount: Integer; override;
Public
{ Public-Deklarationen }
Published
{ Published-Deklarationen }
PROPERTY Source: TStrings Read FStrings Write FStrings;
END;
PROCEDURE Register;
IMPLEMENTATION
USES variants;
PROCEDURE Register;
BEGIN
RegisterComponents('Data Access', [TStringsDataSet]);
END;
function TStringsDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
DoCheck: Boolean): TGetResult;
BEGIN
//
result := grEOF;
END;
procedure TStringsDataSet.InternalFirst;
begin
//
end;
procedure TStringsDataSet.InternalClose;
BEGIN
//
END;
procedure TStringsDataSet.InternalHandleException;
BEGIN
//
END;
procedure TStringsDataSet.InternalInitFieldDefs;
VAR
I: Integer;
Fieldnm: ansistring;
Val: Variant;
f: TField;
n: integer;
r: Extended;
FieldID: Integer;
{$IFNDEF FPC}
FldDesc: DSFLDDesc;
{$ENDIF}
iFldType: TFieldType;
iFldSize: Integer;
BEGIN
//
FieldDefs.Clear;
FOR I := 0 TO Fstrings.Count - 1 DO
try
Fieldnm := fstrings.Names[i];
val := FStrings.ValueFromIndex[i];
// WITH FldDesc DO
try
// strcopy(pansiChar(@szName) , @fieldnm[1]);
IF (lowercase(val) = 'true') OR (Lowercase(val) = 'false') THEN
BEGIN
// Boolean field;
iFldType := ftBoolean;
iFldSize := 0;
// iFldSubType := fldstBINARY;
END
ELSE IF TryStrToInt(val, n) THEN
begin
iFldType := ftInteger;
iFldSize := 0;
// iFldSubType := fldstBINARY;
END
ELSE IF TryStrToFloat(val, r) THEN
BEGIN
iFldType := ftFloat ;
iFldSize := 0;
// iFldSubType := fldstBINARY;
END
ELSE
BEGIN
iFldType:= ftString;
iFldSize := 100;
END;
finally
END;
{$IFNDEF FPC}
AddFieldDesc(fldDesc, i,Fielddefs);
{$ELSE}
TFieldDef.Create(FieldDefs,Fieldnm,iFldType,iFldSize,false,I+1);
{$ENDIF}
finally
END;
Fopened := true;
END;
procedure TStringsDataSet.InternalOpen;
BEGIN
//
internalinitFielddefs;
CreateFields;
END;
function TStringsDataSet.IsCursorOpen: Boolean;
BEGIN
//
result := Fopened;
END;
function TStringsDataSet.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
var
I: Integer;
aStr:string;
begin
I:= Field.FieldNo - 1;
if assigned(Buffer) then // [EDIT2]
begin
case Field.DataType of
ftBoolean:wordbool(Buffer^):=StrToBool(FStrings.Values[Field.FieldName]);
ftinteger:LongInt(Buffer^):=25; // Todo:
ftFloat:double(Buffer^):=pi; // Todo:
ftString:begin
aStr := FStrings.Values[Field.FieldName];
move(aStr[1],Buffer^,length(aStr)+1);
end;
end;
result := true; // <-------
end;
end;
procedure TStringsDataSet.SetFieldData(Field: TField; Buffer: Pointer);
begin
// FStrings.Values[Field.FieldName]:=Field.value;
inherited SetFieldData(Field, Buffer);
if assigned(Buffer) then
case Field.DataType of
ftBoolean:FStrings.Values[Field.FieldName]:=BoolToStr( wordbool(Buffer^),true);
// [EDIT]:
ftFloat: FStrings.Values[Field.FieldName]:=FloatToStr( double(Buffer^));
ftInteger: FStrings.Values[Field.FieldName]:=IntToStr( integer(Buffer^));
ftstring:FStrings.Values[Field.FieldName]:= PChar( Buffer);
end;
end;
function TStringsDataSet.GetRecordCount: Integer;
begin
Result:=inherited GetRecordCount;
end;
END.
It Works, that i can enter text, and set the Boolean , Both are written in the TString ,
But nothing comes out.
Here I need help.
I think the problem lies in the
TStringsDataSet.GetFieldData - Function
Any help is welcome.