2011-10-13 34 views
2

我有一箇舊的程序在Delphi 1(或2,我不知道)編程,我想建立它的64位版本(我使用Delphi XE2)。現在的問題是,在源代碼中,一方面是字符串和其他字符串數組(我想限制字符串長度)。 由於不兼容的類型,編譯時會出現很多錯誤。 最重要的是有處理這兩種類型的程序。 有沒有簡單的方法來解決這個問題(不改變每個變量)?德爾菲弦/字符串數組

+5

顯示你的代碼和錯誤。 –

+0

我猜這些不是數組的字符串,而是像這樣聲明的短字符串:'s:string [10]' - 但向我們展示一些代碼全部相同 –

+2

'..有沒有簡單的方法來解決這個問題而不會改變每個變量)。與字符串和舊的delphi應用程序相關的主要問題是在delphi 2009中添加了unicode支持,所以你必須關注這一點,也不可能給你一個簡單的方法來升級舊的在不知道實際代碼的情況下應用於Unicode(新版本的Delphi)。現在,處理轉換爲Unicode的最佳方式是瞭解如何在Delphi中實現Unicode支持,一個很好的資源是「Delphi和Unicode」白皮書http://edn.embarcadero.com/article/38980 – RRUZ

回答

3

簡短的回答
搜索和替換: string =>: ansistring
確保您使用length(astring)setLength(astring),而不是操縱string[0]

龍答案

Delphi 1中只有一個字符串類型。
最大長度爲255個字符並聲明最大長度的old-skool ShortString。

它看起來和感覺像一個char數組,但它有一個前導長度字節。在Delphi 2個longstrings(又名AnsiString類型)引入

var 
    ShortString: string[100]; 

,這些取代ShortString短。它們沒有固定長度,而是動態分配,並根據需要自動增長和縮小。
它們被自動創建並銷燬。

var 
    Longstring: string; //AnsiString, can have any length up to 2GB. 

在Delphi 2009中引入了Unicode。
這改變了長字符串,因爲現在每個char no langer佔用1個字節,但佔用2個字節(*)。 此外,您可以指定一個字符集爲AnsiString,而新的Unicode長字符串使用UTF-16。

你需要做什麼取決於你的需要:

如果你只是想舊代碼與以前一樣工作,你不關心,支持所有的多語種東西的Unicode支持,你將需要全部更換您的string關鍵字與AnsiString(適用於所有長串的字符串)。
如果您有Delphi 1代碼,則可以將string重命名爲ShortString
雖然我建議您重構代碼以始終使用longstrings(閱讀:AnsiString)。

Delphi會自動把這一功能(Unicode字符串)所有的返回值被翻譯成AnsiStrings,反之亦然的UnicodeStrings,然而,這可能包括數據丟失,如果您的用戶在編輯框中,你AnsiString類型不能存儲輸入符號。
此外,所有的翻譯需要一點時間(我懷疑你會注意到這一點雖然)。

在德爾福1到德爾福2007年這個問題並不存在,因爲控件不允許輸入Unicode字符。

(*)過於簡單化