我有一箇舊的程序在Delphi 1(或2,我不知道)編程,我想建立它的64位版本(我使用Delphi XE2)。現在的問題是,在源代碼中,一方面是字符串和其他字符串數組(我想限制字符串長度)。 由於不兼容的類型,編譯時會出現很多錯誤。 最重要的是有處理這兩種類型的程序。 有沒有簡單的方法來解決這個問題(不改變每個變量)?德爾菲弦/字符串數組
回答
簡短的回答
搜索和替換: 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字符。
(*)過於簡單化
- 1. 德爾菲指針,數組,手柄
- 2. 德爾菲跳動
- 3. 德爾菲字符串來處理類型鑄造
- 4. 布朗菲爾德vs格林菲爾德發展?
- 5. 一些德爾菲錯誤
- 6. 德爾菲陣列的TEdit
- 7. 德爾菲Maxmind geoip查詢
- 8. 德爾菲表加入
- 9. 德爾菲擊中輸入
- 10. 德爾菲隊列和同步參數
- 11. JAXB馬歇爾菲爾德與屬性
- 12. 德爾福,複製字符串到字節數組
- 13. 德爾福 - 數組[0..693]字節 - 到B64編碼字符串
- 14. 德爾福 - 字節數組到字符串
- 15. 德爾福 - 重新拆分字符串數組?
- 16. 德爾菲棱鏡的例子
- 17. 德爾菲通用約束問題
- 18. 火鳥v 2.5和德爾菲掛
- 19. 德爾菲+網絡攝像頭
- 20. 德爾菲幀銷燬/隱藏
- 21. 德爾菲7定時器復位
- 22. 德爾菲標籤值排序
- 23. 比特菲爾德與3個國家...?
- 24. 簡單的德爾菲TTimer程序
- 25. 德爾菲法簽名轉換成C#
- 26. 添加德爾福字符串
- 27. 德爾福ListView字符串在大膽
- 28. 德爾福TJson.ObjectToJsonString(TFoo):從JSON字符串
- 29. 德爾福字符串共享問題
- 30. 德爾福 - 通過字符串循環
顯示你的代碼和錯誤。 –
我猜這些不是數組的字符串,而是像這樣聲明的短字符串:'s:string [10]' - 但向我們展示一些代碼全部相同 –
'..有沒有簡單的方法來解決這個問題而不會改變每個變量)。與字符串和舊的delphi應用程序相關的主要問題是在delphi 2009中添加了unicode支持,所以你必須關注這一點,也不可能給你一個簡單的方法來升級舊的在不知道實際代碼的情況下應用於Unicode(新版本的Delphi)。現在,處理轉換爲Unicode的最佳方式是瞭解如何在Delphi中實現Unicode支持,一個很好的資源是「Delphi和Unicode」白皮書http://edn.embarcadero.com/article/38980 – RRUZ