![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вложенные формы [D7, WinXP]
Serega_61 © (2007-05-24 17:31:00)Доброго времени суток.
Мне нужно сделать вложенные формы, одна в дгругую (как в фотошопе например). Вопрос конечно детский, но просто ниразу с этим не сталкивался, вот и решил спросить сразу у знающих людей. Если есть какие либо ссылки, киньте плз сюда.
Просто у меня на разных формах, разные компоненты. А я хочу сделать для всех форм единую панель управления. Поэтому хочу создать главную ( с панелью) и вставлять в эту форму дочерние. Все готово, осталось ток связать формы, подскажите как это сделать ;)
Serega_61 (2007-05-25 19:21:00) [1]Напиши мне, аська 319119277
или мыло fenix_ex@mail.ru
Показать могу)
{RASkov} (2007-05-25 19:12:00) [2]> [34] Serega_61 (25.05.07 19:06)
В двух словах я тебе сейчас не отвечу, так как, вариантов куча....
Пересмотри общий алгоритм программы....
В данном случае у тебя так же AV будет если не будет существовать Form3...
Если проект не большой и тебе не жалко его показать кинь куданить на рассмотрение, может чем и помогут тебе....
Serega_61 (2007-05-25 19:06:00) [3]м... ну вот смотри, допустим у меня в форме1 есть такая строчка:
mw:=trunc(mk*strtoint(form3.edit1.text));
при создании как ты говоришь, выдает ошибку, через Self, понял так и делаю теперь. Просто он пишет что неправильны адрес 'Access violation'.
{RASkov} (2007-05-25 19:01:00) [4]> [32] Serega_61 (25.05.07 18:56)
Прочитав [32] у меня сложился только один совет - переписать проект заново и нормально.
> может как то можно ограничить количество открываний форм
Можно...., но ты не потой дороге идешь, поверь.
Serega_61 (2007-05-25 18:56:00) [5]м... а если у меня из других окон идет обращение к данной форме... да и у меня есть обращение с формы Form1 к объектам с других форм... получается тогда все переписывать надо....
может как то можно ограничить количество открываний форм(или детерминировать ее перед созданием новой) путем Form1:=TForm1.Create(self); или pplication.CreateForm(TForm1, Form1);?
{RASkov} (2007-05-25 18:53:00) [6]> [29] Serega_61 (25.05.07 18:48)
> выдает ошибку при обращении потом к Form1.....
Ну нет у тебя Form1, как ты этого не поймешь :)
Везде Form1 (т.е. переменную(ые) дочернего(их) окна(он)) удали из модулей где они описаны и оброщайся к экземпляру дочерней формы по SELF !!!
{RASkov} (2007-05-25 18:50:00) [7]> [28] Serega_61 (25.05.07 18:45)
Ну напиши вот так:
procedure ButtonClick();
begin
TForm1.Create(Self).Show;
end;
> При любом обращении в коде к Form1.
Забудь про Form1 и еще лучше если и удалишь переменную в модуле описания дочки... И никаких обращений к переменной(Form1) НЕ ДОЛЖНО БЫТЬ!
Serega_61 (2007-05-25 18:48:00) [8]не
procedure ButtonClick();
begin
TChildForm.Create(Self).Show;
end;
а так
procedure ButtonClick();
begin
TForm1.Create(Self).Show;
end;
выдает ошибку при обращении потом к Form1.....
Serega_61 (2007-05-25 18:45:00) [9]после того как пишу:
procedure ButtonClick();
begin
TChildForm.Create(Self).Show;
end;
При любом обращении в коде к Form1.-||- происходит ошибка... в AutoCreate, и так удалил сразу.
а создавал потом так:
procedure ButtonClick();
begin
Application.CreateForm(TForm1, Form1);//работает все нормально, но если несколько раз нажать, то дублируются формы.
end;
{RASkov} (2007-05-25 18:42:00) [10]> TChildForm.Create(Self).Show;
и в нижнем примере из [26] [T]Form2 - одно и тоже, Т.е. дочка.
Просто сначала написал ButtonClick; а затем из делфи выдернул шаблон дпр вот и получилось несвязанно...
но думаю понятно...
{RASkov} (2007-05-25 18:37:00) [11]> [25] Serega_61 (25.05.07 18:21)
Создание дочек делай например так:
procedure ButtonClick();
begin
TChildForm.Create(Self).Show;
end;
Соответственно в OnClose дочерней Action=caFree;
И убери их(дочек) из AutoCreate, после в dpr должно быть нечто так:
uses
Forms,
Unit1 in 'Unit1.pas' {Form1}, //главная
Unit2 in 'Unit2.pas' {Form2}; //дочка
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
как видишь Application.CreateForm(TForm2, Form2); - нет.
Serega_61 (2007-05-25 18:21:00) [12]не. у меня стоит другая форма как основная. И она у меня изночально не создается... смотри, если написать подряд:
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm1, Form1);
то создастся сразу 3 формы. А мне нужно как нить ограничить. Просто вдруг пользователь не закрыл старую.
{RASkov} (2007-05-25 18:13:00) [13]> [23] Serega_61 (25.05.07 17:50)
> Вот токо одна проблема) Application.CreateForm(TForm1, Form1)
> ; создает форму, и если предыдущая не закрыта, то клонирует,
> как этого можно избежать? что бы не создавала дубликатов
> форм.
Убери ее из AutoCreate в опциях проекта....
Только TForm1, как правило, главная форма проекта, у тебя не так?
Serega_61 (2007-05-25 17:50:00) [14]Вот токо одна проблема) Application.CreateForm(TForm1, Form1); создает форму, и если предыдущая не закрыта, то клонирует, как этого можно избежать? что бы не создавала дубликатов форм.
XPMan (2007-05-25 17:45:00) [15]Хм... уже разобрался :)
XPMan (2007-05-25 17:45:00) [16]> [19] Serega_61 (25.05.07 17:34)
А зачем окно прятать когда его закрывают? Делай caFree... если опять нужно будет заново создавай его...
Или тебе именно Hide нужен для дочерних? А зачем?
Serega_61 (2007-05-25 17:42:00) [17]Все, разобрался))) может и не сильно корректно, но работает перед показам формы ее создаю Application.CreateForm(TForm1, Form1);
а закрываю форму через Action=caFree. Пока никаких косяков не найдено.
Serega_61 (2007-05-25 17:34:00) [18]хм. ставлю Action=caHide при закрытии выскакивает ошибка 'Cannot hide an MDI Child Form'.
{RASkov} (2007-05-25 14:45:00) [19]> [16] Serega_61 (25.05.07 13:04)
У MDI окон Action=caMinimize по умолчанию. Исправь как тебе надо на OnClose своих деток....
И не парься с изменением стиля... не верно это в твоем случае.
ANB (2007-05-25 14:26:00) [20]
> она сворачиваеся в угол основной формы, а не исчезает.
Ну дык так и должно быть.