【问题标题】:How to set an AnsiString param in an event handler?如何在事件处理程序中设置 AnsiString 参数?
【发布时间】:2020-02-01 23:06:58
【问题描述】:

我正在准备 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,那么在保存更改时会出现以下错误:

MyTestComponent1MyAnsiStringFunction 方法被引用 MyTestComponent1.MyAnsiStringFunction 有一个不兼容的参数 列表。删除引用?

为什么会发生这种情况,有没有办法强制AnsiString 类型?

【问题讨论】:

  • 你是在D2007还是在XE7中双击?
  • 我猜你不能强制一个非明确的类型,它们是一样的。为什么 IDE 使用“string”而不是“AnsiString”可能是一些实现细节。
  • 如果简单迁移确实很重要,我会使用新的类型 MyAnsiString = type AnsiString。
  • string 在 D2007 中是 AnsiString,因此 D2009 之前的 IDE 将 string 替换为 AnsiString 是有意义的,它们是相同的类型。但是 string 在 D2009+ 中是 UnicodeString,因此 D2007 后的 IDE 不应该替换 AnsiString,只替换 UnicodeString
  • 想必正确的解决方案是使用字符串

标签: delphi delphi-2007 eventhandler


【解决方案1】:

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

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

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

type
  MyAnsiString = type AnsiString;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2011-10-21
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多