Текущий архив: 2003.08.25;
Скачать: CL | DM;
Вниз
Вызов процедуры Найти похожие ветки
← →
Mdsns (2003-08-13 06:14) [0]Как вызвать процедуру или функцию зная ее имя, через строковую переменную??..
← →
Vulko (2003-08-13 06:34) [1]...
public
procedure proc;
...
procedure tform1.buttonclick(sender: tobject);
begin
...
proc;
...
end;
...
← →
Palladin (2003-08-13 07:14) [2]никак
← →
k-man (2003-08-13 07:52) [3]> Vulko © (13.08.03 06:34)
Ты хоть сам понял чего ты написал?
← →
Fktrc (2003-08-13 08:08) [4]И чего ругаетесь. Вероятно, человек имел в виду следующее - в строковой переменной лежит имя процедуры (причем сформированное в runtime - иначе не стоило и спрашивать). Как вызвать эту процедуру? Кстати, ответ интересен и мне. Я читал, что "используя механизм RTTI, такое можно сделать" (с какого-то форума), но как?
← →
Palladin (2003-08-13 08:21) [5]никак
← →
Zacho (2003-08-13 08:32) [6]А может автора исходного поста устроят переменные процедурного типа ?
← →
wl (2003-08-13 08:50) [7]Можно попробовать занести в StringList имена всех процедур в свойство Strings и адреса этих процедур в свойство Objects. Тогда для вызова нужной процедуры выполняется поиск по имени с последующим вызовом по адресу из свойства Objects.
Надеюсь понятно объяснил...
← →
Skier (2003-08-13 08:53) [8]GetProcAddress(...) ?
← →
Толик (2003-08-13 10:57) [9]только для published: TObject.MethodAddress - в качестве параметра принимает строковое имя процедуры и возвращает указатель на неё. Через этот указатель и вызывать.
← →
HolACost! (2003-08-13 11:04) [10]Я больше склоняюсь к исползованию птаблицы соответстий строковой переменной и адреса вызываемой функции!
← →
Юрий Федоров (2003-08-13 11:25) [11]или как Skier © (13.08.03 08:53)
Только тогда их все экспортировать надо
← →
Толик (2003-08-13 11:29) [12]Короче, все выше приведённые методы сводятся к HolACost! (13.08.03 11:04) [10] Другой вопрос, реализовано ли это кем-то или надо писать самому.
← →
Skier (2003-08-13 11:37) [13]>Толик © (13.08.03 11:29) [12]
для [10] ещё нужно будет описание параметров добавлять... и дальше со всеми остановками.
Конечная остановка - интерпретатор. :)
← →
HolACost! (2003-08-13 11:54) [14]Кстати не обязятельно все параметры! Можно только один посылать - адрес некой структуры типа Просто Pointer! А каждая процедура будет сама приводить этот адрес к нужному ей типу. и соответственно вызывающая процедура будет передавать адрес...
← →
HolACost! (2003-08-13 11:56) [15]Кстати - это реализовано, но не на дельфи - принцип реализации просто - для простоты - можно простой пребор всех значений... для скорости - иметь отсортированную таблицу по строковым меткам и работать логорифмическим поиском! Короче делаем как делает это наша великая Windows 3.1
← →
Song (2003-08-13 12:03) [16]
type
TMacroProc = procedure(param: Integer); массив, сопоставляющий имена процедур их адресам во время выполнения приложения: type
TMacroName = string[32];
TMacroLink = record
name: TMacroName;
proc: TMacroProc;
end;
TMacroList = array [1..MaxMacroIndex] of TMacroLink; const
Macros: TMacroList = (
(name: "Proc1"; proc: Proc1),
(name: "Proc2"; proc: Proc2),
...
); интерпретатор функций, типа: procedure CallMacro(name: String; param: Integer);
var
i: Integer;
begin
for i := 1 to MaxMacroIndex do
if CompareText(name, Macros[i].name) = 0 then begin
Macros[i].proc(param);
break;
end;
end; Макропроцедуры необходимо объявить в секции Interface модуля или с клю?евым словом Far, например: procedure Proc1(n: Integer); far;
begin
...
end; procedure Proc2(n: Integer); far;
begin
...
end;
← →
Skier (2003-08-13 12:10) [17]>Song © (13.08.03 12:03) [16]
Проблема в том что параметры могут быть разными.
← →
wl (2003-08-13 13:42) [18]>Skier © (13.08.03 12:10) [17]
Использовать тип Variant :)
← →
HolACost! (2003-08-13 14:48) [19]Я за свой вариант! Такая весч - ну типа подобная - реализована в одной оске!
Страницы: 1 вся ветка
Текущий архив: 2003.08.25;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.009 c