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

Вниз

Есть перемнная типа TForm   Найти похожие ветки 

 
Шурик Ш   (2005-10-25 10:41) [0]

В один прекрасный момент форма закрывается (MyForm.Close). Как в последствии по объекту MyForm понять, что форма закрыта, ведь MyForm <> nil?


 
Amoeba ©   (2005-10-25 10:50) [1]

Так присваивай переменной MyForm при закрытии этой формы (в OnDestroy) nil. В чем, собственно, трудность?


 
umbra ©   (2005-10-25 10:51) [2]


> MyForm <> nil


После MyForm.Close можно явно присвоить MyForm := nil


 
Шурик Ш   (2005-10-25 10:53) [3]

Точно!


 
jack128 ©   (2005-10-25 11:43) [4]

Amoeba ©   (25.10.05 10:50) [1]
Так присваивай переменной MyForm при закрытии этой формы (в OnDestroy) nil.


Закрытие формы и OnDestroy вещи друг с другом никак не связанные. Форма может быть уничтожена, но не закрыта, а может быть закрыта, но не уничтожена.

И потом, как с этой формой работать после закрытия если вы предлогаете обнилить ссылку на неё??  Я бы просто проверял свойство Visible формы


 
Amoeba ©   (2005-10-25 13:32) [5]


> jack128 ©   (25.10.05 11:43) [4]

Раз форма при закрытии не уничтожается - тогда присваивать nil в OnClose этой формы.


 
Leonid Troyanovsky ©   (2005-10-25 13:38) [6]


> Amoeba ©   (25.10.05 13:32) [5]
>
> > jack128 ©   (25.10.05 11:43) [4]
>
> Раз форма при закрытии не уничтожается - тогда присваивать
> nil в OnClose этой формы.


Тогда уж проще (да и правильнее) оную переменную вовсе не пользовать.

--
Regards, LVT.


 
Сайбель Алексей ©   (2005-10-25 14:43) [7]


> Как в последствии по объекту MyForm понять, что форма
> закрыта, ведь MyForm <> nil?

Если нужно только для понимания закрыта форма или нет,
то добавь поле Closed в Public своей формы.
При закрытии присваивай true, при открытии false.
И смотри:
If MyForm.Closed then
...


 
Джо ©   (2005-10-25 15:03) [8]


>  [7] Сайбель Алексей ©   (25.10.05 14:43)

Ой.


 
Сайбель Алексей ©   (2005-10-25 18:24) [9]


>Джо ©   (25.10.05 15:03) [8]
>>  [7] Сайбель Алексей ©   (25.10.05 14:43)
>> Ой.

Совсем "Ой"? =)
Т.е. для того чтобы понят, что форма закрыта, лучше

>umbra ©   (25.10.05 10:51) [2]
>> MyForm <> nil
> После MyForm.Close можно явно присвоить MyForm := nil

?


 
IceBeerg ©   (2005-10-25 18:48) [10]

А если что-то пипа Assigned(...,


 
msguns ©   (2005-10-25 18:52) [11]

>Сайбель Алексей ©   (25.10.05 14:43) [7]
>Если нужно только для понимания закрыта форма или нет,
то добавь поле Closed в Public своей формы.
При закрытии присваивай true, при открытии false.
И смотри:
If MyForm.Closed then

В Public КАКОЙ формы добавить это поле ? Если вызываемой, то что будет при обращении к этому полю из вызвавшей, если форма благополучно прибита ?
Если вызывающей, то что делать, если таких "дочерних" форм может быть несколько - для каждой "свою" Closed  ?


 
Сайбель Алексей ©   (2005-10-25 19:02) [12]

Как я понял условие задачи, есть некая форма MyForm.
И требуется понять, закрыта она или нет.
Ну не лучший же вариант - при закрытии присваивать ей значение nil? А потом проверять MyForm <> nil.


 
umbra ©   (2005-10-25 19:20) [13]


> Сайбель Алексей ©   (25.10.05 19:02) [12]


Я не вижу ничего плохого в явном присваивании переременной MyForm значения nil после закрытия, если не предполагается ее дальнейшего использования. Если я чего-то не вижу, скажите, где я не прав.


 
Сайбель Алексей ©   (2005-10-25 22:19) [14]

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

2 msguns ©  [11]
Имелся ввиду Public вызываемой формы.
В своей пограмме я реализовывал это именно так, соотв. не допуская обрщаения к этому полю формы, после ее "прибития".

Алгоритм не претендует на изящество и оптимальность. С удовольствием выслушаю вариант лучше.


 
Anatoly Podgoretsky ©   (2005-10-25 22:37) [15]

umbra ©   (25.10.05 19:20) [13]
Это не является критичным и при открытой форме, только вопрос, а нафиг нужна эта переменная?


 
wicked ©   (2005-10-25 22:49) [16]

> Шурик Ш   (25.10.05 10:41)

> В один прекрасный момент форма закрывается (MyForm.Close).
>  Как в последствии по объекту MyForm понять, что форма закрыта,
>  ведь MyForm <> nil?

if not MyForm.Visible then ;

остальное - от лукаваго.... ;)


 
Leonid Troyanovsky ©   (2005-10-26 08:47) [17]


