Delphi 5中的OleVariant和String赋值

时间:2012-03-06 20:46:27

标签: string delphi delphi-5

我有一个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;

3 个答案:

答案 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个字符的情况确实如此。

如果你真的看到你的报告,那么我可以想到以下解释:

  • 您的代码错误地截断了字符串,但您还没有找到执行此操作的代码。只有你可以调试它。
  • 您的Delphi安装中有一个私有的本地错误。您是否有机会编译自己的RTL?

答案 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;

老实说,我不确定为什么会有所作为,但事实确实如此。它现在可以正常工作。

非常感谢你们的帮助!