2011-10-16 16 views
8

मैं डेल्फी प्रोग्रामिंग दृश्य में नया हूं और मुझे अपने कंसोल एप्लिकेशन में एक प्रक्रिया में प्रक्रिया को कॉल करने में परेशानी है।प्रक्रिया परिपत्र संदर्भ कैसे ठीक करें?

मेरा सरल एप्लिकेशन विंडोज़ पर एक टेलनेट सर्वर के माध्यम से चल रहे आइटम सूची के लिए है। मैं अपने पतले चलने वाले लिनक्स और टेलनेट क्लाइंट के रूप में एक पुराने थिंकपैड का उपयोग कर रहा हूं।

डेल्फी एक्सई का उपयोग करके मैं चिकन या अंडे की स्थिति में भाग गया हूं।

मुझे एडस्क्रीन अविकसित इंडेंटिफायर मिलता है ... इसे घोषित किया जाता है लेकिन मेनस्क्रीन के तहत !!! यदि मैं मेनस्क्रीन पर एकस्क्रीन प्रक्रिया डालता हूं, तो ऐडस्क्रीन प्रक्रिया में मेनस्क्रीन के लिए कोई भी कॉल मुझे एक त्रुटि अविकसित इंडेंटिफायर मेनस्क्रीन बनाता है!

सरल शब्दों में, प्रोग्राम में हर जगह कॉल करने की प्रक्रिया कैसे करें?

मैंने इंटरफ़ेस और कार्यान्वयन का प्रयास किया है लेकिन यह कंसोल एप्लिकेशन प्रोग्राम में मान्य नहीं है!

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

धन्यवाद! Google की कई असफल खोजों के बाद, मुझे अंत में स्टैक ओवरफ्लो पर सही उत्तर मिल गया! आपका बहुत बहुत धन्यवाद! – ELCouz

+1

और अगली बार जब आप इस प्रश्न की खोज करेंगे, तो आप Google को अपने प्रश्न और डेविड के जवाब को स्टैक ओवरफ्लो पर सूचीबद्ध करेंगे। – lkessler

+0

परिपत्र संदर्भ ऐसा करने का सबसे अच्छा तरीका नहीं हो सकता है लेकिन यह मुख्य कोड में लूप की आवश्यकता से बचता है। वास्तव में मुख्य भाग केवल पहली प्रक्रिया को कॉल करने के लिए उपयोग किया जाता है, फिर अन्य प्रक्रिया में लूप करें। पढ़ने के लिए मुश्किल, स्पेगेटी कोडिंग लेकिन यह काम करता है! एक बार फिर धन्यवाद ! – ELCouz

संबंधित मुद्दे