我有一个旧的程序在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