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

标签 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;

设计时包:

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

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

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

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

enter image description here

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,因为前者是 D2009 以来 UnicodeString 的别名。

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

type
  MyAnsiString = type AnsiString;

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

关于delphi - 如何在事件处理程序中设置 AnsiString 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58222355/

相关文章:

在文本框中输入时的 PowerShell 调用函数

delphi - 将私有(private)/ protected /公共(public)方法设置为事件处理程序是否安全?

c# - 手动调用EventHandler时出现无意义的错误消息

delphi - 使用 ModalResult 退出表单

c# - C# 与 Delphi 中日期/时间计算之间的差异

delphi - 应用程序卡住时出现奇怪的调用堆栈

delphi - Wiki:Delphi 第 3 方 TCP/IP 组件库的最新技术水平

delphi - 如何在枚举中定义一个非常大的常量而不发出警告?

delphi - 在满足条件之前暂停程序执行的更好方法是什么?

delphi - 使用备用注册表项启动 Delphi