Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

Диномическое создать и убить форму.   Найти похожие ветки 

 
Дмитрий_05   (2005-11-28 19:40) [0]

У меня в проекте находится две вормы, основная(Form1) автоматически создается, а вторая(Form2) по нажатию кнопки..

Form2 := TForm2.Create(Application);
Form2.Show;

форма создается, пока все нормально...
во второй форме по нажатию там на кнопку она закрывается и убивается:

Form2.Close;
Form2.Free;

и тут выскакивает ошибка "Control has not parent window", если убрать строку Form2.Free; то все нормально, но как убивать форму тогда непонятно...


 
Zeqfreed ©   (2005-11-28 19:48) [1]

Дмитрий_05   (28.11.05 19:40)

Free method (TObject)
Warning: Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains. For example, don’t free a button, or the form that owns the button, in its OnClick event handler. (C) Delphi Help


 
Дмитрий_05   (2005-11-28 20:09) [2]

а как тогда быть? вызывалась бы она как ShowModal, то Form2.Free; можно после него поставить... а тут нет... может в событии FormClose? там можно? или еще где?


 
Дмитрий_05   (2005-11-28 20:11) [3]

P.S. на событие FormClose второй формы, а не первой :)


 
Юрий Зотов ©   (2005-11-28 20:23) [4]

> Дмитрий_05   (28.11.05 19:40)

1. Переменную Form2 - убрать совсем. Раз эта форма показывается немодально, то ничто не мешает юзеру создать их несколько, а переменная Form2 будет указывать лишь на последнюю форму. Если нужно хранить ссылки на созданные формы - храните их в TList или в массиве, но только не в скалярной переменной.

2. Free тоже убрать. Вместо этого в обработчике OnClose второй формы пропишите Action := caFree, тогда форма при закрытии уничтожит сама себя. Если будете хранить список ссылок, то не забудь те при этом удалить ссылку из списка.


 
Дмитрий_05   (2005-11-28 20:38) [5]

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


 
Дмитрий_05   (2005-11-29 16:18) [6]

Ошибку выдает на строке Action := caFree; [Error] Unit2.pas(34): Incompatible types: "TBasicAction" and "TCloseAction"
попробовал в событии FormClose написать Form2.Free; ошибка AV


 
Плохиш ©   (2005-11-29 16:32) [7]


> Дмитрий_05   (29.11.05 16:18) [6]

У тебя ошибка в 34 строке


 
Дмитрий_05   (2005-11-29 16:43) [8]

это она и есть Action := caFree; в событии FormClose второй формы


 
msguns ©   (2005-11-29 16:50) [9]

Project->Options->Forms

Убрать Form2 из левого списка (Auto-create forms)


 
Дмитрий_05   (2005-11-29 16:58) [10]

убрал давно еще :) Странно как-то, но я Delphi выключал, и теперь попробовал заново, заработало...


 
Дмитрий_05   (2005-11-29 17:47) [11]

А можно какнибудь в любой момент программы узнать создано второе окно или нет? можно конечно по кнопке определять, видни ли она или нет, но мне кажется есть вариант получше :)


 
gdaujk ©   (2005-11-29 21:27) [12]

Дмитрий_05   (29.11.05 17:47) [11]
А можно какнибудь в любой момент программы узнать создано второе окно или нет?

if Form2 <> nil then ???


 
Плохиш ©   (2005-11-29 23:15) [13]

Screen.Forms


 
Дмитрий_05   (2005-11-29 23:24) [14]

проблема у меня вобщем вот какая теперь: мне нужно при перемещении первой формы, чтобы вторая тоже перемещалась вместе с ней...
в WMWINDOWPOSCHANGING написал так:

Form2.Left := Form1.Left;
Form2.Top := Form1.Top + Form1.Height;

это как должно быть второе окно относительно первого... ошибка AV при старте программы(т.к. вторая форма не создана еще), может еще как-то надо это делать? или сообщение какоенибудь второй форме отправлять?


 
Defunct ©   (2005-11-30 05:56) [15]

Дмитрий_05   (29.11.05 23:24) [14]

Ну собсно выходов здесь много:

- Не перемещать вторую форму вообще, где пользователь ее поставил, там ей и место.

- Поставить проверку if Assigned( ... )

- Отправлять сообщение WM_MOVE окну второй формы..

- Отправлять сообщение (WM_USER + любое) окну второй формы, а в обработчике этого сообщения форма сама определит куда ей переместиться..


 
gdaujk ©   (2005-11-30 07:04) [16]

>Дмитрий_05   (29.11.05 23:24) [14]

Может я чего не понимаю, но почему бы не использовать MDI?


 
Дмитрий_05   (2005-11-30 12:46) [17]

Сделал я обработку 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);
но тогда вторая форме не перемещается при перемещении первой... Что делать, помогите...


 
Дмитрий_05   (2005-11-30 17:12) [18]

неужели никто не знает в чем дело? (((


 
Плохиш ©   (2005-11-30 18:03) [19]


> Дмитрий_05   (30.11.05 17:12) [18]
> неужели никто не знает в чем дело? (((

Ну я знаю, вот в этом

> Form2.Left := Form1.Left;

Прекрати бездумно топтать кнопки и займись, наконец, чтением литературы.


 
Дмитрий_05   (2005-11-30 18:30) [20]

а что здесь неправильного? мне нужно чтобы координаты левой точки у них были одинаковыми... а как тогда надо?


 
Дмитрий_05   (2005-11-30 18:56) [21]

мне кажется что после создания второй формы и ее закрытия Action := caFree; в событии FormClose, переменная Form2 остается заполненной, т.е. при определении условием if Assigned(Form2) then форма определяется как созданная...


 
Anatoly Podgoretsky ©   (2005-11-30 19:53) [22]

А зачем переменная и тем более зачем делать такие странные выводе о существовании формы по нет. Для это существует Screen.Forms


 
Дмитрий_05   (2005-11-30 21:17) [23]

а в Screen.Forms хранятся все формы моего приложения? т.е. вы имеете в виду цикле менять положения всех форм по индексам? Я правильно понял? ))


 
Defunct ©   (2005-12-01 01:14) [24]

Дмитрий_05   (30.11.05 12:46) [17]

В OnClose второй формы:

Form2 := nil;
Action := caFree;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.015 c
3-1130410688
Александр_н
2005-10-27 14:58
2005.12.18
Создание базы даннх программным путём


6-1125848826
polcovnic
2005-09-04 19:47
2005.12.18
Как закачать файлы на WEB-сервер


3-1130851285
Zoostal
2005-11-01 16:21
2005.12.18
Проблема с IBX версия 2


2-1133242679
Andry
2005-11-29 08:37
2005.12.18
Экранная клавиатура


3-1130503241
Брат
2005-10-28 16:40
2005.12.18
Передача параметра





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский