小编Dav*_*vid的帖子

Delphi WideString和Delphi 2009+

我正在编写一个将宽字符串保存到二进制文件的类.我正在使用Delphi 2005,但该应用程序稍后将被移植到Delphi 2010.我在这里感到非常不确定,有人可以确认:

  1. 德尔福2005年WideString完全相同的同类型作为德尔福2010String

  2. 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 unicode delphi-2010

13
推荐指数
2
解决办法
5113
查看次数

哪里有Delphi DCU文件?

目前我还没有在我的主项目中为Delphi DCU设置任何特定的输出目录.这导致DCU文件最终与我的.pas源文件位于同一目录中.对我来说,这感觉很难看,因为我不喜欢将.pas和.dcu文件混合在同一目录中.存储Delphi .dcu文件的最佳实践是什么 - 将它们保存在每个项目的一个目录中?或者也许为每个源文件夹创建一个DCU目录?欢迎任何想法.

delphi dcu

9
推荐指数
1
解决办法
5410
查看次数

需要将唯一的整数值与类相关联

好吧,所以我有一个我们称之为的基类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 oop inheritance

5
推荐指数
1
解决办法
616
查看次数

找出Delphi ClassType是否继承自其他ClassType?

在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只适用于类实例.

delphi inheritance

5
推荐指数
1
解决办法
2586
查看次数

德尔福:在这种情况下,Goto不被视为有害吗?

好的,所以你有一个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 goto

4
推荐指数
2
解决办法
672
查看次数

枚举类型:限制项目数量?

Delphi中对枚举类型中的项目数有限制吗?我需要创建一个可能有几百个项目的枚举类型,并且要确保例如255个项目没有限制.

type 
  TMyType = (mtOne, mtTwo, mtThree, ..., mtThreeHundred);
Run Code Online (Sandbox Code Playgroud)

delphi

4
推荐指数
2
解决办法
2434
查看次数

标签 统计

delphi ×6

inheritance ×2

dcu ×1

delphi-2010 ×1

goto ×1

oop ×1

unicode ×1