Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 - функция с параметрами, результат которой неважен, то так как это невозможно можно ли получить правильную анологию?


 
&#28010;&#20154;   (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.012 c
3-83344
Seven
2003-05-05 06:54
2003.05.26
Upper в Interbase


8-83615
IvanUdalov@mail.ru
2003-02-10 12:24
2003.05.26
генерация звука


3-83421
_Al
2003-05-07 10:06
2003.05.26
DBGrid


1-83496
vlv
2003-05-15 19:09
2003.05.26
Отображается неверная пиктограмма окна MDIChild


1-83589
Михайлов Антон
2003-05-14 14:26
2003.05.26
md5





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский