Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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]

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



Страницы: 1 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.004 c
3-90521
a1st
2002-02-05 16:42
2002.02.28
qreport 3.0 -> 3.0.5 - перестало работать!?


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


1-90616
Tadeush
2002-02-12 05:49
2002.02.28
ошибка во времени создания файла


1-90554
novomod
2002-02-08 15:10
2002.02.28
TLabel.Backspace.Help!


14-90658
Mz
2002-01-15 10:19
2002.02.28
Статья





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский