![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов функции по содержимому переменной [D5, D7, Win95/98, WinME, NT4, Win2k, WinXP]
Ded Moroz © (2005-08-14 15:05:00)ДВС! У меня есть 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 результат выполнения ф-ции.
Может кто-то знает, как решить проблему?
Slym (2005-08-15 04:22:00) [1]Сделать 1 входной параметр типа Variant (VarArray - для множества параметров ) и результат типа Variant
TUser (2005-08-14 16:13:00) [2]ИМХО, лучше сделать все эти процедуры published-методами какого либо класса.
jack128 (2005-08-14 15:45:00) [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;
Юрий Зотов (2005-08-14 15:21:00) [4]Не знаю деталей задачи, но не исключено, что может оказаться полезной еще и перегрузка (overload).
Юрий Зотов (2005-08-14 15:14:00) [5]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 придется хранить не только имя и адрес, а еще и признак типа функции.