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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2014, 16:04   #1
Tesak
Новичок
Джуниор
 
Регистрация: 25.10.2014
Сообщений: 4
По умолчанию Название функции как значение переменной

Здравствуйте, уважаемые знатоки!

На Делфи программирую уже много лет, но тут столкнулся с ламерской проблемой, которую не могу решить.

Есть такой код

Код:
type
  TMyFunc = function(a,b:string):string;

{.......}

function GetString(a,b:string):string;
begin
result:=a+b;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
s,s2:string;
begin
s2:='GetString';
MyFunc:=TMyFunc(s2);  // Нужно решить эту строку
s:=MyFunc('a', 'b');
showmessage(s);
end;
То есть мне нужно вызвать функцию, название которой храниться в переменной типа string. Приведенный код не работает, и не может работать. это я просто показал на примере, что мне нужно привести переменную s2 к типу TMyFunc.

Помогите, пожалуйста!
Tesak вне форума Ответить с цитированием
Старый 25.10.2014, 16:16   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Такое умеют разве что интерпретаторы. Делфи не умеет. Разве что
if s2='GetString' then GetString(s1,s3);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.10.2014, 16:23   #3
Tesak
Новичок
Джуниор
 
Регистрация: 25.10.2014
Сообщений: 4
По умолчанию

Жаль. Дело в том, что список функций довольно большой, и будет довольно нелепо выглядеть код, состоящий из множества if ... then ... elseif ....

В скриптовых языках (например, PHP) это делается довольно просто, а вот в Делфи....

Может у кого есть еще идеи?
Tesak вне форума Ответить с цитированием
Старый 25.10.2014, 16:49   #4
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Код:
type
  TMyFunc = function(a,b:string):string;
{...}


var
  MyFunc:TMyFunc;

{...}

function GetString(a,b:string):string;
begin
result:=a+b;
end;

function FuncExecute(FuncName, a, b:string):string;
var
FunctList:TStrings;
f:TMyFunc;
index:integer;
begin
FunctList:=TStringList.create;
FunctList.AddObject('GetString',@GetString); // добавляем ссылку на функцию в список
index:= FunctList.IndexOf(FuncName);         // получаем индекс функции в списке
if index > -1 then
   begin
     @f:=FunctList.Objects[index];           // присваиваем функцию переменной
     result:=f(a, b);                        // вызываем функцию и возвращаем значение
   end;
FunctList.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
showmessage(FuncExecute('GetString', 'a', 'b'));
end;
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 25.10.2014, 16:54   #5
Tesak
Новичок
Джуниор
 
Регистрация: 25.10.2014
Сообщений: 4
По умолчанию

Спасибо! То что нужно
Tesak вне форума Ответить с цитированием
Старый 25.10.2014, 17:01   #6
grominfo
Форумчанин
 
Аватар для grominfo
 
Регистрация: 30.05.2011
Сообщений: 651
По умолчанию

Тут минус в том, что функции нужно заранее добавлять в список объектов. Но зато данный метод можно использовать как интерпретатор.
Создание, программирование и сопровождение сайтов любой сложности.
Изготовление программ на заказ.
Список услуг и портфолио на сайте www.andreygrom.ru
grominfo вне форума Ответить с цитированием
Старый 25.10.2014, 19:30   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Если нужно в нативном дельфи вызвать функцию, чьё имя задаётся извне - Вы что-то делаете не так.
Если же по какой-то причине Вам чрезвычайно потребовалась данная функция, то есть 2 пути - 1. подключить скриптовый интерпретатор (хотя самого паскаля) и данную логику реализовать в нём, но это непростая задача всё равно.
2. Попробовать RTTI задействовать, он позволяет по имени определить адрес кода, но налагает ограничения свои (код должен быть в классах, с областями видимости тоже какие-то тонкости), плюс Вам ручками придётся прописывать касты (преобразования типов) и проверку ошибок.
phomm вне форума Ответить с цитированием
Старый 26.10.2014, 13:00   #8
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Автор, для большого количество условий существует Case of.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 26.10.2014, 13:39   #9
Tesak
Новичок
Джуниор
 
Регистрация: 25.10.2014
Сообщений: 4
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
Автор, для большого количество условий существует Case of.
Case of для string ?

Всем спасибо за ответы. Мне подошел совет от grominfo
Tesak вне форума Ответить с цитированием
Старый 27.10.2014, 01:53   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
Сообщение от Tesak Посмотреть сообщение
В скриптовых языках (например, PHP) это делается довольно просто, а вот в Делфи....
Очень кстати (из надёжного источника) термин язык Дельфи дезавуирован. Снова язык называется Object Pascal.
northener вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как задать значение переменной? C++ Arrioh Помощь студентам 1 06.05.2012 06:44
Как подставить значение переменной sodd Помощь студентам 2 25.10.2011 22:27
как вернуть начальное значение переменной? 3dg_fan Помощь студентам 8 27.05.2011 00:56
Как передать значение переменной из функции в ACCESSе в функцию в EXCELе? musicitsme Microsoft Office Access 1 01.04.2009 10:24
как получить значение переменной smoke888 PHP 3 20.06.2008 02:11