![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Диномическое создать и убить форму. [D7, WinXP]
Дмитрий_05 © (2005-11-28 19:40:00)У меня в проекте находится две вормы, основная(Form1) автоматически создается, а вторая(Form2) по нажатию кнопки..
Form2 := TForm2.Create(Application);
Form2.Show;
форма создается, пока все нормально...
во второй форме по нажатию там на кнопку она закрывается и убивается:
Form2.Close;
Form2.Free;
и тут выскакивает ошибка "Control has not parent window", если убрать строку Form2.Free; то все нормально, но как убивать форму тогда непонятно...
Defunct (2005-12-01 01:14:00) [1]Дмитрий_05 (30.11.05 12:46) [17]
В OnClose второй формы:
Form2 := nil;
Action := caFree;
Дмитрий_05 (2005-11-30 21:17:00) [2]а в Screen.Forms хранятся все формы моего приложения? т.е. вы имеете в виду цикле менять положения всех форм по индексам? Я правильно понял? ))
Anatoly Podgoretsky (2005-11-30 19:53:00) [3]А зачем переменная и тем более зачем делать такие странные выводе о существовании формы по нет. Для это существует Screen.Forms
Дмитрий_05 (2005-11-30 18:56:00) [4]мне кажется что после создания второй формы и ее закрытия Action := caFree; в событии FormClose, переменная Form2 остается заполненной, т.е. при определении условием if Assigned(Form2) then форма определяется как созданная...
Дмитрий_05 (2005-11-30 18:30:00) [5]а что здесь неправильного? мне нужно чтобы координаты левой точки у них были одинаковыми... а как тогда надо?
Плохиш (2005-11-30 18:03:00) [6]
> Дмитрий_05 (30.11.05 17:12) [18]
> неужели никто не знает в чем дело? (((
Ну я знаю, вот в этом
> Form2.Left := Form1.Left;
Прекрати бездумно топтать кнопки и займись, наконец, чтением литературы.
Дмитрий_05 (2005-11-30 17:12:00) [7]неужели никто не знает в чем дело? (((
Дмитрий_05 (2005-11-30 12:46:00) [8]Сделал я обработку WM_MOVE в первой форме:
procedure WMMove(var Message: TWMMOVE); Message WM_MOVE;
...
procedure TForm1.WMMove(var Message: TWMMOVE);
begin
if Assigned(Form2) then
begin
Form2.Left := Form1.Left;
Form2.Top := Form1.Top + Form1.Height;
end;
end;
Все нормально, при запуске певая форма перемещается, создаю вторую форму, при перемещении первой формы вторая тоже переносится... Но! Потом когда закрою(при закрытии она еще убивается) вторую форму, при попытке перенести первую форму выскакивает ошибка AV :( Прбовал вместо
Form2.Left := Form1.Left;
Form2.Top := Form1.Top + Form1.Height;
Посылать второй форме:
SendMessage(Form2.Handle, WM_MOVE, Message.XPos, Message.YPos);
но тогда вторая форме не перемещается при перемещении первой... Что делать, помогите...
gdaujk (2005-11-30 07:04:00) [9]>Дмитрий_05 (29.11.05 23:24) [14]
Может я чего не понимаю, но почему бы не использовать MDI?
Defunct (2005-11-30 05:56:00) [10]Дмитрий_05 (29.11.05 23:24) [14]
Ну собсно выходов здесь много:
- Не перемещать вторую форму вообще, где пользователь ее поставил, там ей и место.
- Поставить проверку if Assigned( ... )
- Отправлять сообщение WM_MOVE окну второй формы..
- Отправлять сообщение (WM_USER + любое) окну второй формы, а в обработчике этого сообщения форма сама определит куда ей переместиться..
Дмитрий_05 (2005-11-29 23:24:00) [11]проблема у меня вобщем вот какая теперь: мне нужно при перемещении первой формы, чтобы вторая тоже перемещалась вместе с ней...
в WMWINDOWPOSCHANGING написал так:
Form2.Left := Form1.Left;
Form2.Top := Form1.Top + Form1.Height;
это как должно быть второе окно относительно первого... ошибка AV при старте программы(т.к. вторая форма не создана еще), может еще как-то надо это делать? или сообщение какоенибудь второй форме отправлять?
Плохиш (2005-11-29 23:15:00) [12]Screen.Forms
gdaujk (2005-11-29 21:27:00) [13]Дмитрий_05 (29.11.05 17:47) [11]
А можно какнибудь в любой момент программы узнать создано второе окно или нет?
if Form2 <> nil then ???
Дмитрий_05 (2005-11-29 17:47:00) [14]А можно какнибудь в любой момент программы узнать создано второе окно или нет? можно конечно по кнопке определять, видни ли она или нет, но мне кажется есть вариант получше :)
Дмитрий_05 (2005-11-29 16:58:00) [15]убрал давно еще :) Странно как-то, но я Delphi выключал, и теперь попробовал заново, заработало...
msguns (2005-11-29 16:50:00) [16]Project->Options->Forms
Убрать Form2 из левого списка (Auto-create forms)
Дмитрий_05 (2005-11-29 16:43:00) [17]это она и есть Action := caFree;в событии FormClose второй формы
Плохиш (2005-11-29 16:32:00) [18]
> Дмитрий_05 (29.11.05 16:18) [6]
У тебя ошибка в 34 строке
Дмитрий_05 (2005-11-29 16:18:00) [19]Ошибку выдает на строке Action := caFree; [Error] Unit2.pas(34): Incompatible types: 'TBasicAction' and 'TCloseAction'
попробовал в событии FormClose написать Form2.Free; ошибка AV
Дмитрий_05 (2005-11-28 20:38:00) [20]насчет нескольких форм, чтобы этого не случилось я грамотно сделал: ту кнопку, которая создает вторую форму делаю невидимой пока вторая форма уже создана...:)