Задать вопрос
sorry_i_noob
@sorry_i_noob

В чем разница между TForm1.Button1.OnClick и Button1.OnClick? Это ведь одно и то же, но первое не работает, а второе работает. Почему?

Здравствуйте. Есть такой код.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure foo(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  (Sender as TButton).OnClick := foo; // работает
  (Sender as TButton).OnClick := TForm1.foo; // не работает

  Button1.OnClick := foo; // работает
  TForm1.Button1.OnClick := foo; // не работает
end;

procedure TForm1.foo(Sender: TObject);
begin
  MessageDlg('hello', mtError, mbOKCancel, 0);
end;

end.

У меня вопрос. В чем разница в этом коде?
(Sender as TButton).OnClick := foo; // работает
(Sender as TButton).OnClick := TForm1.foo; // не работает

Button1.OnClick := foo; // работает
TForm1.Button1.OnClick := foo; // не работает

Почему один код работает, а другой - нет?
  • Вопрос задан
  • 752 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
anthtml
@anthtml
Системный администратор программист радиолюбитель
Потому что TForm1.Button1.OnClick - метод класса TForm1
А Button1.OnClick - метод объекта Form1
Вы пытаетесь обращаться не к объекту а по сути к коду (типу данных) естественно это исполняться не будет
Ответ написан
Комментировать
@StockholmSyndrome
(Sender as TButton).OnClick := TForm1.foo;

этот код не работает, потому что так можно вызвать/получить лишь статические методы класса
то есть это бы работало, если б было вот так:
TForm1 = class(TForm)
  Button1: TButton;
  class procedure foo(Sender: TObject);
  // ...
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
(Sender as TButton).OnClick := Form1.foo; // заработает
  Form1.Button1.OnClick := foo; // заработает
procedure TForm1.foo(Sender: TObject);
begin
  ShowMessage( 'hello' );
end;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы