При работе с событиями в 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.
Также, можно использовать классовый метод, который автоматически принимает 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:
Это корректно, поскольку Self не используется в ProcLogging.
Заключение
При использовании TGetStrProc важно понимать, что он ожидает процедуру, которая может быть вызвана на уровне объекта. Необходимо либо изменить сигнатуру процедуры, чтобы явно указать параметр Self, либо использовать классовый метод, который автоматически принимает Self. Следуя этим рекомендациям, вы сможете корректно использовать обработчики событий с типом TGetStrProc в Delphi.
В контексте обсуждается проблема правильного использования обработчика событий типа `TGetStrProc` в Delphi, связанная с передачей строкового параметра и неверной сигнатурой процедуры.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.