2012-03-06 38 views
0

我有一个Delphi 5遗留应用程序,并有一部分“字符串”值已分配给“OleVariant”变量。是这样的:德尔福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

请复制并粘贴* real *代码来演示您声明的内容。我希望有一些代码可以指定一个* actual * 200字符长的字符串变量,还有一些代码可以测量OleVariant值的长度并打印出值128。如果这不是您确定存在问题的方式,那么请描述您做了什么*以得出结论“X”只有128个字符长。 – 2012-03-06 20:49:42

+0

看看描述。我添加了更多的代码。如果您调试并跟踪应用程序(在调试时检查X和S),您也可以注意到问题。 – Yanniel 2012-03-06 21:01:28

+0

我在Delphi 4(Windows 95)中试过这个,并且字符串是* not * truncated。 – 2012-03-06 21:03:47

回答

1

一种解释是,OleVariant包含整个字符串,但你正在寻找的调试工具提示。在较旧的Delphi版本中,调试器工具提示截断了128个字符,用于保存变体中的字符串。请注意,调试器工具提示纯string不截断在此长度。尝试在对话框中显示变体,你会看到整个字符串存在。

我在Delphi 6上检查了这一点,并没有截断你的代码(除了调试器工具提示)。 Andreas在Delphi 4上也做过类似的事情,Rodrigo在Delphi 5中做过这样的事情。我无法想象,事实上Delphi 5中的字符串可能会被截断为128个字符。

如果你真的看到你是什么样的报告,然后我能想到以下的说明:

  • 您的代码错误地截断的字符串,但你还没有发现,确实这个代码。只有你可以调试。
  • 你有一个本地的bug是你的Delphi安装专用的。你有没有机会编译你自己的RTL?
+0

这不是一个“变体”,它是一个“OleVariant”。我确实使用了showmessage,它仍然被截断。注意:在我的情况下,“变体”工作得很好;尽管如此,“OleVariant”失败了。 – Yanniel 2012-03-06 21:04:19

+0

我在我的D6试验中使用'OleVariant'。 – 2012-03-06 21:07:05

+0

伙计们,我感谢你的帮助。我无法透露我遗留应用程序的代码(因为它不属于我)。此外,它包含超过一百万行代码。 – Yanniel 2012-03-06 21:31:38

0

我做了这项工作。总结:而不是用“字符串”填充“OleVariant”;我填写了一个“变体”,然后将“变体”改为“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; 

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

非常感谢您的帮助人员!

+1

这是因为将字符串转换为'OleVariant'会将其转换为'WideString'(COM兼容)。你的一个单位可能会搞乱一个oleaut32'Sysxxx'函数(可能在初始化部分),或者你有一个自定义内存管理器。 – kobik 2012-03-07 19:54:58

2

试试这个OleVariantToStringStringToOleVariant功能在http://www.foxbase.ru/delphi/vzaimnye-preobrazovaniya-olevariant-i-string.htm

他们完全为我工作。

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;