Форум — Ответы ( К темам )
? | 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;//глобальный указатель теперь точно ни на что не указывает! /*конец отличия*/ |