2011-10-16 17 views
8

Soy nuevo en la escena de programación Delphi y tengo problemas para llamar un procedimiento en un procedimiento en mi aplicación de consola.Cómo reparar la referencia circular del procedimiento?

Mi aplicación simple es para un inventario de artículos que se ejecuta a través de un servidor telnet en Windows. Estoy usando un viejo thinkpad como mi thinclient corriendo Linux y un cliente de telnet.

Usando Delphi XE Me encontré con una situación de gallina o huevo.

Aparece el indentificador undeclared de addscreen ... está declarado pero bajo la pantalla principal !!! Si pongo un procedimiento de agregar pantalla sobre la pantalla principal, cualquier llamada a la pantalla principal en el procedimiento de agregar pantalla me convierte en un error en la pantalla principal del indentificador no declarado.

En términos simples, ¿cómo hacer que el procedimiento se llame a todas partes en el programa?

¡He intentado con la interfaz y la implementación, pero no es válido en un programa de aplicación de consola!

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. 

Muchas gracias!

+0

Será mejor que mueva el código 'pantalla principal' al programa 'principal' y mueva más instrucciones al ciclo 'repetir'. –

Respuesta

13

El compilador pasa por el archivo de arriba a abajo. En el punto donde necesita tratar la llamada al addscreen, aún no ha declarado addscreen.

Como tiene una referencia circular (addscreen llama a mainscreen y viceversa) necesita romper eso con lo que se conoce como referencia directa. Añadir esta línea antes mainscreen

procedure addscreen; forward; 

Así la organización del código debería tener este aspecto:

procedure addscreen; forward; 

procedure mainscreen; 
begin 
    ... 
end; 

procedure addscreen; 
begin 
    ... 
end; 

Si no tiene una referencia circular entonces se podría simplemente reordenar los procedimientos para que el addscreen era declarado antes de mainscreen.

+3

¡Gracias! Después de muchas búsquedas infructuosas de Google, ¡finalmente recibí la respuesta correcta en stackoverflow! ¡muchas gracias! – ELCouz

+1

Y la próxima vez que busque esta pregunta, encontrará en Google su pregunta y la respuesta de David en stackoverflow. – lkessler

+0

La referencia circular puede no ser la mejor manera de hacerlo, pero evita la necesidad de un bucle en el código principal. De hecho, la parte principal se utiliza solo para llamar al primer procedimiento y luego recorrer otro procedimiento. Difícil de leer, codificación de espagueti pero funciona! Gracias de nuevo ! – ELCouz

Cuestiones relacionadas