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;
Проблема с обработчиком кнопки, создаваемой run-time
Код:
Кнопка создается, но обработчик не присваивается. Если поместить все из процедуры Repainter в FormCreate, то работает.
@Btn.OnClick := @TMainForm.Clicker;
Код:
Btn.OnClick := Form1.Clicker
либо измени объявление
Код:
type
tForm1 = class(Tform)
...
private
procedure Repainter;
procedure TForm1.Repainter;
begin
...
Btn.OnClick:= Clicker;
end
tForm1 = class(Tform)
...
private
procedure Repainter;
procedure TForm1.Repainter;
begin
...
Btn.OnClick:= Clicker;
end
Кто-нибудь может объяснить смысл добавления @, почему в FormCreate можно без этого?
Вызов из метода класса следующего кода
Код:
Btn.OnClick := Clicker
эквивалентет
Код:
Btn.OnClick:= MainForm.Clicker
но ни как не
Код:
Btn.OnClick:= [COLOR="Red"]T[/COLOR]MainForm.Clicker
символ @ позволяет получить указатель на Clicker прямо из класса, без необходимости создавать объект этого класса.
Зы. Объяснил как мог.
У меня и в FormCreate не работает. В := слева - TNotifyEvent, справа - procedure.
Большое спасибо! Вопрос исчерпан.