Форум: "Начинающим";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];
ВнизВложенные формы Найти похожие ветки
← →
Serega_61 (2007-05-24 17:31) [0]Доброго времени суток.
Мне нужно сделать вложенные формы, одна в дгругую (как в фотошопе например). Вопрос конечно детский, но просто ниразу с этим не сталкивался, вот и решил спросить сразу у знающих людей. Если есть какие либо ссылки, киньте плз сюда.
Просто у меня на разных формах, разные компоненты. А я хочу сделать для всех форм единую панель управления. Поэтому хочу создать главную ( с панелью) и вставлять в эту форму дочерние. Все готово, осталось ток связать формы, подскажите как это сделать ;)
← →
tesseract © (2007-05-24 17:33) [1]
> и вставлять в эту форму дочерние. Все готово, осталось ток
> связать формы, подскажите как это сделать ;)
Тебе нужны не формы, а фреймы - они для этого и сделаны.
← →
Jeer © (2007-05-24 17:36) [2]
> Serega_61 (24.05.07 17:31)
Сделай базовую форму, размести в репозитории и наследуй дочерние.
← →
DVM © (2007-05-24 17:37) [3]
> а фреймы - они для этого и сделаны.
ИМХО лучше уж формы, а не фреймы, тем более, что отличий никаких, а формы удобнее.
← →
tesseract © (2007-05-24 17:44) [4]
> ИМХО лучше уж формы, а не фреймы
А как в одну форму вставить в рантайм другую? А вот фрейм перемещая хоть в одну форму, хоть во вторую :-)
← →
Serega_61 (2007-05-24 17:52) [5]м...мне рантайм и надо что бы формы вставлялись в главную. А фреймы, у меня уже все под формы заточено, много думаю менять придется. Как нить формами можно обойтись?
← →
McSimm_ © (2007-05-24 17:57) [6]
> создать главную ( с панелью) и вставлять в эту форму дочерние.
MDI ?
← →
Serega_61 (2007-05-24 19:23) [7]м... ну я создаю просо главную форму, и потом file-new-form.
← →
{RASkov} © (2007-05-24 19:30) [8]> [7] Serega_61 (24.05.07 19:23)
См [6]
+
У главной стиль формы выставь fsMDIForm, у дочерних - fsMDIChild
← →
Serega_61 (2007-05-24 21:07) [9]Всем огромное спасибо) привел к более менее нормальному виду) ток пришлось немного обойти.
Вначале все дочерние формы имеют стиль fsNormal. Потом перед разворачиванием определенной делаю стиль fsMDIChild. Что бы закрыть, опять нормал и висибл фалс. Только при закрытиии происходит мигание экрана, форма стоит wsMaximized и поэтому когда делаю ситьль она растягивается, и ток потом инвиз. Как можно избежать этого мерцания?)
← →
DVM © (2007-05-24 21:16) [10]
> tesseract © (24.05.07 17:44) [4]
> А как в одну форму вставить в рантайм другую? А вот фрейм
> перемещая хоть в одну форму, хоть во вторую :-)
Так и форму можно одну в другую :) Только автору вопроса MDI надо однозначно.
← →
Serega_61 (2007-05-24 21:38) [11]Угу рантайм все гуд, вот токо мерцание немного напрягает... просто visible нельзя трогать пока не уберешь FormStyle на fsNormal. Хз как от мирцания избавиться.
← →
Dilmo © (2007-05-25 05:46) [12]
> Что бы закрыть, опять нормал и висибл фалс.
а зачем возвращать в нормал ?
← →
Dilmo © (2007-05-25 05:48) [13]используй Form.Close и без всяких визиблов
ну и можно еще ивент прописать OnClose
Action := caFree; чтобы убивалась форма при закрытии
← →
Serega_61 (2007-05-25 12:26) [14]м... вот еще одна проблемка возникла. Ставлю Максимайзед. и потом дочерний стиль.
у меня основная форма изночально развернута не на весь экран, потом если развернуть, то дочерняя форма будет не на весь размер, а в размер, которы был до этого. Если на дочерную форму поставить фокус( клинкнуть мышкой) и повторить, то она разворачивается уже на весь размер родительского окна.
Как можно программно это сделать, просто в OnShow ставлю SetFocus, пишет ошибку.
← →
{RASkov} © (2007-05-25 12:55) [15]> Вначале все дочерние формы имеют стиль fsNormal. Потом перед
> разворачиванием определенной делаю стиль fsMDIChild. Что
> бы закрыть, опять нормал и висибл фалс.
Зачем окнам стиль-то по ходу программы менять?
Ты что-то не по той дороге идешь... и [14] сюда же..
← →
Serega_61 (2007-05-25 13:04) [16]я же говорил, что если она всегда fsMDIChild, то при ее сворачивании, она сворачиваеся в угол основной формы, а не исчезает. Если вернуть ей обычное значения стиля, то прячется полностью.
а насчет [14], там нужно фокус дать форме (что бы он дочернее окно растянул потом по всем у размеру родительского), просто у меня нет ни едитов, ничего такого на форме, поэтому фокус автоматически не переходит.
← →
ANB © (2007-05-25 14:26) [17]
> она сворачиваеся в угол основной формы, а не исчезает.
Ну дык так и должно быть.
← →
{RASkov} © (2007-05-25 14:45) [18]> [16] Serega_61 (25.05.07 13:04)
У MDI окон Action=caMinimize по умолчанию. Исправь как тебе надо на OnClose своих деток....
И не парься с изменением стиля... не верно это в твоем случае.
← →
Serega_61 (2007-05-25 17:34) [19]хм. ставлю Action=caHide при закрытии выскакивает ошибка "Cannot hide an MDI Child Form".
← →
Serega_61 (2007-05-25 17:42) [20]Все, разобрался))) может и не сильно корректно, но работает перед показам формы ее создаю Application.CreateForm(TForm1, Form1);
а закрываю форму через Action=caFree. Пока никаких косяков не найдено.
← →
XPMan (2007-05-25 17:45) [21]> [19] Serega_61 (25.05.07 17:34)
А зачем окно прятать когда его закрывают? Делай caFree... если опять нужно будет заново создавай его...
Или тебе именно Hide нужен для дочерних? А зачем?
← →
XPMan (2007-05-25 17:45) [22]Хм... уже разобрался :)
← →
Serega_61 (2007-05-25 17:50) [23]Вот токо одна проблема) Application.CreateForm(TForm1, Form1); создает форму, и если предыдущая не закрыта, то клонирует, как этого можно избежать? что бы не создавала дубликатов форм.
← →
{RASkov} © (2007-05-25 18:13) [24]> [23] Serega_61 (25.05.07 17:50)
> Вот токо одна проблема) Application.CreateForm(TForm1, Form1)
> ; создает форму, и если предыдущая не закрыта, то клонирует,
> как этого можно избежать? что бы не создавала дубликатов
> форм.
Убери ее из AutoCreate в опциях проекта....
Только TForm1, как правило, главная форма проекта, у тебя не так?
← →
Serega_61 (2007-05-25 18:21) [25]не. у меня стоит другая форма как основная. И она у меня изночально не создается... смотри, если написать подряд:
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm1, Form1);
то создастся сразу 3 формы. А мне нужно как нить ограничить. Просто вдруг пользователь не закрыл старую.
← →
{RASkov} © (2007-05-25 18:37) [26]> [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); - нет.
← →
{RASkov} © (2007-05-25 18:42) [27]> TChildForm.Create(Self).Show;
и в нижнем примере из [26] [T]Form2 - одно и тоже, Т.е. дочка.
Просто сначала написал ButtonClick; а затем из делфи выдернул шаблон дпр вот и получилось несвязанно...
но думаю понятно...
← →
Serega_61 (2007-05-25 18:45) [28]после того как пишу:
procedure ButtonClick();
begin
TChildForm.Create(Self).Show;
end;
При любом обращении в коде к Form1.-||- происходит ошибка... в AutoCreate, и так удалил сразу.
а создавал потом так:
procedure ButtonClick();
begin
Application.CreateForm(TForm1, Form1);//работает все нормально, но если несколько раз нажать, то дублируются формы.
end;
← →
Serega_61 (2007-05-25 18:48) [29]не
procedure ButtonClick();
begin
TChildForm.Create(Self).Show;
end;
а так
procedure ButtonClick();
begin
TForm1.Create(Self).Show;
end;
выдает ошибку при обращении потом к Form1.....
← →
{RASkov} © (2007-05-25 18:50) [30]> [28] Serega_61 (25.05.07 18:45)
Ну напиши вот так:
procedure ButtonClick();
begin
TForm1.Create(Self).Show;
end;
> При любом обращении в коде к Form1.
Забудь про Form1 и еще лучше если и удалишь переменную в модуле описания дочки... И никаких обращений к переменной(Form1) НЕ ДОЛЖНО БЫТЬ!
← →
{RASkov} © (2007-05-25 18:53) [31]> [29] Serega_61 (25.05.07 18:48)
> выдает ошибку при обращении потом к Form1.....
Ну нет у тебя Form1, как ты этого не поймешь :)
Везде Form1 (т.е. переменную(ые) дочернего(их) окна(он)) удали из модулей где они описаны и оброщайся к экземпляру дочерней формы по SELF !!!
← →
Serega_61 (2007-05-25 18:56) [32]м... а если у меня из других окон идет обращение к данной форме... да и у меня есть обращение с формы Form1 к объектам с других форм... получается тогда все переписывать надо....
может как то можно ограничить количество открываний форм(или детерминировать ее перед созданием новой) путем Form1:=TForm1.Create(self); или pplication.CreateForm(TForm1, Form1);?
← →
{RASkov} © (2007-05-25 19:01) [33]> [32] Serega_61 (25.05.07 18:56)
Прочитав [32] у меня сложился только один совет - переписать проект заново и нормально.
> может как то можно ограничить количество открываний форм
Можно...., но ты не потой дороге идешь, поверь.
← →
Serega_61 (2007-05-25 19:06) [34]м... ну вот смотри, допустим у меня в форме1 есть такая строчка:
mw:=trunc(mk*strtoint(form3.edit1.text));
при создании как ты говоришь, выдает ошибку, через Self, понял так и делаю теперь. Просто он пишет что неправильны адрес "Access violation".
← →
{RASkov} © (2007-05-25 19:12) [35]> [34] Serega_61 (25.05.07 19:06)
В двух словах я тебе сейчас не отвечу, так как, вариантов куча....
Пересмотри общий алгоритм программы....
В данном случае у тебя так же AV будет если не будет существовать Form3...
Если проект не большой и тебе не жалко его показать кинь куданить на рассмотрение, может чем и помогут тебе....
← →
Serega_61 (2007-05-25 19:21) [36]Напиши мне, аська 319119277
или мыло fenix_ex@mail.ru
Показать могу)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.043 c