将呼叫从一个 class 替换为另一个?

Replace Call from one class to another?

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

示例

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.

我没有使用 FMX 的经验,但如果以下内容不适用,我会感到非常惊讶...

您的代码未被调用的原因相对简单,您没有创建该类型的对象。

声明 class TMyButton = class(TButton) 不会替换 TButton class 的代码,它仅允许您创建 class TMyButton 的实例继承自 TButton.

因为 Button1: TButton;TButton,点击它会调用来自 TButton 的代码,而不是来自 TMyButton 的代码。

你的做法是错误的。您需要的是 插入器 class。这意味着您的自定义 class 与您要替换的 class 具有 相同的名称。 DFM 系统不使用完全限定的 class 名称,因此在运行时,流系统将创建最后一个 class 的实例,该实例已使用给定的 class 名称定义。

所以,改变这个:

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.