Форум — Ответы     (  К темам )
 ?  Fantom: Кто знает аналог Делфической ф-ии Assigned (03-04-2003 13:59:50)
Кто знает аналог Делфической ф-ии
//Tests for a nil (unassigned) pointer or procedural variable.
function Assigned(var P): Boolean;

Есть динамическая форма, при определенных событиях хочу узнать заваили я ее уже или еще нет (точно так же создание), сейчас просто поставил проверку:
if(<имя_формы> == NULL)
{
...
};

Но мне кажется — жто не совсем корректно :( в Дэлфи можна выкрутится через Assigned(..).

Зараннее благодарен за помошь!
 Георгий (03-04-2003 15:55:19)
для C++ всё корректно (на паскале писал 5 лет назад и помню плохо)
я не понял "...заваили..."
но
когда обьект уничтожается, то указатель свёравно указывает на то место памяти, где обьект был:
TForm *ptrForm=new TForm(this);
...
что — то делаем
...
delete ptrForm;//обьект на который указывал ptrForm удалён, но указатель не обнулён
ptrForm==NULL в данном примере всегда будет false

лечится так:
delete ptrForm;
ptrForm=0;
 Fantom (04-04-2003 15:19:44)
да я так и сделал, изначально указателю присвоил NULL

ptrForm=NULL;
...

потом при определенных условиях я создаю форму, при условии, что ее нет в памяти:
if(ptrForm == NULL) ptrForm = new TfrArcDoc(Application);
ptrForm ->Show();
...

а потом когда необходимо я ее удаляю из памяти:
if(ptrForm != NULL)
try
{
delete ptrForm;
frArcDoc1 = NULL; //ключевай момент в кот. я сомневаюсь !!!
}catch(...){};

вот где то так все выглядит, но сомнения у меня по поводу того, что корректно ли проверку ставить на NULL ( if(ptrForm != NULL) )? А то я с одним заядлым Делфистом общался так он утверждает, так не совсем правильно!?!
 Alexander (04-04-2003 16:52:59)
При программировании на C++Builder не слушай делфистов. Функция Assigned() как раз проверяет, не равен ли указатель nil (в случае Си — NULL). Все правильно.
Есть одно но: если форма при закрытии обрабатывает событие OnClose и там ставит переменную Action в caFree (иногда это нужно), то она уничтожается сама и твой указатель будет недействительным, при попытке удалить объект по этому адресу может вылететь exception.
Поэтому четко следи, как ты форму удаляешь.
Или передавай адрес указателя на нее в нее саму в конструкторе, например, чтобы она при закрытии его обнуляла.
 Георгий (06-04-2003 03:05:35)
по поводу показанного куска кода:
я бы сделел так:
ptrForm=NULL;
...
потом при определенных условиях я создаю форму, при условии, что ее нет в памяти:
/*начало отличия*/ if(ptrForm != NULL) return; /*конец отличия*/
ptrForm = new TfrArcDoc(Application);
ptrForm ->Show();
...
а потом когда необходимо я ее удаляю из памяти:
/*начало отличия*/
delete ptrForm;
ptrForm=NULL;//глобальный указатель теперь точно ни на что не указывает!
/*конец отличия*/