delphi - 如何修复程序循环引用?

标签 delphi procedure circular-reference

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

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

使用 Delphi XE,我遇到了先有鸡还是先有蛋的情况。

我得到addscreen未声明的标识符...它已声明但在主屏幕下! 如果我将 addscreen 过程放在主屏幕上,则 addscreen 过程中对主屏幕的任何调用都会导致错误未声明的标识符主屏幕!

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

我尝试过接口(interface)和实现,但它在控制台应用程序中无效!

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.

非常感谢!

最佳答案

编译器从上到下遍历文件。当它需要处理对 addscreen 的调用时,您尚未声明 addscreen

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

之前添加此行
procedure addscreen; forward;

所以代码的组织应该如下所示:

procedure addscreen; forward;

procedure mainscreen;
begin
  ...
end;

procedure addscreen;
begin
  ...
end;

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

关于delphi - 如何修复程序循环引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7786717/

相关文章:

Informix 过程 — 如何返回空表?

oracle - 如何显示Oracle嵌套游标循环的错误消息

mysql - MySql中有递归存储过程吗?

spring - 如何使用 Spring MVC 测试避免 "Circular view path"异常

delphi - 在列中添加值

delphi - 当框架包含与客户端对齐的控件时,如何将框架恢复为继承?

delphi - GUID 的高效数据结构

sql - 防止 MS-SQL 表中的循环引用

mysql - 使用 Qlikview/QlikSense 中的公共(public)字段处理多个事实和多个实体表 (MySQL)

delphi - 使用 Delphi XE2 的“单元输出目录选项”中是否可以找到项目名称?