Используйте элементы управления другой формы

У меня есть проект на Lazarus, в котором есть две формы: FormMain и OutputForm. Я хочу показать вывод на OutputMemo во второй форме с помощью этого кода:

procedure FormMain.ShowButton(Object: Sender);
begin 
  if SaveDialog1.Execute then 
    AProcess := TProcess.Create(nil); 
  AProcess.CommandLine := 'gcc.exe ' + SaveDialog1.FileName + ' -o ' TextField23.Text; 
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes]; 
  AProcess.Execute; 

  OutputForm.OutputMemo.Lines.BeginUpdate; 
  //OutputForm.OutputMemo.Lines.Clear; 
  OutputForm.OutputMemo.Lines.LoadFromStream(AProcess.Output); 
  OutputForm.OutputMemo.Lines.EndUpdate; 

  AProcess.Free; 
end;

Но когда я пытаюсь скомпилировать этот код, я получаю ошибку:

Идентификатор не найден "OutputForm"

В верхней части модуля OutputForm у меня есть:

unit Output;

И когда я пытаюсь вызвать его из модуля FormMain (OutputForm: Output;), я получаю эту ошибку:

Ошибка в определении типа

Что мне нужно сделать?


person Nathan Campos    schedule 28.12.2009    source источник
comment
попробуйте добавить модуль OutputForm в предложение использования.   -  person RRUZ    schedule 28.12.2009
comment
Натан, как только вы получите эту компиляцию, убедитесь, что вы проверили случай, когда вы отменили диалоговое окно «Сохранить». Редактирование вашего вопроса для улучшения отступа кода заставило меня заметить логическую ошибку для этого варианта использования.   -  person Rob Kennedy    schedule 28.12.2009


Ответы (2)


Как сказал RRUZ, вам нужна ссылка на модуль, где объявлен OutputForm. Вот основная идея:

Каждая форма имеет файл объявления формы (DFM в Delphi; я думаю, Lazarus называет их LFM) и соответствующий модульный файл Object Pascal (.PAS), куда вы помещаете их код. Это обычный файл unit, как и любой другой, с точки зрения компилятора. Единственное отличие состоит в том, что с ним связана форма.

Откройте код OutputForm и посмотрите вверху. Он скажет что-то вроде "unit OutputForm;" Скопируйте имя модуля и вставьте его в предложение uses модуля FormMain, после чего все должно работать.

EDIT: Не совсем уверен, что вы пытаетесь сделать с этим редактированием, но вам не нужно повторно объявлять OutputForm. Она уже должна быть объявлена ​​как глобальная переменная в модуле вывода. Вам просто нужно добавить Output в предложение uses, так что вы получите что-то похожее на это:

unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Output; //on a separate line to show it's not a system lib

type
  TFrmMain = class(TForm)
  ...
person Mason Wheeler    schedule 28.12.2009
comment
Взгляните на вопрос сейчас, пожалуйста. - person Nathan Campos; 28.12.2009

Хм, разве "выход" не является зарезервированным словом в Паскале?

person dummzeuch    schedule 28.12.2009
comment
Я предлагаю возможный ответ. Я недостаточно знаю о Лазаре, чтобы понять, так ли это. - person dummzeuch; 31.12.2009