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

How to set an AnsiString param in an event handler?

我正在准备 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;

设计时包:

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

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

  TForm1 = class(TForm)
    MyTestComponent1: TMyTestComponent;
    function MyTestComponent1MyAnsiStringFunction(const APar: string): string;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

如果我手动将参数和结果类型从 string 更改为 AnsiString,则在保存更改时出现以下错误:

The MyTestComponent1MyAnsiStringFunction method referenced by MyTestComponent1.MyAnsiStringFunction has an incompatible parameter list. Remove the reference?

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

由于stringAnsiString的别名,就D2007而言,功能上没有区别,IDE可以随意替换更常用的string 代替实际使用的类型。这可以被认为是一种短视,但您执行的实验对于是否可以强制 AnsiString 类型是决定性的,这与您的代码无关,而是 IDE 的。

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

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

type
  MyAnsiString = type AnsiString;

请注意,您将无法将其中一种类型作为 var 参数传递给另一种类型 (link),但这在用作事件处理程序的参数时可能不会产生任何影响.