我有一个Delphi 5旧版应用程序,并且其中有一个部分将“字符串”值分配给“ OleVariant”变量。像这样:
var
X: OleVariant;
S: string;
Begin
S:= ‘This string should contain 200 characters as per design’;
X:= S;
End;
如果“ S”的长度大于128,则“ X”的值将被截断,并且最多只能容纳128个字符。
有办法克服吗?
我相信这是有办法的,因为如果我从头开始创建自己的演示应用程序(在同一台PC上,使用相同的Delphi 5),它将允许我传递更长的字符串值,并且不会进行任何截断。
也许与项目设置或编译器指令有关。我已经考虑过这个想法,但是还没有解决方法。
任何帮助表示赞赏。谢谢。
演示:
procedure TForm1.Button1Click(Sender: TObject);
var
X: OleVariant;
S: string;
begin
//in the Edit I pass a string of 240 chars, let's say;
S:= Edit1.Text;
X:= S;
ShowMessage(IntToStr(Length(X)) + ' : ' + IntToStr(Length(S)));
//this showmessage shows "128 : 240"
end;
最佳答案
在http://www.foxbase.ru/delphi/vzaimnye-preobrazovaniya-olevariant-i-string.htm处尝试此OleVariantToString和StringToOleVariant函数
他们为我完美地工作。
uses Classes, Variants;
function OleVariantToString(const Value: OleVariant): string;
var ss: TStringStream;
Size: integer;
Data: PByteArray;
begin
Result:='';
if Length(Value) = 0 then Exit;
ss:=TStringStream.Create;
try
Size := VarArrayHighBound (Value, 1) - VarArrayLowBound(Value, 1) + 1;
Data := VarArrayLock(Value);
try
ss.Position := 0;
ss.WriteBuffer(Data^, Size);
ss.Position := 0;
Result:=ss.DataString;
finally
VarArrayUnlock(Value);
end;
finally
ss.Free;
end;
end;
function StringToOleVariant(const Value: string): OleVariant;
var Data: PByteArray;
ss: TStringStream;
begin
Result:=null;
if Value='' then Exit;
ss:=TStringStream.Create(Value);
try
Result := VarArrayCreate ([0, ss.Size - 1], varByte);
Data := VarArrayLock(Result);
try
ss.Position := 0;
ss.ReadBuffer(Data^, ss.Size);
finally
VarArrayUnlock(Result);
end;
finally
ss.Free;
end;
end;
关于string - Delphi 5中的OleVariant和String分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9591613/