我正在准备 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
,则在保存更改时会收到以下错误:
The MyTestComponent1MyAnsiStringFunction method referenced by MyTestComponent1.MyAnsiStringFunction has an incompatible parameter list. Remove the reference?
为什么会发生这种情况?有没有办法强制使用 AnsiString
类型?
最佳答案
由于string
是AnsiString
的别名,就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/