2011-10-16 12 views
8

私はDelphiのプログラミングシーンでは新しく、コンソールアプリケーションのプロシージャでプロシージャを呼び出すのに問題があります。プロシージャ循環参照を修正するには?

私の単純なアプリケーションは、Windows上のTelnetサーバーを介して実行されるアイテムインベントリ用です。 私はLinuxとtelnetクライアントを実行しているシンクライアントとして古いThinkPadを使用しています。

私はDelphi XEを使用して、鶏肉や卵の状況に遭遇しました。

私は、宣言されていない追加の識別子を取得します...それは宣言されているがメインスクリーンの下にあります! メインスクリーン上にaddscreenプロシージャを置くと、addscreenプロシージャのmainscreenを呼び出すと、宣言されていないインデント化メイン画面がエラーになります!

簡単な言い方をすれば、プログラム内のどこでも呼び出すためのプロシージャを作る方法は?

インターフェイスと実装を試しましたが、コンソールアプリケーションプログラムでは無効です。

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

'mainscreen'コードを 'main'プログラムに移動し、さらに多くのステートメントを 'repeat'ループに移動する方がよいでしょう。 –

答えて

13

コンパイラはファイルを上から下に通過します。 addscreenへの呼び出しに対処する必要がある時点で、まだaddscreenと宣言していません。

循環参照(addscreenmainscreenと、逆も同様です)があるので、前方参照と呼ばれるものでそれを解除する必要があります。だから、コードの組織は次のようになりますmainscreen

procedure addscreen; forward; 

前にこの行を追加します。

procedure addscreen; forward; 

procedure mainscreen; 
begin 
    ... 
end; 

procedure addscreen; 
begin 
    ... 
end; 

あなたが循環参照を持っていなかった場合はaddscreenだったように、そして、あなたは、単に手順を並べ替えることができmainscreenの前に宣言しました。

+3

ありがとう! Googleの多くの失敗した検索の後、私は最終的にstackoverflowで正しい答えを得る!どうもありがとうございました! – ELCouz

+1

次回この質問を検索すると、あなたの質問とDavidoverの回答がstackoverflowに掲載されています。 – lkessler

+0

循環参照は、これを実行する最善の方法ではないかもしれませんが、メインコードにループを必要としません。実際には主要な部分は、最初のプロシージャを呼び出してから、他のプロシージャでループするためにのみ使用されます。読みにくく、スパゲッティコーディングが効いています!再度、感謝します ! – ELCouz

関連する問題