|
@@ -464,9 +464,9 @@ var
|
|
|
begin
|
|
|
FD := FieldDefs.Items[FieldNo-1];
|
|
|
case FD.DataType of
|
|
|
- ftString,
|
|
|
- ftGuid: result:=FD.Size+1;
|
|
|
- ftFixedChar:result:=FD.Size+1;
|
|
|
+ ftString : Result:=FD.Size*FD.CharSize+1;
|
|
|
+ ftGuid: result:=FD.Size+1;
|
|
|
+ ftFixedChar:result:=FD.Size*FD.CharSize+1;
|
|
|
ftBoolean: result:=SizeOf(Wordbool);
|
|
|
ftCurrency,
|
|
|
ftFloat: result:=SizeOf(Double);
|
|
@@ -1037,7 +1037,7 @@ end;
|
|
|
|
|
|
procedure TMemDataset.calcrecordlayout;
|
|
|
var
|
|
|
- i,Count : integer;
|
|
|
+ i,Count,aSize : integer;
|
|
|
begin
|
|
|
Count := FieldDefs.Count;
|
|
|
// Avoid mem-leak if CreateTable is called twice
|
|
@@ -1057,8 +1057,9 @@ begin
|
|
|
for i:= 0 to Count-1 do
|
|
|
begin
|
|
|
GetIntegerPointer(FFieldOffsets, i)^ := FRecSize;
|
|
|
- GetIntegerPointer(FFieldSizes, i)^ := MDSGetBufferSize(i+1);
|
|
|
- FRecSize:= FRecSize+GetIntegerPointer(FFieldSizes, i)^;
|
|
|
+ aSize:=MDSGetBufferSize(i+1);
|
|
|
+ GetIntegerPointer(FFieldSizes, i)^ := aSize;
|
|
|
+ FRecSize:= FRecSize+aSize;
|
|
|
end;
|
|
|
FRecInfoOffset:=FRecSize;
|
|
|
FRecSize:=FRecSize+SizeRecInfo;
|
|
@@ -1220,7 +1221,8 @@ var
|
|
|
AKeyValues: variant;
|
|
|
i: integer;
|
|
|
AField: TField;
|
|
|
- s1,s2: string;
|
|
|
+ s1,s2: UTF8String;
|
|
|
+
|
|
|
begin
|
|
|
Result := false;
|
|
|
SaveState := SetTempState(dsFilter);
|
|
@@ -1259,8 +1261,16 @@ begin
|
|
|
// string fields
|
|
|
if AField.DataType in [ftString, ftFixedChar] then
|
|
|
begin
|
|
|
- s1 := AField.AsString;
|
|
|
- s2 := VarToStr(AKeyValues[i]);
|
|
|
+ if TStringField(AField).CodePage=CP_UTF8 then
|
|
|
+ begin
|
|
|
+ s1 := AField.AsUTF8String;
|
|
|
+ s2 := UTF8Encode(VarToUnicodeStr(AKeyValues[i]));
|
|
|
+ end
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ s1 := AField.AsString;
|
|
|
+ s2 := VarToStr(AKeyValues[i]);
|
|
|
+ end;
|
|
|
if loPartialKey in Options then
|
|
|
s1 := copy(s1, 1, length(s2));
|
|
|
if loCaseInsensitive in Options then
|