Показать сообщение отдельно
  #11  
Старый 13.04.2017, 05:05
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
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% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием