我有一个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;
答案 0 :(得分:2)
在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;
答案 1 :(得分:1)
一种解释是OleVariant
包含整个字符串,但您正在查看调试器工具提示。在较旧的Delphi版本中,调试器工具提示截断为变量中保存的字符串的128个字符。请注意,普通string
的调试器工具提示不会截断此长度。尝试在对话框中显示变体,您将看到整个字符串都存在。
我在Delphi 6上检查了这一点,你的代码没有截断(除了调试器工具提示)。 Andreas在Delphi 4上做了同样的事情,而Rodrigo在Delphi 5上做到了这一点。我无法想象Delphi 5 OleVariant
中的字符串被截断为128个字符的情况确实如此。
如果你真的看到你的报告,那么我可以想到以下解释:
答案 2 :(得分:0)
我做了这个工作。总结:而不是用“字符串”填充“OleVariant”;我填写了一个“Variant”,然后将“Variant”改为“OleVariant”。看看下面的代码,这样你就可以理解。
procedure TForm1.Button1Click(Sender: TObject);
var
//X: OleVariant;
X: Variant;
S: string;
begin
//Let's say in the Edit1 I pass a string of 240 chars,
S:= Edit1.Text;
X:= S;
//ShowMessage(IntToStr(Length(X)) + ' : ' + IntToStr(Length(S)));
ShowMessage(IntToStr(Length(OleVariant(X))) + ' : ' + IntToStr(Length(S)));
//This ShowMessage shows "128 : 240"
end;
老实说,我不确定为什么会有所作为,但事实确实如此。它现在可以正常工作。
非常感谢你们的帮助!