Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2019, 11:04   #1
NNK_RTR
Пользователь
 
Регистрация: 14.08.2019
Сообщений: 16
Вопрос Вызвать указанную в параметре функцию

Нужно из некоторой процедуры вызвать другую, заранее неизвестную процедуру (или одну из известных). Типа:
Код:
procedure First(param1:integer;param2: ?;
  begin
   ...
   param2; //вызвать нужную процедуру
   ...
  end;
Какой тип параметра param2? (если это вообще возможно)
Если невозможно, то подскажите, как это вообще можно сделать.
Но без перебора, типа:
Код:
 Если param2 = 2, то вызвать процедуру two();
 ...
 Если param2 = 10, то вызвать процедуру ten();
Спасибо за то, что прочитали, а если еще и ответите, то ГРОМАДНОЕ спасибо

С уважением, Николай.

Последний раз редактировалось NNK_RTR; 14.08.2019 в 11:06. Причина: Ошибка форматирования
NNK_RTR вне форума Ответить с цитированием
Старый 14.08.2019, 12:13   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Как сделать без перебора, как вы хотите, я вряд ли скажу. Но, если вам отсутствие перебора не принципиально, то...
param2 можно сделать тоже целым числом. В функции first делаете такой перебор, как вы написали. Далее, делайте вот что.
Ниже пишите только заголовки (сигнатуры) необходимых процедур (two, three, four...ten). После них через точку с запятой пишите слово forward. То есть, у вас получится что-то вроде

Код:
procedure two(ПАРАМЕТРЫ); forward;
и так далее для всех остальных процедур.

А реализацию функций надо будет написать после десятой процедуры.

Если честно, я сам никогда не так подпрограммы (не приходилось), но делается это как-то так с большой долей точности.
Вадим Мошев вне форума Ответить с цитированием
Старый 14.08.2019, 12:39   #3
NNK_RTR
Пользователь
 
Регистрация: 14.08.2019
Сообщений: 16
По умолчанию

Спасибо ОГРОМНОЕ!
Процедуры (функции) two, three, four...ten будут находиться в другом модуле (или, даже, в разных модулях) (в них же и описаны). Поэтому директива (или спецификатор?) forward тут неуместен (может и ошибаюсь).
Дело в том, что процедура First содержит довольно большой цикл (перебор файлов каталогов с заходом в под-каталоги). В этом цикле и должна вызываться нужная процедура. Не хотелось бы использовать операторы выбора в цикле. И так, сам перебор и обработка файлов занимает много времени.
Все равно ОГРОМНОЕ спасибо за ответ.
С уважением, Николай.
NNK_RTR вне форума Ответить с цитированием
Старый 14.08.2019, 12:54   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Например так для не объектных процедур:
Код:
type TMyProcrdure = procedure(Text: String);

procedure MyProc1(Text: String);
begin
  ShowMessage('MyProc1'#13+Text);
end;

procedure MyProc2(Text: String);
begin
  ShowMessage('MyProc2'#13+Text);
end;

procedure MyProc(Text: String; tProc: TMyProcrdure);
begin
  tProc(Text);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyProc('бла-бла 1',MyProc1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  MyProc('бла-бла 2',MyProc2);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.08.2019, 13:01   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

процедурный тип.
Код:
TMyParamProc  =procedure(p1: integer; p2: boolean);
все процедуры передаваемые как параметр должны будут иметь ровно такое число и тип параметров.

Код:
procedure run(x: integer; testproc: TMyParamProc);
begin
  ...
  testproc(x, true); // вызов переданной процедуры
 ...
end;
Код:
procedure first(a: integer; b: boolean); //процедура которую мы хотим вызвать (число и типы параметров в соответвии с TmyParamProc
begin
...// а уж использовать их или нет ?!
end;

run(40, first); //и мы указываем  имя процедуры с котрой будем работать
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.08.2019, 17:24   #6
NNK_RTR
Пользователь
 
Регистрация: 14.08.2019
Сообщений: 16
По умолчанию

Вопрос в принципе снят.
Буду пытаться внедрить ответ в жизнь, вернее в код

Спасибо ОГРОМНОЕ (раз обещал)
NNK_RTR вне форума Ответить с цитированием
Старый 15.08.2019, 02:44   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от NNK_RTR Посмотреть сообщение
Вопрос в принципе снят.
А вот насколько бы было вам легче жить, если бы вы озвучили не только частный вопрос, но и саму вашу задачу!
northener вне форума Ответить с цитированием
Старый 15.08.2019, 10:31   #8
NNK_RTR
Пользователь
 
Регистрация: 14.08.2019
Сообщений: 16
По умолчанию

Даже не знаю...
Попробую озвучить общую задачу, а Вы подскажите, правильно ли я Вас понял.
Лет 10 назад я решил разобраться с фото, которые до безобразия вольготно расплодились на моем компьютере. Я решил все фото собрать в одну папку и упорядочить их по дате съемки. Посмотрев результат я заметил, что некоторые фото сняты явно летом имеют дату съемки указывающие на зиму (январь...), да и год съемки, судя по возрасту внуков тоже не сходится. Изменить дату съемки одного фото легко, но их множество. Тогда я написал несколько программ, которые последовательно справляются с пакетным изменением даты съемки. (одна программа собирает все фото в одну папку, другая - сортирует по типу камеры...). программы практически не имели интерфейса, необходимые данные я вставлял непосредственно в код, но со своей задачей справились и я успокоился. По мере старения (сейчас 68 лет) я заметил, что мозги явно усыхают. Чтобы замедлить усыхание я занялся русификацией программ. Наибольшим своим достижением я считаю перевод IDA. (если кому интересно, то мои переводы можно посмотреть здесь). С этой же целью я решил собрать разные программы в одну с общим интерфейсом.
Такова предыстория и такова общая задача.
Вы это имели ввиду? Что-то надо конкретизировать?
NNK_RTR вне форума Ответить с цитированием
Старый 15.08.2019, 18:55   #9
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Цитата:
Сообщение от NNK_RTR Посмотреть сообщение
По мере старения (сейчас 68 лет)
То ли еще будет !
digitalis вне форума Ответить с цитированием
Старый 15.08.2019, 19:42   #10
NNK_RTR
Пользователь
 
Регистрация: 14.08.2019
Сообщений: 16
По умолчанию

Посмотрел Ваши личные данные (почему-то они профилем называются).
Судя по отклику и улыбающемуся смайлику (а может ехидно улыбающемуся), с мозгами у Вас проблем нет.
Здоровья Вам.
С уважением, Николай.
NNK_RTR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызвать функцию(с++) Sterben Помощь студентам 13 29.09.2015 09:01
написать программу массивы (C++) - Написать функцию выводящую на экран указанную часть таблицы умножения Саша1990 Помощь студентам 1 02.02.2015 08:01
Как вызвать функцию.. Аделинкка Общие вопросы Delphi 10 21.12.2012 10:47
Як вызвать функцию из dll в C# ? Dr.Pauliss Помощь студентам 5 26.09.2011 12:42
Как вызвать функцию? blackstersl Общие вопросы Delphi 10 07.06.2009 19:22