From: Nando D. <na...@us...> - 2005-04-08 09:58:17
|
Update of /cvsroot/instantobjects/Source/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25237/Core Modified Files: InstantPresentation.pas Log Message: Fixed bug #1179102 (buffer trashing with calculated fields) Index: InstantPresentation.pas =================================================================== RCS file: /cvsroot/instantobjects/Source/Core/InstantPresentation.pas,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** InstantPresentation.pas 7 Apr 2005 11:33:15 -0000 1.13 --- InstantPresentation.pas 8 Apr 2005 09:58:09 -0000 1.14 *************** *** 378,381 **** --- 378,382 ---- property ObjectClassName: string read GetObjectClassName write SetObjectClassName stored HasObjectClassName; property Subject: TObject read GetSubject; + function GetFieldOffset(const Field: TField): Integer; public constructor Create(AOwner: TComponent); override; *************** *** 1858,1863 **** for I := 0 to Pred(FieldCount) do begin ! SaveFieldValue(Fields[I], @Buffer[Offset], AObject); ! Inc(Offset, Fields[I].DataSize); end; end; --- 1859,1867 ---- for I := 0 to Pred(FieldCount) do begin ! if not IsCalcField(Fields[I]) then ! begin ! SaveFieldValue(Fields[I], @Buffer[Offset], AObject); ! Inc(Offset, Fields[I].DataSize); ! end; end; end; *************** *** 1878,1884 **** for I := 0 to Pred(FieldCount) do begin ! LoadFieldParams(AObject, Fields[I]); ! LoadFieldValue(Fields[I], @Buffer[Offset], AObject); ! Inc(Offset, Fields[I].DataSize); end; GetBookmarkData(Buffer, @BM); --- 1882,1891 ---- for I := 0 to Pred(FieldCount) do begin ! if not IsCalcField(Fields[I]) then ! begin ! LoadFieldParams(AObject, Fields[I]); ! LoadFieldValue(Fields[I], @Buffer[Offset], AObject); ! Inc(Offset, Fields[I].DataSize); ! end; end; GetBookmarkData(Buffer, @BM); *************** *** 1966,1970 **** Result := 0; for I := 0 to Pred(FieldCount) do ! if not Fields[I].Calculated then Inc(Result, Fields[I].DataSize); end; --- 1973,1977 ---- Result := 0; for I := 0 to Pred(FieldCount) do ! if not IsCalcField(Fields[I]) then Inc(Result, Fields[I].DataSize); end; *************** *** 2175,2189 **** Buffer: Pointer): Boolean; var - I, Ofs: Integer; D: TDateTimeRec; begin - Ofs := 0; - for I := 0 to Pred(Field.Index) do - Inc(Ofs, Fields[I].DataSize); if Assigned(Buffer) then ! Move(CurrentBuffer[Ofs], Buffer^, Field.DataSize); if (Field is TDateTimeField) and Assigned(Buffer) then begin - { Show null dates as blanks } D := TDateTimeRec(Buffer^); Result := (D.Date <> 0) and (D.Time <> 0); --- 2182,2192 ---- Buffer: Pointer): Boolean; var D: TDateTimeRec; begin if Assigned(Buffer) then ! Move(CurrentBuffer[GetFieldOffset(Field)], Buffer^, Field.DataSize); ! // Show null dates as blanks if (Field is TDateTimeField) and Assigned(Buffer) then begin D := TDateTimeRec(Buffer^); Result := (D.Date <> 0) and (D.Time <> 0); *************** *** 2192,2195 **** --- 2195,2213 ---- end; + function TInstantCustomExposer.GetFieldOffset(const Field: TField): Integer; + var + I: Integer; + begin + if Field.FieldNo < 0 then + Result := RecordSize + Field.Offset + else + begin + Result := 0; + for I := 0 to Pred(Field.Index) do + if not IsCalcField(Fields[I]) then + Inc(Result, Fields[I].DataSize); + end; + end; + function TInstantCustomExposer.GetFieldStrings(Field: TField; Strings: TStrings): Integer; *************** *** 2487,2491 **** else if Field.DataType = ftBCD then begin ! (Field as TBCDField).currency := True; end; if Assigned(FOnInitField) then --- 2505,2509 ---- else if Field.DataType = ftBCD then begin ! (Field as TBCDField).Currency := True; end; if Assigned(FOnInitField) then *************** *** 3239,3249 **** procedure TInstantCustomExposer.SaveField(Field: TField); - var - I, Offset: Integer; begin ! Offset := 0; ! for I := 0 to Pred(Field.Index) do ! Inc(Offset, Fields[I].DataSize); ! SaveFieldValue(Field, @CurrentBuffer[Offset], CurrentObject); end; --- 3257,3262 ---- procedure TInstantCustomExposer.SaveField(Field: TField); begin ! SaveFieldValue(Field, @CurrentBuffer[GetFieldOffset(Field)], CurrentObject); end; *************** *** 3361,3376 **** end; ! procedure TInstantCustomExposer.SetFieldData(Field: TField; ! Buffer: Pointer); ! var ! I, Ofs: Integer; begin - Ofs := 0; - for I := 0 to Pred(Field.Index) do - Inc(Ofs, Fields[I].DataSize); if Assigned(Buffer) then ! Move(Buffer^, CurrentBuffer[Ofs], Field.DataSize) else ! FillChar(CurrentBuffer[Ofs], Field.DataSize, 0); if not (State in [dsCalcFields, dsInternalCalc, dsFilter, dsNewValue]) then begin --- 3374,3383 ---- end; ! procedure TInstantCustomExposer.SetFieldData(Field: TField; Buffer: Pointer); begin if Assigned(Buffer) then ! Move(Buffer^, CurrentBuffer[GetFieldOffset(Field)], Field.DataSize) else ! FillChar(CurrentBuffer[GetFieldOffset(Field)], Field.DataSize, 0); if not (State in [dsCalcFields, dsInternalCalc, dsFilter, dsNewValue]) then begin |