> umbra ©   (25.10.05 19:20) [13]

> Я не вижу ничего плохого в явном присваивании переременной
> MyForm значения nil после закрытия, если не предполагается
> ее дальнейшего использования. Если я чего-то не вижу, скажите,
>  где я не прав.


А зачем, вообще, чего-то присваивать, если не предполагается
ее дальнейшее использование?

Если она одноразовая, то можно просто with TFormX.Create(..) do.
Если она существует на протяжении всей жизни приложения, то
найти форму можно (из любого места) в Screen.Forms/DataModules/...

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-10-26 09:18) [18]


> wicked ©   (25.10.05 22:49) [16]

> >  ведь MyForm <> nil?

> if not MyForm.Visible then ;


Не все так просто.
Если MyForm - глобальная переменная (как нам навязывает Борланд), то
она может быть разрушена из любого места. А, сл-но, первой проверкой д.б.
if Assigned(MyForm) then ..

Однако, вполне возможно, что в какой-то части кода форму разрушили не
путем FreeAndNil (MyForm), а, скажем, получив к.л. образом ссылку на нее,
например, FindControl(wnd).Free.
В подобных случаях, объектно-ориентированный подход предполагает, что
ссылки на форму, используемые заинтересованными формами, должны
обнуляться с помощью механизма Notification (override):

procedure TFormX.Notification (AComponent: TComponent; oper: TOperation);
begin
  inherited;
  if (AComponent = MyForm) {поле формы TFormZ} and
     (oper = opRemove) then
    MyForm := nil;
end;

а после получения ссылки MyForm необходимо ее зарегистрировать:
FreeNotification(MyForm).

Ну, и, в данном случае, if Assigned(MyForm), также, всегда идет первым.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-10-26 09:20) [19]


> Leonid Troyanovsky ©   (26.10.05 09:18) [18]

> procedure TFormX.Notification (AComponent: TComponent; oper:
..
>   if (AComponent = MyForm) {поле формы TFormZ} and


if (AComponent = MyForm) {поле формы TFormX},

sorry

--
Regards, LVT.


 
msguns ©   (2005-10-26 09:31) [20]

А вообще неплохо бы уточнить общую идею интерфейса. Если это MDI, то никаких переменных не требуется, все необходимые средства имеются у самой "мамки" (MDIChildren,MDIChildCount,ActiveMDIChild,...) Прочие же формы обычно создаются модально и прибиваются самим "инициатором" по схеме, указанной Леонидом в [17]

 whith TSecondForm.Create(nil) do
   begin
    ....
    ShowModal;
    ...
    Free;
   end;

Если же это SDI приложение, то "отслеживание" надо делать "ручками", используя опять же централизацию (в данном случае через класс TApplication)

Ни в коем случае нельзя обращаться к форме по имени MyForm.XXXX := .., т.к. это может работать только до тех пор, пока существует один и только один экземпляр класса TMyForm



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

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.027 c
2-1130192008
alex-s
2005-10-25 02:13
2005.11.13
Чем пользоватся и как


2-1130163180
Zoostal
2005-10-24 18:13
2005.11.13
Проблема с IBX


14-1129964896
_WWW
2005-10-22 11:08
2005.11.13
Помогите разобраться


2-1129620068
Id
2005-10-18 11:21
2005.11.13
Работа с базами FB


3-1127990038
1g0r
2005-09-29 14:33
2005.11.13
подключение через dbExpress SYS AS SYSDBA