{ ... }type
PYourMethod = ^TYourMethod;
TYourMethod = procedure(S: string) ofobject;
procedure TMainForm.Button1Click(Sender: TObject);
begin
ExecMethodByName('SomeMethod');
end;
procedure TMainForm.ExecMethodByName(AName: string);
var
PAddr: PYourMethod;
M: TMethod;
begin
PAddr := MethodAddress(AName);
if PAddr <> nilthenbegin
M.Code := PAddr;
M.Data := Self;
TYourMethod(M)('hello');
end;
end;
procedure TMainForm.SomeMethod(S: string);
begin
ShowMessage(S);
end;
Перевод:
Код на Delphi демонстрирует выполнение метода по его имени с помощью процедуры ExecMethodByName.
Обзор кода:
Определены типы PYourMethod и TYourMethod как указатель и тип метода, соответственно.
В обработчике события Button1Click формы TMainForm вызывается процедура ExecMethodByName с именем 'SomeMethod'.
Процедура ExecMethodByName принимает имя метода в виде строки параметра (AName) и использует его для поиска соответствующего метода в текущем объекте (Self). Это делается вызовом MethodAddress(AName), который возвращает указатель на метод, если он существует.
Если метод найден, процедура создает экземпляр типа TMethod (запись, представляющая вызов метода), присваивает адрес метода полю Code и присваивает текущий объект (Self) полю Data.
Наконец, процедура вызывает метод с помощью указателя на метод TYourMethod, передавая 'hello' в качестве аргумента.
Результатом является всплывающее окно, отображающее строку 'hello'.
Альтернативное решение заключается в использовании функций FindClassMethod или GetMethodAddress, предоставляемых RTL (Runtime Library) Delphi. Эти функции более просты и легче для чтения, чем ручной расчет адреса памяти, используемый в этом коде.
Пример использования FindClassMethod:
procedure TMainForm.ExecMethodByName(AName: string);
var
M: TMethod;
begin
M := FindClassMethod(TypeInfo(TYourForm), AName);
if Assigned(M) then
TYourMethod(M)('hello');
end;
В этом коде используется FindClassMethod для поиска метода в классе TYourForm с именем, указанным в параметре AName. Если метод найден, он вызывается с помощью тех же техник, что и раньше.
В статье описано, как выполнить метод в Delphi по его имени, используя функцию MethodAddress и вызов процедуры с помощью оператора TMethod.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS