将呼叫从一个班级替换为另一个班级

时间:2017-12-01 18:51:00

标签: delphi firemonkey

我想知道是否可以将呼叫从一个班级替换为另一个班级?

实施例

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.

2 个答案:

答案 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的代码。