string - Delphi 5中的OleVariant和String分配

标签 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;

最佳答案

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/

相关文章:

带有 if 语句的 C++ 字符串变量

使用子句中的 Delphi 条件编译

javascript - 如何获得在嵌入式 Chromium 控件中执行 JavaScript 的结果?

mysql - 如何避免对每个查询重复使用 mysql_real_connect()?

delphi - 使用 CopyFile 函数时出错

delphi - 如何使 TSpeedButton 遵循 Windows 主题?

Delphi "default"关键字与旧 Delphi 版本中的记录类型

Java:如何计算String[]数组中具有两个相同连续字母的单词的分数

python - 从 python 中的单个循环创建多个字符串的一行

c# - 通过 TCP 发送文本字符串?