Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обработка событий динамически созданных элементов в Delphi XE8: решение проблемы с несовместимостью типов

Delphi , Компоненты и Классы , Свойства и События

При разработке мульти-устройственных приложений в Delphi XE8 с использованием FMX-компонентов, разработчики часто сталкиваются с необходимостью динамического создания элементов управления и назначения им обработчиков событий. В данной статье мы рассмотрим типичную проблему, с которой сталкиваются пользователи при работе с динамически созданными кнопками и предоставляем решение, основанное на пересказе материала из контекста.

Проблема

Разработчик столкнулся с проблемой назначения обработчика событий на клик для динамически созданной кнопки. Несмотря на то, что он следовал советам, найденным на StackOverflow, связанным с использованием NotifyEvents, проблема не была решена. Компилятор выдавал ошибку "E2010 Incompatible types: 'TNotifyEvent' and 'Procedure'", указывая на несовместимость типов.

Пример кода

Вот простой пример формы с редактируемым полем и статической кнопкой "Hello". Есть вторая кнопка для создания кнопки "Goodbye" с попыткой назначить ей обработчик события клика:

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);
    procedure GoodbyeClick(Sender: TObject);
  private
  public
  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.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.

Решение проблемы

При назначении обработчика событий для динамически созданных элементов, важно учитывать, что обработчики событий привязаны к конкретным объектам во время выполнения. При назначении обработчика события, необходимо использовать указатель на конкретный объект. В случае с New_Button.OnClick, следует использовать Self вместо TForm1, чтобы указать на текущий экземпляр объекта, для которого выполняется метод:

New_Button.OnClick := Self.GoodbyeClick;

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

New_Button := TButton.Create( Self );
New_Button.Parent := Self ;

Или просто:

New_Button.OnClick := GoodbyeClick; // Self будет использован автоматически

Подводящий итог

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

Создано по материалам из источника по ссылке.

В статье рассматривается проблема назначения обработчика событий на динамически созданные элементы управления в Delphi XE8, связанная с несовместимостью типов при использовании `TNotifyEvent`, и предлагается решение, заключающееся в правильном использова


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Свойства и События ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-30 10:35:47/0.0063800811767578/0