Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.20;
Скачать: CL | DM;

Вниз

Как правильно удостовериться, что форма убита?   Найти похожие ветки 

 
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. Бесперспективно, короче.


 
©   (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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
8-1081353832
Wm.DIGGER
2004-04-07 20:03
2004.06.20
Запись AVI шек ...


14-1086329974
Мазут Береговой
2004-06-04 10:19
2004.06.20
Россия - один из штатов Америки?


1-1086682330
Sandman25
2004-06-08 12:12
2004.06.20
Goto оптимален?


14-1086107819
Beginner!
2004-06-01 20:36
2004.06.20
Build with runtime Packages


14-1086357878
nick-from
2004-06-04 18:04
2004.06.20
Проектирование приложений под разные разрешения экрана