我想知道是否可以将呼叫从一个班级替换为另一个班级?
实施例
TmyButton = class (TButton)
procedure Click; override;
end;
initialization
UnRegisterClass (TButton);
RegisterClass (TButton);
但是这段代码不能正常工作,有人有任何提示吗?
谢谢
请参阅下面的完整示例,我在启动时打电话但不幸的是它无法正常工作。
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.
答案 0 :(得分:6)
你这是错误的方式。你需要的是一个插入类。这意味着您的自定义类与您要替换的类具有相同的名称。 DFM系统不使用完全限定的类名,因此在运行时,流系统将创建使用给定类名定义的最后一个类的实例。
所以,改变一下:
type
TmyButton = class( TButton )
procedure Click; override;
end;
对此:
type
TButton = class( FMX.StdCtrls.TButton )
procedure Click; override;
end;
而且:
{ TmyButton }
procedure TmyButton.Click;
begin
ShowMessage( 'myClass' );
inherited;
end;
对此:
{ TButton }
procedure TButton.Click;
begin
ShowMessage( 'myClass' );
inherited;
end;
完全摆脱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.
答案 1 :(得分:4)
我对FMX没有经验,但如果以下内容不适用,我会感到非常惊讶......
您的代码未被调用的原因相对简单,您不能创建该类型的对象。
声明类TMyButton = class(TButton)
并不替换TButton类的代码,它只允许您创建继承自TMyButton
的类TButton
的实例。
由于Button1: TButton;
是TButton
,点击它会调用TButton
中的代码,而不是来自TMyButton
的代码。