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

Вызов метода по его имени

Delphi , Компоненты и Классы , Процедуры и Функции

Вызов метода по его имени

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

type
   TForm1 = class(TForm)
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
     // Your routines (that you'll run by name) must be here 
    procedure Hello_World(Sender: TObject);
   private
     procedure ExecuteRoutine(Instance: TObject; Name: string);
   end;

 var
   Form1: TForm1;

 type
   TExecute = procedure of object;

 procedure TForm1.ExecuteRoutine(Instance: TObject; Name: string);
 var
   Routine: TMethod;
   Execute: TExecute;
 begin
   Routine.Data := Pointer(Instance);
   // Returns the address of a published method. 
  Routine.Code := Instance.MethodAddress(Name);
   if Routine.Code = nil then Exit;
   Execute := TExecute(Routine);
   Execute;
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 begin
   ExecuteRoutine(Form1, 'Hello_World');
 end;

 procedure TForm1.Hello_World(Sender: TObject);
 begin
   ShowMessage('This is a test');
 end;

Привет! В этом коде демонстрируется вызов метода по его имени в языке программирования Delphi. Метод ExecuteRoutine принимает объект и имя метода как параметры, а затем вызывает этот метод.

Вот разбивка кода:

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    // Ваши рутины (которые вы будете запускать по имени) должны быть здесь 
    procedure Hello_World(Sender: TObject);
   private
     procedure ExecuteRoutine(Instance: TObject; Name: string);
   end;

var
  Form1: TForm1;

Класс TForm1 имеет метод Button1Click, который вызывается при клике кнопки с тем же именем. Этот метод вызывает другой приватный метод, называемый ExecuteRoutine.

procedure TForm1.ExecuteRoutine(Instance: TObject; Name: string);
var
  Routine: TMethod;
  Execute: TExecute;
begin
  Routine.Data := Pointer(Instance);
  // Возвращает адрес публикуемого метода.
  Routine.Code := Instance.MethodAddress(Name);
  if Routine.Code = nil then Exit;
  Execute := TExecute(Routine);
  Execute;
end;

Метод ExecuteRoutine принимает объект и имя метода как параметры. Он настраивает структуру TMethod с адресом объекта и адресом метода (который получается с помощью MethodAddress). Затем он конвертирует это TMethod в тип TExecute и вызывает метод.

procedure TForm1.Button1Click(Sender: TObject);
begin
  ExecuteRoutine(Form1, 'Hello_World');
end;

В методе Button1Click, когда кнопка кликается, он вызывает метод ExecuteRoutine с самим собой как объектом и именем 'Hello_World'.

procedure TForm1.Hello_World(Sender: TObject);
begin
  ShowMessage('This is a test');
end;

Наконец, метод Hello_World просто отображает сообщение об ошибке, говорящее "Это тест".

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

В статье описывается пример вызова метода Delphi по его имени с помощью процедуры ExecuteRoutine, которая позволяет выполнить любую рутину объекта.


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

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




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


:: Главная :: Процедуры и Функции ::


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:23:06/0.014503955841064/1