Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];




Вниз

Подскажите, как в Delphi6 вызвать из одной процедуры другую? 


Faster   (2002-02-09 13:36) [0]

Здравствуйте.
Подскажите, как в Delphi6 вызвать из одной процедуры другую?Пример:
...
Procedure 1;
begin
....
end;

Procedure 2;
begin
.....
end;
Как вызвать procedure2 из procedure1 и наоборот?



sunwheel   (2002-02-09 14:17) [1]

Ну в общем то так:

...
Procedure 1;
begin
Procedure 2;
end;

Procedure 2;
begin
Procedure 1;
end;

Только будет наблюдаться один побочный эффект.
Стек будет постоянно переполняться, после
вызова одной из этих процедур.



Atrem   (2002-02-09 18:06) [2]

Думаю так писать нельзя,т.к. например нельзя в процедуре 1 вызвать еще не объявленную процедуру,нужно использовать forward;

Procedure 2;forward;
Procedure 1;
begin
Procedure 2;
end;

Procedure 2;
begin
Procedure 1;
end;




Anatoly Podgoretsky   (2002-02-09 18:21) [3]

Atrem (09.02.02 18:06)

Ну это твое предполодение, что неописана, ничем к тому не обоснованное.



Андрей Сенченко   (2002-02-11 09:25) [4]

>> Anatoly Podgoretsky © (09.02.02 18:21)
>> Atrem (09.02.02 18:06)
>> Ну это твое предполодение, что неописана,
>> ничем к тому не обоснованное.

Если честно, обосновано классической литературой по TP. Именно там сказано, что в таком случае необходимо использовать директиву forward.
Анатолий ! Я наряду с Atrem пребываю в блаженном неведении - где описаны иные варианты опережающего описания ? Просветите пожалуйста ...
Вариант с объявлением обеих процедур в каком-нибудь Private естесственно не рассматривается. Программа на Delphi может нормально работать и без компонент и классов.



Basilio   (2002-02-11 09:36) [5]

Вообще-то обе процедуры наверняка находятся в юните (если это не консольное приложение), тогда все просто:

unit A;
interface
procedure p1;
procedure p2;
implementation
procedure p1;
begin
p2;
end;
procedure p2;
begin
p1;
end;
end.

Здесь всё ОК. для не-юнитов надо делать forward



PVOzerski   (2002-02-11 11:09) [6]

Ну, ребята, даже в юнитах вы же не каждую процедуру объявляете в секции interface! Так что
forward (кстати, по крайней мере в BP вместо forward можно было писать external с тем же
результатом, не знаю как в Delphi) все-таки актуален. Можно еще выпендриться: завести 2
процедурные переменные, присвоить им точки входа в эти процедуры и вызывать через них, но,
по-моему, это редко когда необходимо.



Андрей Сенченко   (2002-02-11 11:22) [7]

>> PVOzerski © (11.02.02 11:09)
>> мере в BP вместо forward можно было писать external

А что нам скажут по F1 в BP 7.0. ? Вот что скажут:

forward (procedure directive)
With a forward declaration, you can make a procedure or function known without actually specifying its statement part.
From the point of the forward declaration, other procedures and functions can call the forwarded routine, making mutual recursion possible.
Somewhere after a forward declaration, the procedure or function must be defined by a declaration that specifies the statement part of the routine.
The defining declaration can omit the parameter list from the procedure or function header.
Example:
(* Forwarded procedure *)
procedure Flip(N: Integer); forward;

procedure Flop(N: Integer);
begin
WriteLn("Flop");
if N > 0 then Flip(N - 1);
end;

procedure Flip;
begin
WriteLn("Flip");
if N > 0 then Flop(N - 1);
end;


external (procedure directive)
External declarations allow you to interface with separately compiled procedures and functions written in assembly language.
The external code is linked with the Pascal unit or program through $L filename compiler directives.
In procedures and functions imported from DLLs, the external directive takes the place of the declaration and statement parts that would otherwise be present.
Examples:
function GetMode: Word; external;
procedure SetMode(Mode: Word); external; $L CURSOR.OBJ
function GlobalAlloc(Flags: Word; Bytes: Longint): THandle; far; external
"KERNEL" index 15;


А что нам скажет букварь Фаронова по TP 5.0 ? Да примерно тоже самое, единственное что про DLL там конечно не упомянуто.

... No comments



PVOzerski   (2002-02-11 11:32) [8]

2Андрей Сенченко:
Вы уж простите меня, что я всуе помянул недокументированную фичу TP7 (кстати, в Delphi3, Delphi6
и FPC1.1 это не работает, только что проверил). Но вот в BP7 нижеследующий пример
скомпилировался и выполнился.

procedure pr1;
external;
procedure pr2;
begin
pr1;
end;
procedure pr1;
begin
writeln("Hello");
end;
begin
pr2;
end.



Андрей Сенченко   (2002-02-11 11:37) [9]

Тадыть это наверное уже никакая не фича а самый что ни на есть баг. Спасибо, что просветили :)




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.014 c
14-90652          SV                    2002-01-13 14:48  2002.02.28  
Алгоритм и ещё кое-что.


1-90573           chelobaka             2002-02-11 17:04  2002.02.28  
Делал проект под win2000, перенес на 98 - не работает. Помогите советом, плс.


14-90670          skiph                 2002-01-12 11:33  2002.02.28  
unix


4-90723           Ryder VII             2001-12-28 23:11  2002.02.28  
Что такое виндовый таймер?


1-90618           ProgrammerDelphi      2002-02-12 10:17  2002.02.28  
RichEdit