Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
ВнизКак правильно удостовериться, что форма убита? Найти похожие ветки
← →
Form (2004-06-04 17:26) [0]Например у меня есть
MyForm: TMyForm;
В процессе выполнения кода мне нужно узнать жива ли форма или убита.
← →
Семен Сорокин © (2004-06-04 17:29) [1]1. При уничтожении присваивай MyForm := nil;
и проверяй на Assigned()
2. Пробежаться по Screen.Forms
← →
BFG9k (2004-06-04 17:30) [2]Точно форма ? Может быть процесс ? С формой совсем просто :
if not Assigned(Form1) then
//форма убита
или
if Form1=nil then
//форма опять убита
← →
Fay © (2004-06-04 17:33) [3]2BFG9k (04.06.04 17:30) [2]
var
Form1, Form2 : TForm1;
begin
Form1 := TForm1.Create(nil);
Form2 := Form1;
Form1 := nil;
if not Form1 = nil then ShowMessage("Убита")
else ShowMessage("Не убита");
Form2.ShowModal;
end;
← →
Form (2004-06-04 17:47) [4]То есть если я сделаю
Form1.Free
и не сделаю
Form1:= Nil,
то я не смогу точно проверить есть ли это форма или нет? (не вызывая эксепшен)
← →
Fay © (2004-06-04 17:53) [5]Совершенно верно
← →
Anatoly Podgoretsky © (2004-06-04 18:14) [6]Form (04.06.04 17:47) [4]
Можешь - совет 2 Семен Сорокин © (04.06.04 17:29) [1]
При том это единственно гарантированый способ, в отличии от проверки по глобальной переменной и необходимостью эту переменную иметь.
← →
BFG9k (2004-06-07 12:34) [7]procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
... о чем это вы ?!
"...то я не смогу точно проверить есть ли это форма или нет? (не вызывая эксепшен)" - пусть даже так , в этом нет ничего страшного .его всегда можно отловить в защищенном блоке.
← →
Snipers © (2004-06-07 12:52) [8]С эксепшенами могут быть пролемы - реализовал определение убита или нет форма через обращение к Caption - заключил все в try except end. На одной машине выдает сообщение об ошибке - все работает, но окно раздражает. Пришлось переделать по способу присвоения nil"a ссылке в обработчике уничтожения.
← →
evvcom © (2004-06-07 12:54) [9]
> if Self <> nil then
> Destroy;
Здесь Self, можно сказать, всегда будет не nil. Исключением будет если этот метод вызвать, используя ассемблер или манипуляции с TMethod. Поэтому этот пост, я считаю, совсем не в тему.
← →
nejest (2004-06-07 14:43) [10]Может стоит передавать форме сообщение и проверять отреагировала она на него?
P.S. В форме, которую надо проверить, необходимо поставить обработку этого сообщения.
← →
KSergey © (2004-06-07 14:57) [11]> [10] nejest (07.06.04 14:43)
А передать, простите, как?
> [7] BFG9k (07.06.04 12:34)
> ... о чем это вы ?!
А вы? Я не мойму, что в этом коде вам не нравится и как он соотносится с темой? (к стати, это из какой дельфи такой код, интересно?)
> [7] BFG9k (07.06.04 12:34)
> его всегда можно отловить в защищенном
> блоке.
Вот только не надо экзепшены ловить, я вас умоляю.
Не факт, что при обращении к недействительному указателю на объект вообще возникнет исключение, что очевидно. Тут уж как звезды встанут.
← →
nejest (2004-06-07 15:43) [12]2 KSergey © (07.06.04 14:57) [11]
>А передать, простите, как?
SendMessage
← →
KSergey © (2004-06-08 06:45) [13]> [12] nejest (07.06.04 15:43)
> 2 KSergey © (07.06.04 14:57) [11]
> >А передать, простите, как?
> SendMessage
А хендл где возьмем?? frm.Handle? И что? Либо AV, либо вообще проканает, либо этот хендл может уже быть выдан другому окну в системе, еще фиг знает как оно прореагирует... Так что это то же, что пытаться обратиться к какому-либо св-ству в надежде словить AV. Бесперспективно, короче.
← →
R © (2004-06-08 07:09) [14]FindWindow(
Класс и имя окна можно знать точно
← →
piople © (2004-06-08 07:14) [15]Обсалютно согласен с <R>!
Просто поискать хэндл данного окна, если окно есть, то найдет иначе нет.
← →
KSergey © (2004-06-08 07:16) [16]> [15] piople © (08.06.04 07:14)
> Обсалютно согласен с <R>!
Да, вариант хорош
Однако не отличается от ранее озвученного Пробежаться по Screen.Forms
← →
piople © (2004-06-08 07:19) [17]
> KSergey
А как вы считаете что проще, просто вызвать функцию или бегать по всем формам???
З.Ы. Риторический вопрос!!!
← →
KSergey © (2004-06-08 07:26) [18]> piople © (08.06.04 07:19)
В данном случае - практически фиолэтово. Тем более, как я понимаю, FindWin делает такой же цикл внутри, только уже по всем окнам, зарегистррованным в системе, а не только по формам этого приложения.
← →
piople © (2004-06-08 07:35) [19]
> KSergey
Вот именно!!!!! На кой тебе самому все писать если за тебя все сделает Дэлфи?????
← →
KSergey © (2004-06-08 08:33) [20]> [19] piople © (08.06.04 07:35)
Ну не дельфи... Ну да это детали
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.047 c