DataConvert Method in dataset.inc Not Correct for WinCE
Original Reporter info from Mantis: TimYoung
-
Reporter name: Tim Young
Original Reporter info from Mantis: TimYoung
- Reporter name: Tim Young
Description:
The DataConvert method in the dataset.inc include file does not include proper wrappers for unaligned variable access to the de-referenced pointers, causing a bus alignment error under Windows CE/Mobile.
Steps to reproduce:
Corrected code with IFDEFs for WinCE:
procedure TDataSet.DataConvert(aField: TField; aSource, aDest: Pointer;
aToNative: Boolean);
// There seems to be no WStrCopy defined, this is a copy of
// the generic StrCopy function, adapted for WideChar.
Function WStrCopy(Dest, Source:PWideChar): PWideChar;
var
counter : SizeInt;
Begin
counter := 0;
while Source[counter] <> #0 do
begin
Dest[counter] := char(Source[counter]);
Inc(counter);
end;
{ terminate the string }
Dest[counter] := #0;
WStrCopy := Dest;
end;
var
DT : TFieldType;
begin
DT := aField.DataType;
if aToNative then
begin
case DT of
{$IFDEF WINCE}
ftDate, ftTime, ftDateTime: unaligned(TDateTimeRec(aDest^)) := DateTimeToDateTimeRec(DT, unaligned(TDateTime(aSource^)));
ftTimeStamp : unaligned(TTimeStamp(aDest^)) := unaligned(TTimeStamp(aSource^));
ftBCD : unaligned(TBCD(aDest^)) := CurrToBCD(unaligned(Currency(aSource^)));
ftFMTBCD : unaligned(TBcd(aDest^)) := unaligned(TBcd(aSource^));
{$ELSE}
ftDate, ftTime, ftDateTime: TDateTimeRec(aDest^) := DateTimeToDateTimeRec(DT, TDateTime(aSource^));
ftTimeStamp : TTimeStamp(aDest^) := TTimeStamp(aSource^);
ftBCD : TBCD(aDest^) := CurrToBCD(Currency(aSource^));
ftFMTBCD : TBcd(aDest^) := TBcd(aSource^);
{$ENDIF}
// See notes from mantis bug-report 8204 for more information
// ftBytes : ;
// ftVarBytes : ;
ftWideString : WStrCopy(PWideChar(aDest), PWideChar(aSource));
end
end
else
begin
case DT of
{$IFDEF WINCE}
ftDate, ftTime, ftDateTime: unaligned(TDateTime(aDest^)) := DateTimeRecToDateTime(DT, unaligned(TDateTimeRec(aSource^)));
ftTimeStamp : unaligned(TTimeStamp(aDest^)) := unaligned(TTimeStamp(aSource^));
ftBCD : BCDToCurr(unaligned(TBCD(aSource^)),unaligned(Currency(aDest^)));
ftFMTBCD : unaligned(TBcd(aDest^)) := unaligned(TBcd(aSource^));
{$ELSE}
ftDate, ftTime, ftDateTime: TDateTime(aDest^) := DateTimeRecToDateTime(DT, TDateTimeRec(aSource^));
ftTimeStamp : TTimeStamp(aDest^) := TTimeStamp(aSource^);
ftBCD : BCDToCurr(TBCD(aSource^),Currency(aDest^));
ftFMTBCD : TBcd(aDest^) := TBcd(aSource^);
{$ENDIF}
// ftBytes : ;
// ftVarBytes : ;
ftWideString : WStrCopy(PWideChar(aDest), PWideChar(aSource));
end
end
end;
Mantis conversion info:
- Mantis ID: 16681
- Platform: WinCE
- Version: 2.2.4