如何修复程序循环引用?

时间:2011-10-16 19:28:39

标签: delphi procedure circular-reference

我是Delphi编程场景的新手,我在控制台应用程序中调用过程时遇到问题。

我的简单应用程序是通过Windows上的telnet服务器运行的项目库存。 我使用旧的thinkpad作为我的瘦客户端运行linux和telnet客户端。

使用Delphi XE我遇到了鸡或蛋的情况。

我得到了addscreen未声明的标识符......它被声明但是在主屏幕下! 如果我把addscreen程序放在主屏幕上,那么在添加屏幕程序中对主屏幕的任何调用都会让我误认为是未标明的标识主屏幕!

简单来说,如何让程序在程序中到处调用?

我已尝试过界面和实现,但它在控制台应用程序中无效!

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.

非常感谢!

1 个答案:

答案 0 :(得分:13)

编译器从上到下传递文件。在需要处理对addscreen的调用时,您尚未声明addscreen

由于您有循环引用(addscreen调用mainscreen,反之亦然),您需要使用所谓的前向引用来打破它。在mainscreen

之前添加此行
procedure addscreen; forward;

因此代码的组织应如下所示:

procedure addscreen; forward;

procedure mainscreen;
begin
  ...
end;

procedure addscreen;
begin
  ...
end;

如果您没有循环引用,那么您可以简单地重新排序程序,以便在addscreen之前声明mainscreen