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

Wes*_*ato 1 delphi firemonkey

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

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)

Rem*_*eau 6

你这是错误的方式.你需要的是一个插入类.这意味着您的自定义类您要替换的类具有相同的名称.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)