Несколько форм в одном проекте,.. ?!
Модератор: Модераторы
Несколько форм в одном проекте,.. ?!
Всем доброго времени суток!
Столкнулся с довольно неожиданной для себя проблемой,.. - создал проект с двумя формами и попробовал обратиться из модуля одной к компоненту расположенному на другой. Lazarus на это ругнулся, мол ничего не знаю про существование другой формы, и "потребовал" прописать ее в uses'ах. Сказано - сделано, все заработало превосходно,.. но не на долго, а ровно до тех пор пока я не попробовал проделать аналогичную операцию для второй формы! После этого система мне авторитетно заявила, что "Fatal: Circular unit reference ....".
Скажите... - это у меня голова под конец рабочего дня не соображает или в Lazarus для проектов с несколькими формами нужен особый подход?!
Столкнулся с довольно неожиданной для себя проблемой,.. - создал проект с двумя формами и попробовал обратиться из модуля одной к компоненту расположенному на другой. Lazarus на это ругнулся, мол ничего не знаю про существование другой формы, и "потребовал" прописать ее в uses'ах. Сказано - сделано, все заработало превосходно,.. но не на долго, а ровно до тех пор пока я не попробовал проделать аналогичную операцию для второй формы! После этого система мне авторитетно заявила, что "Fatal: Circular unit reference ....".
Скажите... - это у меня голова под конец рабочего дня не соображает или в Lazarus для проектов с несколькими формами нужен особый подход?!
Попробуй прописать 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 }Ракшас писал(а):Попробуй прописать uses не в interface, а в implementation
Спасибо, помогло!
Присоединюсь к вопросу, но немного видоизменю. Есть у меня несколько форм, на одной форме я размещаю DB Connection, DataSet, Query и так далее. Хочу в другой форме для DBLookupCombobox прописать датасет. Не в коде, а в обозревателе объектов. uses прописал, в коде можно такое проделать, а вот в IDE(имеется ввиду Lasarus) нельзя. В делфи такое даже в семерке проканывало. Не подскажете, чего я делаю не так?
2GreenDay У меня lazarus 0.9.29 сам находит подходящие компоненты из других форм и предлагает выбрать, попробуй его.
2Andreich вообще-то в дельфи был точно такой-же принцип.
2Andreich вообще-то в дельфи был точно такой-же принцип.
GreenDay
А версия какая? У меня 0.9.27, в редакторе свойств все работает (вроде даже можно в uses не прописывать, но точно не уверен).
А версия какая? У меня 0.9.27, в редакторе свойств все работает (вроде даже можно в uses не прописывать, но точно не уверен).
Добавлю и я сюда свой вопрос
. Предположим у меня в проекте 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.
Теперь вопрос - кто этими переключениями занимается и как бы это отключить?
Протестировал под разными системами, такая проблема только в виндовсе.
Скорее всего очередная ошибка в виджетсете.
Напиши в тему "Тестирование версии 0.9.27" если об этом еще не писали.
Скорее всего очередная ошибка в виджетсете.
Напиши в тему "Тестирование версии 0.9.27" если об этом еще не писали.
У меня 0.9.27. Такое наблюдается у элементов Data Controls и RxFpc. Такие элементы, как DataSet могут брать с другой формы сурсы. Куда написать говорите надо? И еще, у кого 0.9.29 проверьте, если нет такой проблемы, то я его поставлю.
Извините за серость.. Не так давно изучаю delphi/lazarus.
Программка состоит минимум из двух форм. На одной форме размещено все что относится к базам данных, нужно чтобы эта форма создавалась первой и была скрыта. А открывалась сразу другая форма. Запись ниже не действует..
Подскажите как правильно делать.
Программка состоит минимум из двух форм. На одной форме размещено все что относится к базам данных, нужно чтобы эта форма создавалась первой и была скрыта. А открывалась сразу другая форма. Запись ниже не действует..
Код: Выделить всё
Application.CreateForm(TDbForm, DbForm);
Application.CreateForm(TViewPervOtd, ViewPervOtd);
DbForm.Hide;
ViewPervOtd.Show;
Application.Run;Подскажите как правильно делать.
GreenDay используйте для хранения компонентов БД TDataModule
Вот блин, спасибо. Слоупок я. 
Ну а если все же возникнет описанная ситуация, то как поступить?
Ну а если все же возникнет описанная ситуация, то как поступить?
Проще всего
заменить на
Код: Выделить всё
Application.CreateForm(TDbForm, DbForm);
заменить на
Код: Выделить всё
DbForm := TDbForm.Create(Application);
- wofs
- постоялец
- Сообщения: 379
- Зарегистрирован: 05.10.2009 10:16:55
- Откуда: Астрахань
- Контактная информация:
А открывалась сразу другая форма. Запись ниже не действует..
Создать форму - не значит ее отобразить...
для того, чтоб отобразить форму используют ( по умолчанию отображается только первая из созданных форм - главная)
Код: Выделить всё
Form1.ShowModal;
или
Form1.Show;а вообще лучше создавать формы по мере необходимости в них, в коде приложения, но это мое сугуболичное мнение...
