2012-03-06 56 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;