如何在事件处理程序中设置 AnsiString 参数?
How to set an AnsiString param in an event handler?
我正在准备 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
,则在保存更改时出现以下错误:
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
因为前者是 UnicodeString
从 D2009 开始的别名。
但是,如果包的消费者也要迁移,则需要使用不同的类型。喜欢
type
MyAnsiString = type AnsiString;
请注意,您将无法将其中一种类型作为 var 参数传递给另一种类型 (link),但这在用作事件处理程序的参数时可能不会产生任何影响.
我正在准备 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
,则在保存更改时出现以下错误:
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
因为前者是 UnicodeString
从 D2009 开始的别名。
但是,如果包的消费者也要迁移,则需要使用不同的类型。喜欢
type
MyAnsiString = type AnsiString;
请注意,您将无法将其中一种类型作为 var 参数传递给另一种类型 (link),但这在用作事件处理程序的参数时可能不会产生任何影响.