Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с обработчиком кнопки, создаваемой run-time

16K
08 февраля 2009 года
alenov
36 / / 20.09.2007
Как заставить вот этот код работать:

Код:
procedure FormCreate(Sender: TObject);
procedure Clicker(Sender: TObject);

procedure TMainForm.Clicker(Sender: TObject);
begin
 try
  ShowMessage('BtnClick!');
 except
  Application.MessageBox('Fatal error happened!  ','Redactor',MB_OK);
  Abort;
 end;
end;

procedure Repainter;
var
 Btn:TButton;
begin
   Btn:=TButton.Create(MainForm.Panel);
   Btn.Parent:=MainForm.Panel;
   Btn.Top:=0;
   Btn.Left:=0;
   Btn.Width:=24;
   Btn.Height:=24;
   Btn.OnClick:=TMainForm.Clicker; //ошибка здесь: [Pascal Error] MainUnit.pas(274): E2010 Incompatible types: 'TNotifyEvent' and 'Pointer'
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 Repainter;
end;


Кнопка создается, но обработчик не присваивается. Если поместить все из процедуры Repainter в FormCreate, то работает.
5.3K
08 февраля 2009 года
Somebody
185 / / 24.12.2006
@Btn.OnClick := @TMainForm.Clicker;
3.7K
08 февраля 2009 года
0nni
326 / / 24.06.2008
ой вру или так:
 
Код:
Btn.OnClick := Form1.Clicker


либо измени объявление

Код:
type
 tForm1 = class(Tform)
 ...
 private
 procedure Repainter;

procedure TForm1.Repainter;
begin
 ...
 Btn.OnClick:= Clicker;
end
16K
08 февраля 2009 года
alenov
36 / / 20.09.2007
Спасибо, Somebody! Onni, что-то это здесь не работает, у меня, собственно, и было то же самое.
Кто-нибудь может объяснить смысл добавления @, почему в FormCreate можно без этого?
3.7K
08 февраля 2009 года
0nni
326 / / 24.06.2008
Я изменил предыдущий пост... дело в том, что FormCreate это метод класса TForm а Repainter просто процедура.
Вызов из метода класса следующего кода
 
Код:
Btn.OnClick := Clicker

эквивалентет
 
Код:
Btn.OnClick:= MainForm.Clicker

но ни как не
 
Код:
Btn.OnClick:= [COLOR="Red"]T[/COLOR]MainForm.Clicker

символ @ позволяет получить указатель на Clicker прямо из класса, без необходимости создавать объект этого класса.
Зы. Объяснил как мог.
5.3K
09 февраля 2009 года
Somebody
185 / / 24.12.2006
У меня и в FormCreate не работает. В := слева - TNotifyEvent, справа - procedure.
16K
10 февраля 2009 года
alenov
36 / / 20.09.2007
Большое спасибо! Вопрос исчерпан.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог