2011-10-16 33 views
8

Delphi programlama sahnesinde yeniyim ve konsol uygulamamdaki bir prosedürde bir prosedürü çağırmakta sorun yaşıyorum.Prosedür döngüsel referansı nasıl düzeltilir?

Basit uygulamam, Windows'ta bir telnet sunucusu üzerinden çalışan bir öğe envanteri içindir. Eski bir thinkpad'i, thinclient linux ve bir telnet istemcisi olarak kullanıyorum.

Delphi XE'yi Kullanma Bir tavuğa veya yumurta durumuna rastladım.

Addscreen bildirilmemiş belirteci aldım ... bildirildi ancak ana ekran altında! Ekrandaki bir prosedürü ekran görüntüsüne koyarsam, ekran görüntüsündeki herhangi bir çağrı, bana bildirilmemiş bir hata belirten ana ekran hatası verir!

Basit terimlerle, programda her yerde prosedürün nasıl aranması gerekir?

Arabirim ve uygulama denedim ancak bir konsol uygulama programında geçerli değil!

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. 

Çok teşekkür ederim!

+0

'Ana ekran' kodunu 'ana' programa taşımaktan ve daha fazla ifadeyi 'tekrar' döngüsüne taşımaktan daha iyi olur. –

cevap

13

Derleyici, dosyayı aşağıdan yukarıya doğru geçirir. addscreen numaralı çağrıyla uğraşması gereken noktada, henüz addscreen bildirmediniz.

Dairesel bir başvuru (addscreen çağrıları mainscreen ve bunun tersi) olduğundan, bir ileri referans olarak bilinen ile kırmanız gerekir. mainscreen

procedure addscreen; forward; 

Yani kod organizasyonu gibi görünmelidir önce bu satırı ekleyin:

procedure addscreen; forward; 

procedure mainscreen; 
begin 
    ... 
end; 

procedure addscreen; 
begin 
    ... 
end; 

o zaman basitçe prosedürleri yeniden düzenlemek olabilir döngüsel bir başvuru olmasaydı bu yüzden addscreen olduğunu mainscreen'dan önce beyan edilmiştir.

+3

Teşekkürler! Google'ın başarısız birçok aramalarından sonra, nihayet stackoverflow'ta doğru cevabı buldum! çok teşekkür ederim! – ELCouz

+1

Ve bir dahaki sefere bu soruyu ararken, Google’ın sorunuzu ve David'in stackoverflow üzerindeki cevabını bulabilirsiniz. – lkessler

+0

Dairesel referans, bunu yapmanın en iyi yolu olmayabilir, ancak ana kodda bir döngüye olan ihtiyacı ortadan kaldırır. Esasen ana kısım sadece ilk prosedürü çağırmak için kullanılır, sonra başka bir prosedürde dolaşır. Okumak zor, spagetti kodlaması ama işe yarıyor! Tekrar teşekkürler ! – ELCouz