我想知道是否可以将呼叫从一个类替换为另一个类?
例
TmyButton = class (TButton)
procedure Click; override;
end;
initialization
UnRegisterClass (TButton);
RegisterClass (TButton);
Run Code Online (Sandbox Code Playgroud)
但是这段代码不能正常工作,有人有任何提示吗?
谢谢
请参阅下面的完整示例,我在启动时调用,但遗憾的是它无法正常工作.
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls;
type
TmyButton = class( TButton )
procedure Click; override;
end;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
inherited;
ShowMessage( 'Hello' );
end;
{ TmyButton }
procedure TmyButton.Click;
begin
ShowMessage( 'myClass' );
inherited;
end;
initialization
UnRegisterClass( TButton );
RegisterClass( TMyButton );
end.
Run Code Online (Sandbox Code Playgroud)
你这是错误的方式.你需要的是一个插入类.这意味着您的自定义类与您要替换的类具有相同的名称.DFM系统不使用完全限定的类名,因此在运行时,流系统将创建使用给定类名定义的最后一个类的实例.
所以,改变这个:
type
TmyButton = class( TButton )
procedure Click; override;
end;
Run Code Online (Sandbox Code Playgroud)
对此:
type
TButton = class( FMX.StdCtrls.TButton )
procedure Click; override;
end;
Run Code Online (Sandbox Code Playgroud)
还有这个:
{ TmyButton }
procedure TmyButton.Click;
begin
ShowMessage( 'myClass' );
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
对此:
{ TButton }
procedure TButton.Click;
begin
ShowMessage( 'myClass' );
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
并initialization彻底摆脱你的部分.
这是完整的代码:
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls;
type
TButton = class( FMX.StdCtrls.TButton )
procedure Click; override;
end;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
inherited;
ShowMessage( 'Hello' );
end;
{ TButton }
procedure TButton.Click;
begin
ShowMessage( 'myClass' );
inherited;
end;
end.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |