将呼叫从一个 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.
我想知道是否可以将呼叫从一个 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.