Forum > Database

TStringsDataset, help needed

<< < (3/3)

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

Go to full version