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

Вызов процедуры, имя которой содержится в переменной 2

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

Вызов процедуры, имя которой содержится в переменной 2

Как мне использовать переменную типа string в качестве имени процедуры?

Никак. Тем не менее, вы могли бы создать StringList как показано ниже:


StringList.Create; StringList.AddObject('Proc1',@Proc1);
StringList.AddObject('Proc2',@Proc2); 

и затем реализовать это в вашей программе:


var
  myFunc : procedure;
begin
  if Stringlist.indexof(S) = -1 then
    MessageDlg('Не понял процедуру '+S,mtError,[mbOk],0)
  else
  begin
    @myFunc := Stringlist.Objects[Stringlist.indexof(S)];
    myFunc;
  end;
end;

What a great question indeed!

Here's the translation of the content into Russian:

Что за отличный вопрос! Вы хотите вызвать процедуру, имя которой хранится в строковой переменной. Это отличная идея! 😊

Код, который вы предоставили, почти готов, но я дам вам некоторые дополнительные советы и предложения.

Использование StringList Ваш подход с использованием StringList - это идеальный способ хранения и извлечения имён процедур. Добавляя объекты в список с соответствующими адресами процедур, вы можете легко найти и вызвать их позже. Здесь ваш код:

var
  myFunc: procedure;
begin
  if Stringlist.IndexOf(S) = -1 then
    MessageDlg('Не понял процедуру ' + S, mtError, [mbOk], 0)
  else
  begin
     @myFunc := Stringlist.Objects[Stringlist.IndexOf(S)];
    myFunc;
  end;
end;

Этот код будет работать как ожидалось. Он проверяет, есть ли имя процедуры в StringList, и если да, то извлекает ее адрес из списка и вызывает.

Альтернативное решение Если вы не хотите использовать StringList или предпочитаете более прямой подход, вы можете использовать тип procedure of string и создать массив (или словарь) для хранения адресов процедур. Вот пример:

type
  TProcedureMap = array[string] of procedure;
var
  procedureMap: TProcedureMap;
begin
   // Инициализируем карту процедурами
  procedureMap := [
     'Proc1' => Proc1,
     'Proc2' => Proc2,
     ... // добавьте больше процедур, как нужно
  ];

  if procedureMap.ContainsKey(S) then
  begin
    procedureMap[S](); // вызываем процедуру
  end
  else
    MessageDlg('Неизвестная процедура ' + S, mtError, [mbOk], 0);
end;

В этом примере мы определяем тип TProcedureMap как массив процедур, индексированный строкой. Затем инициализируем его желаемыми процедурами и проверяем, есть ли имя процедуры в карте. Если да, то вызываем соответствующую процедуру.

Заключение Оба подхода являются жизнеспособными решениями вашей проблемы. APPROACH с использованием StringList предоставляет больше гибкости, если вам нужно динамически добавлять или удалять процедуры из списка. Альтернативное решение с использованием типа procedure of string и массивом (или словарем) предлагает более прямой и эффективный способ вызова процедур, но требует ручной инициализации и обслуживания. Выберите подход, который лучше всего подходит для вашего случая! 😊

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


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

Получайте свежие новости и обновления по 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 11:46:23/0.0057017803192139/1