我正在准备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
,那么在保存更改时会出现以下错误:
所引用的MyTestComponent1MyAnsiStringFunction方法 MyTestComponent1.MyAnsiStringFunction的参数不兼容 清单。删除参考?
为什么会这样,有没有办法强制使用AnsiString
类型?
答案 0 :(得分:2)
由于string
是AnsiString
的别名,因此就D2007而言,没有功能上的区别,IDE可以随意替换更常用的string
来代替实际使用的类型。这可以看做是短视,但是您执行的实验是关于是否可以强制使用AnsiString
类型的结论,这与代码无关,而与IDE有关。
如果仅要迁移软件包,则无需执行任何操作。因为在XE7下编译时,IDE不能将string
替换为AnsiString
,因为从D2009开始,前者是UnicodeString
的别名。
但是,如果也要迁移软件包的使用者,则需要使用不同的类型。喜欢
type
MyAnsiString = type AnsiString;
请注意,您将无法将其中一种作为var参数传递给另一种(link),但这在用作事件处理程序的参数时可能没有任何意义。 / p>