13.04.2017, 05:05
|
|
I Like it!
|
|
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
|
|
Если переделывать Ваш пример, то получается:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
FB: TButton;
procedure FBClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMButton = class(TButton)
procedure Click; override;
procedure CMRelease(var Message: TMessage); message CM_RELEASE;
end;
var
Form1: TForm1;
MB: TMButton;
implementation
{$R *.dfm}
procedure CreateTMButton();
begin
MB := TMButton.Create(Form1);
MB.Width := Form1.ClientWidth;
MB.Height := Form1.ClientHeight - 20;
MB.Caption := 'Class';
MB.Parent := Form1;
end;
procedure TMButton.Click;
begin
inherited;
//PostMessage(Self.Handle, CM_RELEASE, 0, 0);
PostMessage(MB.Handle, CM_RELEASE, 0, 0);
//showmessage(inttostr(Integer(MB)));
//FreeAndNil(MB);
//CreateTMButton();
//showmessage(inttostr(Integer(MB)));
//Showmessage('MButtonClick');
end;
procedure TMButton.CMRelease(var Message: TMessage);
begin
FreeAndNil(Self);
end;
procedure TForm1.FBClick(Sender: TObject);
begin
FreeAndNil(MB);
//CreateTMButton();
//Showmessage('FBClick');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateTMButton();
FB := TButton.Create(Form1);
FB.Top := Form1.ClientHeight - 20;
FB.Height := 20;
FB.Width := Form1.ClientWidth;
FB.Caption := 'Form';
FB.OnClick := FBClick;
FB.Parent := Form1;
end;
end.
Но можно и без ввода дополнительных классов, а "шаманским методом Гео" (ищи на DK) изменить стандартный класс. В таком случае уже все стандартные компоненты "модифицированного" класса, установленные ранее на форме, будут иметь "модифицированные" свойства и методы. Ну и и их можно не создавать динамически.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TButton= class(StdCtrls.TButton)
public
procedure Click; override;
procedure Release;
protected
procedure CMRelease(var Message: TMessage); message CM_RELEASE;
end;
TForm1 = class(TForm)
FB: TButton;
MB: TButton;
procedure FBClick(Sender: TObject);
procedure MBClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TButton }
procedure TButton.Click;
begin
inherited;
Release;
end;
procedure TButton.CMRelease(var Message: TMessage);
begin
FreeAndNil(Self);
end;
procedure TButton.Release;
begin
PostMessage(Self.Handle, CM_RELEASE, 0, 0);
end;
{ TForm1 }
procedure TForm1.FBClick(Sender: TObject);
begin
FreeAndNil(MB);
end;
procedure TForm1.MBClick(Sender: TObject);
begin
MB.Release;
end;
end.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
|