2015-07-07 3 views
1

Первое сообщение здесь, пожалуйста, простите любые этикетировочные ошибки.Установите событие onclick во время выполнения в Delphi XE

Я создаю приложение для нескольких устройств (FMX) в Delphi XE8, и мне трудно назначить обработчик событий динамически созданной кнопке. Я просмотрел StackOverflow и нашел ответы, связанные с NotifyEvents, поэтому я последовал советам в этих ответах - до сих пор не повезло. Ошибка компиляции: «E2010 Несовместимые типы:« TNotifyEvent »и« Процедура »».

Я собрал простой тестовый пример формы с полем редактирования и статической кнопкой Hello, вторая кнопка создает кнопку «Прощай» и пытается назначить процедуру событию OnClick, но я все еще получаю такая же ошибка.

Насколько я могу судить, я выполнил все требования по обеспечению совместимости процедуры с TNotifyEvent, но даже этот базовый пример не с той же ошибкой. Я ударяю головой о стену, чтобы кто-нибудь, пожалуйста, сообщите мне, что я сделал неправильно?

Большое спасибо.

unit Dynamic_Button_Test1; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, 
    FMX.Controls.Presentation, FMX.Edit; 

type 
    TForm1 = class(TForm) 
    Edit1: TEdit; 
    Hello: TButton; 
    Create_GoodBye: TButton; 
    procedure HelloClick(Sender: TObject); 
    procedure Create_GoodByeClick(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    procedure GoodbyeClick(Sender: TObject) ; 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 

procedure TForm1.Create_GoodByeClick(Sender: TObject); 
var 
    New_Button : TButton ; 
begin 
New_Button := TButton.Create(Form1); 
New_Button.Parent := Form1 ; 
New_Button.Text := 'Goodbye' ; 
New_Button.Visible := True ; 
New_Button.Margins.Left := 50 ; 
New_Button.Margins.Right := 50 ; 
New_Button.Margins.Bottom := 30 ; 
New_Button.Height := 50 ; 
New_Button.Align := TAlignLayout.Bottom ; 

New_Button.OnClick := TForm1.GoodbyeClick ; 
end; 

procedure TForm1.HelloClick(Sender: TObject); 
begin 
Edit1.Text := 'Hello' ; 
end; 

procedure TForm1.GoodbyeClick(Sender: TObject); 
begin 
Edit1.Text := 'Goodbye' ; 
end; 

end. 
+3

'New_Button.OnCl ick: = TForm1.GoodbyeClick' → 'New_Button.OnClick: = Form1.GoodbyeClick' или просто' New_Button.OnClick: = GoodbyeClick'. – TLama

ответ

6

Обработчики событий VCL/FMX привязаны к определенным объектам во время выполнения. При назначении обработчика событий вам нужно заменить класс typename указателем на объект. Этот объект будет обработчик событий в Self указатель, когда событие срабатывает позже:

New_Button.OnClick := Self.GoodbyeClick ; 

Или просто:

New_Button.OnClick := GoodbyeClick ; // Self implicitly used 

На стороне записки - при создании кнопки, что код внутри TForm1 метод экземпляра, так что вы должны использовать указатель Self объекта вместо глобального указателя Form1 объекта:

New_Button := TButton.Create(Self); 
New_Button.Parent := Self ; 
Смежные вопросы