2011-10-16 3 views
8

저는 델파이 프로그래밍 장면에서 새로운데, 제 콘솔 애플리케이션의 프로 시저에서 프로 시저를 호출하는 데 어려움이 있습니다.절차 순환 참조를 수정하는 방법?

내 간단한 응용 프로그램은 Windows의 텔넷 서버를 통해 실행되는 항목 인벤토리를위한 것입니다. 저는 리눅스와 텔넷 클라이언트를 실행하는 씬 클라이언트로 오래된 씽크 패드를 사용하고 있습니다.

Delphi XE를 사용하여 닭고기 또는 달걀에 부딪혔습니다.

선언되지 않은 식별자가 추가되었습니다 ... 선언되었지만 주 화면 아래에 있습니다! 메인 스크린 위에 addscreen 프로 시저를 추가하면, addscreen 프로 시저의 메인 스크린 호출이 선언되지 않은 identifier 메인 스크린에 오류가됩니다!

간단히 말해서, 프로그램에서 어디에서나 전화를 걸 수있는 절차를 만드는 방법은 무엇입니까?

인터페이스 및 구현을 시도했지만 콘솔 응용 프로그램에서 유효하지 않습니다!

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을 선언하지 않았습니다.

순환 참조 (addscreenmainscreen이고 그 반대의 경우도 있음)가 있으므로 전달 참조라고 알려진 내용으로 중단해야합니다. mainscreen

procedure addscreen; forward; 

그래서 코드의 구성은 다음과 같아야하기 전에이 줄을 추가

procedure addscreen; forward; 

procedure mainscreen; 
begin 
    ... 
end; 

procedure addscreen; 
begin 
    ... 
end; 

당신은 당신이 단순히 절차의 순서를 변경 할 수있는 순환 참조를 가지고 있지 않은 경우 그래서 addscreen는 것을 mainscreen 전에 신고되었습니다.

+3

감사합니다! Google의 많은 실패한 검색 후, 마침내 stackoverflow에 대한 정답을 얻을! 대단히 감사합니다! – ELCouz

+1

다음 번에이 질문을 검색하면 stackoverflow에 대한 질문과 David의 대답을 나열한 Google을 찾을 수 있습니다. – lkessler

+0

순환 참조가 가장 좋은 방법은 아니지만 주 코드에서 루프가 필요하지 않습니다. 실제로 주요 부분은 첫 번째 프로 시저를 호출 한 다음 다른 프로 시저에서 루프하는 데에만 사용됩니다. 읽기 어렵고, 스파게티 코딩이지만 작동합니다! 다시 한 번 감사드립니다! – ELCouz