Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Вниз
Функции <=> Процедуры Найти похожие ветки
← →
maker (2003-05-08 20:44) [0]Здравствуете! Помогите с такой задачной,
Есть массив процедур a:array [1..MaxProc] of procedure, из которого все процедуры в определённый момент времени
вызываются. Процедуры используются без параметров, но возник другой вопрос, как сделать ссылку процедурой
на функцию с параметрами. Приблезительно это можно решить так,
//Процедура
procedure nPlexTo;
begin
//Сама функция
n:=n+GetPlex(get_post,x);
end;
, где n,x - глобальные переменные (но это и неважно)
и писать в массив так @a:=@nPlexTo, но у меня таких переделок
(из функции в процедуру) получается великое множество(очень много), и как
обойти вышеуказанный метод, чем нибудь по проще...
← →
Nick Denry (2003-05-08 20:48) [1]А к чему такая задачка?
← →
maker (2003-05-09 05:39) [2]Nick Denry
А воть надо!.. Если вообще такое возможно!?..
← →
german goering (2003-05-09 08:00) [3]type
TProc = procedure;
procedure Proc1;
begin
Application.MessageBox("In Proc1","",64)
end;
procedure Proc2;
begin
Application.MessageBox("In Proc2","",64)
end;
procedure Proc3;
begin
Application.MessageBox("In Proc2","",64)
end;
procedure TForm1.Button1Click(Sender: TObject);
const Procs: array [0..2] of TProc = (Proc1,Proc2,Proc3);
var I: Integer;
begin
for I:=0 to High(Procs) do Procs[I]
end;
?
← →
maker (2003-05-10 22:12) [4]
Воть - воть! Как не писать Proc1 begin <...>, Proc2, Proc3... а сразу записывать в массив(вовремя выполнения проги) of TProcs = ( Application.MessageBox("In Proc1","",64), Application.MessageBox("In Proc2","",64), Application.MessageBox("In Proc3","",64) ) и затем например выполнить Procs[0]; Procs[2]...
← →
german goering (2003-05-11 18:28) [5]Не парься, если интерес не чисто теоретический или если ситуация не чисто исключительно в это упертая (я чето сомневаюсь что это именно так), тебе надо сделать одну единственную процедуру, но с параметром (в качестве диспетчера):
procedure DispatchProcs(ActionId: Integer);
begin
case ActionId of
0: Application.MessageBox("In Proc0","",64); //Procs[0]; // Proc0;
1: Application.MessageBox("In Proc1","",64); //Procs[1]; // Proc1;
2: Application.MessageBox("In Proc2","",64); //Procs[2]; // Proc2;
else
Application.MessageBox("In Some Else Proc","",64);
end;
end;
А дальще в каком угодно порядке их вызываешь:
for I:=0 to 10 do DispatchProcs(Random(4));
Дерзай! Я думаю, этот, наиболее естественный способ, вполне применим в твоем случае.
← →
german goering (2003-05-11 18:31) [6]В противном случае извольте обьяснить, иначе никто не только не сможет, но и не захочет тебе помочь в такой достаточно нелепой постановке задачи (уж извиняй, как на духу говорю).
См.:
> Nick Denry © (08.05.03 20:48)
← →
german goering (2003-05-11 18:46) [7]
> как сделать ссылку процедурой
> на функцию с параметрами.
Расшифруй, пожалста.
Так попробуй:
procedure Proc1;
procedure Proc2;
procedure Proc3;
exports Proc1, Proc2, Proc3;
implementation
{$R *.dfm}
type
TProc = procedure;
procedure Proc1;
begin
Application.MessageBox("In Proc1","",64)
end;
procedure Proc2;
begin
Application.MessageBox("In Proc2","",64)
end;
procedure Proc3;
begin
Application.MessageBox("In Proc2","",64)
end;
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
Procs: array [0..2] of TProc;
P: Pointer;
ProcName: string;
ModuleHandle: THandle;
begin
for I:=0 to 2 do
begin
ModuleHandle := GetModuleHandle(nil);
ProcName := "Proc"+IntToStr(I+1);
P := GetProcAddress(ModuleHandle, PChar(ProcName));
Procs[I] := P;
end;
for I:=0 to 2 do Procs[I];
end;
← →
german goering (2003-05-11 18:56) [8]Или, если процедура - published метод класса, тогда просто так:
type
TForm1 = class(TForm)
Button1: TButton;
procedure Proc1;
procedure Proc2;
procedure Proc3;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TProc = procedure;
procedure TForm1.Proc1;
begin
Application.MessageBox("In Proc1","",64)
end;
procedure TForm1.Proc2;
begin
Application.MessageBox("In Proc2","",64)
end;
procedure TForm1.Proc3;
begin
Application.MessageBox("In Proc2","",64)
end;
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
Procs: array [0..2] of TProc;
begin
for I:=0 to 2 do
Procs[I] := MethodAddress("Proc"+IntToStr(I+1));
for I:=0 to 2 do
Procs[I];
end;
← →
maker (2003-05-12 21:09) [9]Можно ли как-то по другому произвести преобразование функции с параметрами в процедуру (т.е. Процедура в своём теле содержит только функцию с параметрами). В общем виде хотелось бы так @p:=@PlexFunc(1,"AAA"); , где p - процедура, PlexFunc - функция с параметрами, результат которой неважен, то так как это невозможно можно ли получить правильную анологию?
← →
浪人 (2003-05-13 16:32) [10]Удалено модератором
← →
icWasya (2003-05-14 10:55) [11]наверно человек хочет вместо
// правильный вариант
type TP=Procedure;
var A:Array[0..256] of TP;
procedure P1;
GlobalX:=Func1(Param1);
end;
procedure P2;
GlobalX:=Func2(Param2);
end;
begin
A[0]:=P1;
A[1]:=P2;
end.
написать
// вариант ???????????
type TP=Procedure;
var A:Array[0..256] of TP;
begin
A[0]:= ??GlobalX:=Func1(Param1);??
A[1]:= ??GlobalX:=Func2(Param2);??
end.
← →
kull (2003-05-14 11:16) [12]А почему не сделать так?
type TP = Procedure(Params...);
а в них и передавать свои параметры.
var A:Array[0..256] of TP;
Или вообще массив не процедур а
функций сделать, ась?
← →
panov (2003-05-14 11:36) [13]>maker © (10.05.03 22:12)
Воть - воть! Как не писать Proc1 begin <...>, Proc2, Proc3... а сразу записывать в массив(вовремя выполнения проги) of TProcs = ( Application.MessageBox("In Proc1","",64), Application.MessageBox("In Proc2","",64), Application.MessageBox("In Proc3","",64) ) и затем например выполнить Procs[0]; Procs[2]...
А компилировать процедуры после ввода текста во время выполнения сам будешь?
← →
german goering (2003-05-14 22:26) [14]maker © (12.05.03 21:09)
Ну так и вызывай из процедуры функцию. Че тут изобретать, непонятно.
> panov © (14.05.03 11:36)
Вопрос резонный ;)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c