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

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

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

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

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

Сообщение Andreich »

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

Скажите... - это у меня голова под конец рабочего дня не соображает или в Lazarus для проектов с несколькими формами нужен особый подход?!
Ракшас
незнакомец
Сообщения: 8
Зарегистрирован: 17.11.2008 16:07:35

Сообщение Ракшас »

Попробуй прописать 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 }
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Сообщение Andreich »

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

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

Сообщение GreenDay »

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

Сообщение carrots »

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

2Andreich вообще-то в дельфи был точно такой-же принцип.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

GreenDay
А версия какая? У меня 0.9.27, в редакторе свойств все работает (вроде даже можно в uses не прописывать, но точно не уверен).
VKB
новенький
Сообщения: 33
Зарегистрирован: 07.09.2009 13:57:35

Сообщение VKB »

Добавлю и я сюда свой вопрос :-). Предположим у меня в проекте 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.

Теперь вопрос - кто этими переключениями занимается и как бы это отключить?
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

Сообщение carrots »

Протестировал под разными системами, такая проблема только в виндовсе.
Скорее всего очередная ошибка в виджетсете.
Напиши в тему "Тестирование версии 0.9.27" если об этом еще не писали.
GreenDay
незнакомец
Сообщения: 5
Зарегистрирован: 30.09.2009 13:26:34

Сообщение GreenDay »

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

Сообщение GreenDay »

Извините за серость.. Не так давно изучаю delphi/lazarus.
Программка состоит минимум из двух форм. На одной форме размещено все что относится к базам данных, нужно чтобы эта форма создавалась первой и была скрыта. А открывалась сразу другая форма. Запись ниже не действует..

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

Application.CreateForm(TDbForm, DbForm);
  Application.CreateForm(TViewPervOtd, ViewPervOtd);
  DbForm.Hide;
  ViewPervOtd.Show;
  Application.Run;

Подскажите как правильно делать. :)
Аватара пользователя
Light13
постоялец
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Сообщение Light13 »

GreenDay используйте для хранения компонентов БД TDataModule
GreenDay
незнакомец
Сообщения: 5
Зарегистрирован: 30.09.2009 13:26:34

Сообщение GreenDay »

Вот блин, спасибо. Слоупок я. :)
Ну а если все же возникнет описанная ситуация, то как поступить?
Аватара пользователя
carrots
постоялец
Сообщения: 138
Зарегистрирован: 28.03.2008 01:13:02

Сообщение carrots »

Проще всего

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

   Application.CreateForm(TDbForm, DbForm);

заменить на

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

  DbForm := TDbForm.Create(Application);
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

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

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

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

Form1.ShowModal;
или
Form1.Show;

а вообще лучше создавать формы по мере необходимости в них, в коде приложения, но это мое сугуболичное мнение...
Ответить