我正在编写一个将宽字符串保存到二进制文件的类.我正在使用Delphi 2005,但该应用程序稍后将被移植到Delphi 2010.我在这里感到非常不确定,有人可以确认:
德尔福2005年WideString是完全相同的同类型作为德尔福2010String
Delphi 2005 WideStringchar和Delphi 2010 Stringchar保证总是 2字节大小.
有了所有的Unicode格式,我不希望被我的字符串中的一个字符突然变为3字节宽或类似的东西.
编辑:发现这个:"我确实说过UnicodeString,而不是WideString.WideString仍然存在,并且没有变化.WideString由Windows内存管理器分配,应该用于与COM对象交互.WideString直接映射到COM中的BSTR类型".在http://www.micro-isv.asia/2008/08/get-ready-for-delphi-2009-and-unicode/
现在我更加困惑.那么Delphi 2010 WideString与Delphi 2005不一样WideString?我应该用UnicodeString吗?
编辑2:UnicodeString Delphi 2005中没有类型.FML.
目前我还没有在我的主项目中为Delphi DCU设置任何特定的输出目录.这导致DCU文件最终与我的.pas源文件位于同一目录中.对我来说,这感觉很难看,因为我不喜欢将.pas和.dcu文件混合在同一目录中.存储Delphi .dcu文件的最佳实践是什么 - 将它们保存在每个项目的一个目录中?或者也许为每个源文件夹创建一个DCU目录?欢迎任何想法.
好吧,所以我有一个我们称之为的基类TFruit.从这里有各种各样的后代TApple,TOrange等等.我需要将后代类的属性保存到文件中.
为了能够在加载数据时创建正确的类,每个类都需要ID在写入实际数据之前写入文件.目前,我已经提出了以下方法:
type
TFruit = class
const ID = 0;
end;
TApple = class(TFruit)
const ID = 1;
end;
TOrange = class(TFruit)
const ID = 2;
end;
Run Code Online (Sandbox Code Playgroud)
测试这个,我发现我需要非常小心我宣布哪个类.如果我用这个:
var Fruit: TFruit;
Fruit := TOrange.Create;
Run Code Online (Sandbox Code Playgroud)
...然后Fruit.ID将返回零.然而,声明Fruit作为一个TOrange意志会产生预期的结果Fruit.ID = 2(任何人都知道为什么?)
所以基本上,我这样做是对还是有更好的方法呢?通过比较(额外的函数声明,实现和代码),必须创建一个类函数并从那里返回一个值似乎非常难看.
在Delphi中,给出以下内容:
TFruit = class;
TFruitClass = class of TFruit;
TApple = class(TFruit);
TRedApple = class(TApple);
Run Code Online (Sandbox Code Playgroud)
如果我有一个TFruitClass变量,我怎么能知道它是否继承TApple?比如说我有
var
FruitClass: TFruitClass;
...
FruitClass := TRedApple;
Run Code Online (Sandbox Code Playgroud)
TApple在这种情况下,如何验证FruitClass是否确实继承了?使用FruitClass is TApple只适用于类实例.
好的,所以你有一个TObjectList实例.您想循环遍历其中的项目并从列表中删除一些对象.你不能这样做:
for I := 0 to ObjectList.Count - 1 do
if TMyClass(ObjectList[I]).ShouldRemove then
ObjectList.Delete(I);
Run Code Online (Sandbox Code Playgroud)
...因为一旦删除第一个对象,索引计数器就会出错,循环将不再起作用.
所以这是我的解决方案:
Again:
for I := 0 to ObjectList.Count - 1 do
if TMyClass(ObjectList[I]).ShouldRemove then
begin
ObjectList.Delete(I);
goto Again;
end;
Run Code Online (Sandbox Code Playgroud)
这是迄今为止我发现的最佳解决方案.如果有人有一个更整洁的解决方案,我很乐意看到它.
Delphi中对枚举类型中的项目数有限制吗?我需要创建一个可能有几百个项目的枚举类型,并且要确保例如255个项目没有限制.
type
TMyType = (mtOne, mtTwo, mtThree, ..., mtThreeHundred);
Run Code Online (Sandbox Code Playgroud)