如何在事件处理程序中设置AnsiString参数?

时间:2019-10-03 15:26:32

标签: delphi delphi-2007 eventhandler

我正在准备Delphi 2007项目的某些部分,以轻松迁移到Delphi XE7。

我已将事件处理程序的参数类型从string切换为AnsiString(此特定事件处理程序必须与AnsiString一起使用)。

运行时程序包:

  TMyAnsiStringFunction = function(const APar : AnsiString) : AnsiString of object;
  TMyTestComponent = class(TComponent)
  private
    FMyAnsiStringFunction : TMyAnsiStringFunction;
  published
    property MyAnsiStringFunction : TMyAnsiStringFunction read FMyAnsiStringFunction write FMyAnsiStringFunction;
  end;

Designtime软件包:

procedure Register;
begin   
  RegisterComponents('MyComponents', [TMyTestComponent]);
end;

当我从 Object Inspector 双击MyAnsiStringFunction时,它会自动创建一个带有string参数和一个string结果类型的函数,而不是{ {1}}:

AnsiString

如果我手动将参数和结果类型从 TForm1 = class(TForm) MyTestComponent1: TMyTestComponent; function MyTestComponent1MyAnsiStringFunction(const APar: string): string; private { Private declarations } public { Public declarations } end; 更改为string,那么在保存更改时会出现以下错误:

enter image description here

  

所引用的MyTestComponent1MyAnsiStringFunction方法   MyTestComponent1.MyAnsiStringFunction的参数不兼容   清单。删除参考?

为什么会这样,有没有办法强制使用AnsiString类型?

1 个答案:

答案 0 :(得分:2)

由于stringAnsiString的别名,因此就D2007而言,没有功能上的区别,IDE可以随意替换更常用的string来代替实际使用的类型。这可以看做是短视,但是您执行的实验是关于是否可以强制使用AnsiString类型的结论,这与代码无关,而与IDE有关。

如果仅要迁移软件包,则无需执行任何操作。因为在XE7下编译时,IDE不能将string替换为AnsiString,因为从D2009开始,前者是UnicodeString的别名。

但是,如果也要迁移软件包的使用者,则需要使用不同的类型。喜欢

type
  MyAnsiString = type AnsiString;

请注意,您将无法将其中一种作为var参数传递给另一种(link),但这在用作事件处理程序的参数时可能没有任何意义。 / p>