Несколько форм в одном проекте,.. ?!

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Несколько форм в одном проекте,.. ?!

Сообщение Andreich » 26.11.2008 22:21:35

Всем доброго времени суток!
Столкнулся с довольно неожиданной для себя проблемой,.. - создал проект с двумя формами и попробовал обратиться из модуля одной к компоненту расположенному на другой. Lazarus на это ругнулся, мол ничего не знаю про существование другой формы, и "потребовал" прописать ее в uses'ах. Сказано - сделано, все заработало превосходно,.. но не на долго, а ровно до тех пор пока я не попробовал проделать аналогичную операцию для второй формы! После этого система мне авторитетно заявила, что "Fatal: Circular unit reference ....".

Скажите... - это у меня голова под конец рабочего дня не соображает или в Lazarus для проектов с несколькими формами нужен особый подход?!
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Несколько форм в одном проекте,.. ?!

Сообщение Ракшас » 26.11.2008 22:47:39

Попробуй прописать uses не в interface, а в implementation, как показано ниже.

Код: Выделить всё
unit Main;
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

type
  { TFormMain }
  TFormMain = class(TForm)
  private
    { private declarations }
  public
    { public declarations }
  end;

implementation

uses calc;

{ TFormMain }
Ракшас
незнакомец
 
Сообщения: 8
Зарегистрирован: 17.11.2008 17:07:35

Re: Несколько форм в одном проекте,.. ?!

Сообщение Andreich » 26.11.2008 23:21:06

Ракшас писал(а):Попробуй прописать uses не в interface, а в implementation

Спасибо, помогло! :)
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Несколько форм в одном проекте,.. ?!

Сообщение GreenDay » 30.09.2009 13:35:35

Присоединюсь к вопросу, но немного видоизменю. Есть у меня несколько форм, на одной форме я размещаю DB Connection, DataSet, Query и так далее. Хочу в другой форме для DBLookupCombobox прописать датасет. Не в коде, а в обозревателе объектов. uses прописал, в коде можно такое проделать, а вот в IDE(имеется ввиду Lasarus) нельзя. В делфи такое даже в семерке проканывало. Не подскажете, чего я делаю не так?
GreenDay
незнакомец
 
Сообщения: 5
Зарегистрирован: 30.09.2009 13:26:34

Re: Несколько форм в одном проекте,.. ?!

Сообщение carrots » 30.09.2009 14:47:30

2GreenDay У меня lazarus 0.9.29 сам находит подходящие компоненты из других форм и предлагает выбрать, попробуй его.

2Andreich вообще-то в дельфи был точно такой-же принцип.
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Несколько форм в одном проекте,.. ?!

Сообщение Climber » 30.09.2009 15:38:45

GreenDay
А версия какая? У меня 0.9.27, в редакторе свойств все работает (вроде даже можно в uses не прописывать, но точно не уверен).
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Несколько форм в одном проекте,.. ?!

Сообщение VKB » 30.09.2009 16:25:22

Добавлю и я сюда свой вопрос :-). Предположим у меня в проекте 2 формы. Вторую вызываю (показываю, она создаётся при старте приложения) по нажатию на кнопку на главной форме в немодальном режиме. Заметил, что есть следующая функциональность - если фокус находится у второй формы, то при нажатии (точнее при последующем отжатии) кнопки Alt фокус временно переходит к главной форме (может быть это следствие того, что там должно быть меню, но у меня там меню никакого нет). И если ещё раз нажать (тут уже именно реакция на нажатие) Alt, то фокус вернётся на вторую форму.

Код: Выделить всё
program Project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1, LResources, Unit2
  { you can add units after this };

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

begin
  {$I project1.lrs}
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  Unit2;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
  begin
    Form2.Show;
  end;

initialization
  {$I unit1.lrs}

end.

Код: Выделить всё
unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs;

type
  TForm2 = class(TForm)
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form2: TForm2;

implementation

initialization
  {$I unit2.lrs}

end.

Теперь вопрос - кто этими переключениями занимается и как бы это отключить?
VKB
новенький
 
Сообщения: 33
Зарегистрирован: 07.09.2009 13:57:35

Re: Несколько форм в одном проекте,.. ?!

Сообщение carrots » 01.10.2009 15:41:33

Протестировал под разными системами, такая проблема только в виндовсе.
Скорее всего очередная ошибка в виджетсете.
Напиши в тему "Тестирование версии 0.9.27" если об этом еще не писали.
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Несколько форм в одном проекте,.. ?!

Сообщение GreenDay » 02.10.2009 10:40:37

У меня 0.9.27. Такое наблюдается у элементов Data Controls и RxFpc. Такие элементы, как DataSet могут брать с другой формы сурсы. Куда написать говорите надо? И еще, у кого 0.9.29 проверьте, если нет такой проблемы, то я его поставлю.
GreenDay
незнакомец
 
Сообщения: 5
Зарегистрирован: 30.09.2009 13:26:34

Re: Несколько форм в одном проекте,.. ?!

Сообщение GreenDay » 06.10.2009 14:07:20

Извините за серость.. Не так давно изучаю delphi/lazarus.
Программка состоит минимум из двух форм. На одной форме размещено все что относится к базам данных, нужно чтобы эта форма создавалась первой и была скрыта. А открывалась сразу другая форма. Запись ниже не действует..
Код: Выделить всё
Application.CreateForm(TDbForm, DbForm);
  Application.CreateForm(TViewPervOtd, ViewPervOtd);
  DbForm.Hide;
  ViewPervOtd.Show;
  Application.Run;

Подскажите как правильно делать. :)
GreenDay
незнакомец
 
Сообщения: 5
Зарегистрирован: 30.09.2009 13:26:34

Re: Несколько форм в одном проекте,.. ?!

Сообщение Light13 » 06.10.2009 14:15:55

GreenDay используйте для хранения компонентов БД TDataModule
Аватара пользователя
Light13
постоялец
 
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Re: Несколько форм в одном проекте,.. ?!

Сообщение GreenDay » 06.10.2009 14:20:24

Вот блин, спасибо. Слоупок я. :)
Ну а если все же возникнет описанная ситуация, то как поступить?
GreenDay
незнакомец
 
Сообщения: 5
Зарегистрирован: 30.09.2009 13:26:34

Re: Несколько форм в одном проекте,.. ?!

Сообщение carrots » 06.10.2009 15:46:34

Проще всего
Код: Выделить всё
   Application.CreateForm(TDbForm, DbForm);

заменить на
Код: Выделить всё
  DbForm := TDbForm.Create(Application);
Аватара пользователя
carrots
постоялец
 
Сообщения: 138
Зарегистрирован: 28.03.2008 02:13:02

Re: Несколько форм в одном проекте,.. ?!

Сообщение wofs » 06.10.2009 15:48:23

А открывалась сразу другая форма. Запись ниже не действует..

Создать форму - не значит ее отобразить...
для того, чтоб отобразить форму используют ( по умолчанию отображается только первая из созданных форм - главная)
Код: Выделить всё
Form1.ShowModal;
или
Form1.Show;

а вообще лучше создавать формы по мере необходимости в них, в коде приложения, но это мое сугуболичное мнение...
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34

Рейтинг@Mail.ru