Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

Вызов функции по содержимому переменной   Найти похожие ветки 

 
Ded Moroz ©   (2005-08-14 15:05) [0]

ДВС! У меня есть StringList, где хранятся имена процедур моей программы. Если в Memo написать имя процедуры, она выполняется.
Вот код:


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


Возник вопрос. Никак не могу подстроить этот код для вызова ф-ции с параметрами. Плюс неплохо было-бы получить в отдельную переменную String результат выполнения ф-ции.
Может кто-то знает, как решить проблему?


 
Юрий Зотов ©   (2005-08-14 15:14) [1]

type
 TMyFunc = function(...): string;

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

Если возможны функции с разными списками параметров, то нужно определить все их типы, а в Stringlist придется хранить не только имя и адрес, а еще и признак типа функции.


 
Юрий Зотов ©   (2005-08-14 15:21) [2]

Не знаю деталей задачи, но не исключено, что может оказаться полезной еще и перегрузка (overload).


 
jack128 ©   (2005-08-14 15:45) [3]

function TestFunc1(d: Double): Integer;
begin
 ....
end;

function TestFunc2(d: Double): Integer;
begin
 ....
end;

exports
 TestFunc1,
 TestFunc2;

procedure TForm1.Button1Click(Sender: TObject);
var
 Func: function (d: Double): Integer;
begin
 @Func := GetProcAddress(hInstance, PChar(Edit1.Text));
 if @Func = nil then
   raise Exception.CreateFmt("Функции с именем "%s" не существует", [Edit1.Text]);
 ShowMessage(IntToStr(Func(10.63)));
end;


 
TUser ©   (2005-08-14 16:13) [4]

ИМХО, лучше сделать все эти процедуры published-методами какого либо класса.


 
Slym ©   (2005-08-15 04:22) [5]

Сделать 1 входной параметр типа Variant (VarArray - для множества параметров ) и результат типа Variant



Страницы: 1 вся ветка

Текущий архив: 2005.09.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.044 c
3-1122038677
Juice
2005-07-22 17:24
2005.09.04
Потокобезопасность IBX


1-1123832169
Ка
2005-08-12 11:36
2005.09.04
Как отловить одновременно два события


14-1123683162
Kerk
2005-08-10 18:12
2005.09.04
Абрамович предложил своим футболистам отдохнуть на Чукотке


1-1124115072
MegaVolt
2005-08-15 18:11
2005.09.04
ComboBox + ToolBar с большими кнопками = глюки


6-1116700838
avtsasha
2005-05-21 22:40
2005.09.04
Выполнение php скриптов через делфю