2011-10-16 97 views
8

我是Delphi編程環境中的新手,我無法在控制檯應用程序中調用過程中的過程。如何解決程序循環參考?

我的簡單應用是通過Windows上的telnet服務器運行項目清單。 我使用舊的ThinkPad作爲我的瘦客戶端運行Linux和Telnet客戶端。

使用Delphi XE我遇到了雞或雞蛋的情況。

我得到addscreen未申報indentifier ...它被宣佈,但在主屏幕下! 如果我把addscreen程序放在主屏幕上,任何在addscreen程序中對主屏幕的調用都會使我不知道標識的主屏幕出現錯誤!

簡而言之,如何使程序在程序中隨處調用?

我試過接口和實現,但它在控制檯應用程序中無效!

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, windows, messages, Console in 'Console.pas'; 


procedure mainscreen; 
var 
    choice: string; 
begin 
    clrscr; 
    writeln(' ------------------------------------------------------------------------------------------------------------------------------'); 
    writeln(' |          Inventory Management 0.1 ALPHA               |'); 
    writeln(' ------------------------------------------------------------------------------------------------------------------------------'); 
    writeln(''); 
    writeln(''); 
    writeln(''); 
    writeln(''); 
    writeln(''); 
    writeln(' Make a choice: Add(a), Remove(r), Edit(e), Backup Database(bd), Mass Add(ma), Mass Remove(mr)'); 
    writeln('?:'); 
    readln(choice); 

    if choice = 'a' then 
    addscreen 
    else 
    mainscreen; 
end; 

procedure addscreen; 
var 
    choice: string; 
begin 
    clrscr; 
    writeln(' ------------------------------------------------------------------------------------------------------------------------------'); 
    writeln(' |              Add an Item               |'); 
    writeln(' ------------------------------------------------------------------------------------------------------------------------------'); 
    writeln(''); 
    writeln(''); 
    writeln(''); 
    writeln(' Not yet ready!'); 
    writeln(' Press any key to return to the main menu...'); 
    readln(choice); 

    mainscreen; 
end; 

begin 
    mainscreen; 
    textbackground(black); 
    textcolor(lightgray); 
    ExitProcess(0); 
end. 

非常感謝!

+0

將'主屏幕'代碼移動到'主'程序並將更多語句移動到'重複'循環中會更好。 –

回答

13

編譯器從上到下傳遞文件。在需要處理對addscreen的呼叫時,您尚未聲明addscreen

由於您有一個循環參考(addscreen調用mainscreen,反之亦然),您需要使用所謂的前向參考來打破這種情況。加入這一行之前mainscreen

procedure addscreen; forward; 

因此,代碼的組織應該是這樣的:

procedure addscreen; forward; 

procedure mainscreen; 
begin 
    ... 
end; 

procedure addscreen; 
begin 
    ... 
end; 

如果你沒有一個循環引用,那麼你可以簡單地重新排列程序,讓addscreen是在mainscreen之前宣佈。

+3

謝謝!經過很多不成功的谷歌搜索之後,我終於在stackoverflow上得到了正確的答案!非常感謝你! – ELCouz

+1

下一次你搜索這個問題時,你會發現谷歌列出你的問題和大衛的答案在stackoverflow。 – lkessler

+0

循環引用可能不是實現它的最好方式,但它避免了在主代碼中需要循環。實際上,主要部分僅用於調用第一個過程,然後在其他過程中循環。很難讀,意大利麪條編碼,但它的作品!再次感謝 ! – ELCouz