Как исправить процедуру круговой ссылки? - PullRequest
8 голосов
/ 16 октября 2011

Я новичок в сцене программирования Delphi, и у меня возникают проблемы с вызовом процедуры в процедуре моего консольного приложения.

Мое простое приложение предназначено для инвентаризации предметов, проходящей через сервер telnet в Windows. Я использую старый ThinkPad в качестве моего thinclient под управлением Linux и клиента Telnet.

Используя Delphi XE, я столкнулся с ситуацией с курицей или яйцом.

Я получаю необъявленный идентификатор addcreen ... он объявлен, но в главном окне !!! Если я помещаю процедуру addcreen поверх основной, любой вызов mainscreen в процедуре addcreen вызывает ошибку необъявленного идентификатора mainscreen!

Проще говоря, как заставить процедуру вызываться везде в программе?

Я пробовал интерфейс и реализацию, но она недопустима в консольной прикладной программе!

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 Ответ

13 голосов
/ 16 октября 2011

Компилятор проходит через файл сверху вниз. В тот момент, когда ему нужно обработать вызов addscreen, вы еще не объявили addscreen.

Поскольку у вас есть циклическая ссылка (addscreen звонит mainscreen и наоборот), вам нужно разорвать ее с так называемой прямой ссылкой. Добавьте эту строку до mainscreen

procedure addscreen; forward;

Таким образом, организация кода должна выглядеть следующим образом:

procedure addscreen; forward;

procedure mainscreen;
begin
  ...
end;

procedure addscreen;
begin
  ...
end;

Если у вас нет циклической ссылки, вы можете просто переупорядочить процедуры так, чтобы addscreen был объявлен до mainscreen.

...