【发布时间】: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