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

Как правильно использовать обработчики событий с типом TGetStrProc в Delphi

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

При работе с событиями в Delphi, разработчики часто сталкиваются с необходимостью использования различных типов обработчиков. Одним из таких типов является TGetStrProc, который представляет собой процедуру, получающую строку в качестве параметра. В данной статье мы рассмотрим, как правильно использовать TGetStrProc на примере, который демонстрирует типичную проблему при его применении.

Описание проблемы

Разработчик столкнулся с проблемой, при попытке использовать обычную процедуру в качестве обработчика события типа TGetStrProc. При вызове этой процедуры в качестве параметра передавалась пустая строка, вместо ожидаемого текста.

program ProcAsTGetStrProc;
uses
  System.Classes, Winapi.Windows, System.SysUtils;
type
  TMyObject = class
  strict private
    _onLog: TGetStrProc;
    procedure _log(const msg: string);
  public
    procedure DoTheWork();
    property OnLog: TGetStrProc read _onLog write _onLog;
  end;
...
// Остальной код программы

В коде представлен класс TMyObject, который содержит метод DoTheWork вызывающий метод _log, который в свою очередь должен выполнить логирование сообщения и, если назначен обработчик событий, передать сообщение этому обработчику. Однако, при использовании обработчика событий ProcLogging в качестве обработчика для свойства OnLog, ожидаемое сообщение не передавалось, и в ProcLogging приходила пустая строка.

Подтвержденный ответ

Проблема заключается в неверной сигнатуре процедуры ProcLogging. TGetStrProc определен как:

TGetStrProc = procedure(const S: string) of object;

Это означает, что ожидается процедура, которая может быть вызвана на уровне объекта, то есть с неявным параметром Self. В случае с ProcLogging, необходимо явно указать этот параметр Self.

procedure ProcLogging(Self: Pointer; const msg: string);
begin
  mbox(Format('ProcLogging: "%s"', [msg]));
end;

Также, можно использовать классовый метод, который автоматически принимает Self в качестве параметра:

type
  TLog = class
  public
    class procedure ProcLogging(const msg: string);
  end;

class procedure TLog.ProcLogging(const msg: string);
begin
  mbox(Format('ProcLogging: "%s"', [msg]));
end;

И затем назначить этот метод как обработчик:

obj.OnLog := TLog.ProcLogging;

Альтернативный ответ

Если вы предпочитаете не изменять сигнатуру процедуры, вы можете явно указать nil в качестве параметра Self при создании TMethod:

obj.OnLog := TGetStrProc(MakeMethod(nil, @ProcLogging));

Это корректно, поскольку Self не используется в ProcLogging.

Заключение

При использовании TGetStrProc важно понимать, что он ожидает процедуру, которая может быть вызвана на уровне объекта. Необходимо либо изменить сигнатуру процедуры, чтобы явно указать параметр Self, либо использовать классовый метод, который автоматически принимает Self. Следуя этим рекомендациям, вы сможете корректно использовать обработчики событий с типом TGetStrProc в Delphi.

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

В контексте обсуждается проблема правильного использования обработчика событий типа `TGetStrProc` в Delphi, связанная с передачей строкового параметра и неверной сигнатурой процедуры.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 10:00:07/0.0033650398254395/0