Forum > Database
TStringsDataset, help needed
jc99:
First I needed the Ds to update when the SL is updated
So:
--- Code: --- Published
{ Published-Deklarationen }
PROPERTY Source: TStrings Read FStrings Write SetStrings;
procedure TStringsDataSet.SetStrings(AValue: TStrings);
begin
if FStrings=AValue then Exit;
FStrings:=AValue;
if Fstrings.InheritsFrom(TStringList) then
TStringList(FStrings).OnChange:=StringListOnChange;
end;
--- End code ---
Then DBGrid should work properly:
Thanks to your suggestion i updated:
--- Code: --- Private
{ Private-Deklarationen }
FStrings: TStrings;
Fopened: Boolean;
FCurrendDS :integer;
FChanging : boolean;
[...]
function TStringsDataSet.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
DoCheck: Boolean): TGetResult;
BEGIN
Result:=grOk;
case GetMode of
gmCurrent:
if (FCurrendDS>=1) or (FCurrendDS<0) then
Result:=grError;
gmNext:
if (FCurrendDS<0) then
Inc(FCurrendDS)
else
Result:=grEOF;
gmPrior:
if (FCurrendDS>0) then
Dec(FCurrendDS)
else
result:=grBOF;
end;
END;
procedure TStringsDataSet.InternalFirst;
begin
FCurrendDS:=0;
end;
[...]
procedure TStringsDataSet.InternalOpen;
BEGIN
//
internalinitFielddefs;
CreateFields;
FCurrendDS:=-1;
END;
[...]
procedure TStringsDataSet.SetFieldData(Field: TField; Buffer: Pointer);
begin
// FStrings.Values[Field.FieldName]:=Field.value;
FChanging := true;
try
inherited SetFieldData(Field, Buffer);
if assigned(Buffer) then
case Field.DataType of
ftBoolean:FStrings.Values[Field.FieldName]:=BoolToStr( wordbool(Buffer^),true);
ftFloat: FStrings.Values[Field.FieldName]:=FloatToStr( double(Buffer^));
ftInteger: FStrings.Values[Field.FieldName]:=IntToStr( longint(Buffer^));
ftstring:FStrings.Values[Field.FieldName]:= PChar( Buffer);
end;
finally
Fchanging:= false;
end;
end;
procedure TStringsDataSet.StringListOnChange(Sender: Tobject);
begin
try
if not FChanging then
Refresh;
except
end;
end;
--- End code ---
I Hope i didn't forget something
... maybe more comes later
I know i have to do a saver String to XXX - Conversion.
after the post everything seems to work,
but when editing i have a small update-problem.
jc99:
Solved the Update-Problem & did a saver string to anything conversion
--- Code: ---function TStringsDataSet.GetFieldData(Field: TField; Buffer: Pointer): Boolean;
var
aStr:string;
lInteger: integer;
lBool: Boolean;
lFloat: Double;
begin
if assigned(Buffer) then
begin
case Field.DataType of
ftBoolean:
if TryStrToBool(FStrings.Values[Field.FieldName],lBool) then
wordbool(Buffer^):= lBool;
ftinteger:if TryStrToint(FStrings.Values[Field.FieldName],lInteger) then
LongInt(Buffer^):= lInteger;
ftFloat:if TryStrToFloat(FStrings.Values[Field.FieldName],lFloat,FFs) then
double(Buffer^):=lFloat;
ftString:begin
aStr := FStrings.Values[Field.FieldName];
if length(astr) > 0 then
move(aStr[1],Buffer^,length(aStr)+1)
else
byte(Buffer^):=0;
end;
end;
result := true;
end;
end;
procedure TStringsDataSet.SetFieldData(Field: TField; Buffer: Pointer);
begin
// FStrings.Values[Field.FieldName]:=Field.value;
FChanging := true;
try
inherited SetFieldData(Field, Buffer);
if assigned(Buffer) then
case Field.DataType of
ftBoolean:FStrings.Values[Field.FieldName]:=BoolToStr( wordbool(Buffer^),true);
ftFloat: FStrings.Values[Field.FieldName]:=FloatToStr( double(Buffer^),Ffs);
ftInteger: FStrings.Values[Field.FieldName]:=IntToStr( longint(Buffer^));
ftstring:FStrings.Values[Field.FieldName]:= PChar( Buffer);
end;
finally
Fchanging:= false;
end;
if not (State in [dsCalcFields, dsFilter, dsNewValue]) then
DataEvent(deFieldChange, PtrInt(Field));
end;
--- End code ---
Navigation
[0] Message Index
[*] Previous page