|
From: <dav...@us...> - 2009-10-14 05:52:20
|
Revision: 876
http://instantobjects.svn.sourceforge.net/instantobjects/revision/?rev=876&view=rev
Author: davidvtaylor
Date: 2009-10-14 05:52:11 +0000 (Wed, 14 Oct 2009)
Log Message:
-----------
* Fix for incorrect Currency values when using TInstantExposer under D2010. This change implements workarounds for Delphi QC 78576 and 78620 for D2010+
Modified Paths:
--------------
trunk/Source/Core/InstantPresentation.pas
Modified: trunk/Source/Core/InstantPresentation.pas
===================================================================
--- trunk/Source/Core/InstantPresentation.pas 2009-10-12 20:19:53 UTC (rev 875)
+++ trunk/Source/Core/InstantPresentation.pas 2009-10-14 05:52:11 UTC (rev 876)
@@ -388,6 +388,7 @@
function AllocRecordBuffer: TRecordBuffer; override;
procedure ClearCalcFields(Buffer: TRecordBuffer); override;
procedure FreeRecordBuffer(var Buffer: TRecordBuffer); override;
+ function FieldDataSize(Field : TField): integer; {$IFDEF SUPPORTS_INLINE} inline; {$ENDIF}
procedure GetBookmarkData(Buffer: TRecordBuffer; Data: Pointer); override;
function GetBookmarkFlag(Buffer: TRecordBuffer): TBookmarkFlag; override;
function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode;
@@ -2423,7 +2424,7 @@
if not (IsBlobField(Fields[I]) or IsCalcField(Fields[I])) then
begin
SaveFieldValue(Fields[I], @Buffer[Offset], AObject);
- Inc(Offset, Fields[I].DataSize);
+ Inc(Offset, FieldDataSize(Fields[I]));
end;
end;
end;
@@ -2447,7 +2448,7 @@
begin
LoadFieldParams(AObject, Fields[I]);
LoadFieldValue(Fields[I], @Buffer[Offset], AObject);
- Inc(Offset, Fields[I].DataSize);
+ Inc(Offset, FieldDataSize(Fields[I]));
end;
end;
GetBookmarkData(Buffer, @BM);
@@ -2534,7 +2535,7 @@
Result := 0;
for I := 0 to Pred(FieldCount) do
if not (IsBlobField(Fields[I]) or IsCalcField(Fields[I])) then
- Inc(Result, Fields[I].DataSize);
+ Inc(Result, FieldDataSize(Fields[I]));
end;
procedure TInstantCustomExposer.DeleteObject(Index: Integer);
@@ -2672,6 +2673,25 @@
Buffer := nil;
end;
+function TInstantCustomExposer.FieldDataSize(Field : TField): integer;
+begin
+{$IFDEF D14+}
+ // Workaround for DataSize bugs in D2010 RTM (QC 78620 and 78620)
+ if (not Assigned(Field)) or (Field is TBlobField) then
+ Result := 0
+ else
+ if Field is TBCDField then
+ Result := SizeOf(TBcd) // D2010 returns Sizeof(System.Currency)
+ else
+ Result := Field.DataSize;
+{$ELSE}
+ if Assigned(Field) then
+ Result := Field.DataSize
+ else
+ Result := 0;
+{$ENDIF}
+end;
+
function TInstantCustomExposer.GetAccessor: TInstantAccessor;
begin
if not Assigned(FAccessor) then
@@ -2759,7 +2779,7 @@
D: TDateTimeRec;
begin
if Assigned(Buffer) then
- Move(CurrentBuffer[GetFieldOffset(Field)], Buffer^, Field.DataSize);
+ Move(CurrentBuffer[GetFieldOffset(Field)], Buffer^, FieldDataSize(Field));
// Show null dates as blanks
if (Field is TDateTimeField) and Assigned(Buffer) then
begin
@@ -2780,7 +2800,7 @@
Result := 0;
for I := 0 to Pred(Field.Index) do
if not (IsBlobField(Fields[I]) or IsCalcField(Fields[I])) then
- Inc(Result, Fields[I].DataSize);
+ Inc(Result, FieldDataSize(Fields[I]));
end;
end;
@@ -3610,13 +3630,13 @@
case Field.DataType of
ftString:
begin
- FillChar(Buffer^, Field.DataSize, 0);
+ FillChar(Buffer^, FieldDataSize(Field), 0);
if not Empty then
begin
S := AnsiString(Value);
Len := Length(S);
- if Len >= Field.DataSize then
- Len := Pred(Field.DataSize);
+ if Len >= FieldDataSize(Field) then
+ Len := Pred(FieldDataSize(Field));
if Len > 0 then
Move(S[1], Buffer^, Len);
end;
@@ -3648,14 +3668,14 @@
if Empty or (Value = 0) then
D.Date := 0 else
D.Date := Value + DateDelta;
- Move(D, Buffer^, Field.DataSize);
+ Move(D, Buffer^, FieldDataSize(Field));
end;
ftTime:
begin
if Empty or (Value = 0) then
D.Time := 0 else
D.Time := Value * MSecsPerDay;
- Move(D, Buffer^, Field.DataSize);
+ Move(D, Buffer^, FieldDataSize(Field));
end;
ftDateTime:
begin
@@ -3665,7 +3685,7 @@
T := DateTimeToTimeStamp(Value);
D.DateTime := TimeStampToMSecs(T);
end;
- Move(D, Buffer^, Field.DataSize);
+ Move(D, Buffer^, FieldDataSize(Field));
end;
ftBoolean:
begin
@@ -3999,7 +4019,7 @@
case Field.DataType of
ftString:
begin
- P := {$IFDEF UNICODE}AnsiStrAlloc{$ELSE}StrAlloc{$ENDIF}(Field.DataSize);
+ P := {$IFDEF UNICODE}AnsiStrAlloc{$ELSE}StrAlloc{$ENDIF}(FieldDataSize(Field));
try
StrCopy(P, Buffer);
S := P;
@@ -4027,7 +4047,7 @@
end;
ftDate:
begin
- Move(Buffer^, D, Field.DataSize);
+ Move(Buffer^, D, FieldDataSize(Field));
if D.Date = 0 then
Value := 0
else
@@ -4035,12 +4055,12 @@
end;
ftTime:
begin
- Move(Buffer^, D, Field.DataSize);
+ Move(Buffer^, D, FieldDataSize(Field));
Value := D.Time / MSecsPerDay;
end;
ftDateTime:
begin
- Move(Buffer^, D, Field.DataSize);
+ Move(Buffer^, D, FieldDataSize(Field));
if (D.Date = 0) and (D.Time = 0) then
Value := 0
else begin
@@ -4114,9 +4134,9 @@
procedure TInstantCustomExposer.SetFieldData(Field: TField; Buffer: Pointer);
begin
if Assigned(Buffer) then
- Move(Buffer^, CurrentBuffer[GetFieldOffset(Field)], Field.DataSize)
+ Move(Buffer^, CurrentBuffer[GetFieldOffset(Field)], FieldDataSize(Field))
else
- FillChar(CurrentBuffer[GetFieldOffset(Field)], Field.DataSize, 0);
+ FillChar(CurrentBuffer[GetFieldOffset(Field)], FieldDataSize(Field), 0);
if not (State in [dsCalcFields, dsInternalCalc, dsFilter, dsNewValue]) and
not FInSetFieldData then
begin
|