Bonjour, (ça marche MAIS...)
Le prg principal appel la fonction open_dlg( ) qui se trouve dans toto.dll.
la fct open_dlg( )ouvre un dialogue Modelless. Suite à cet appel, le prg
principal tourne en // au CDialog. Pour fermer le CDialog, il faut cliquer
le bouton OK du dialogue.
Ma question est pourquoi ais-je du mettre ce pdlg=NULL(voir code
ci-dessous)? n'aurait-t-il pas du valoir NULL après delete this??? Est-ce
bien catholique?
MERCI d'avance
Voici comment j'ai fait ça:
dans toto.cpp
--------------
CLayerDlg *pdlg=NULL; //variable globale (pointeur sur mon dialogue)
extern CLayerDlg *pdlg; //défini dans toto.cpp
...
void CLayerDlg::OnDlgok()
{
// TODO: Add extra validation here
...
DestroyWindow();
}
void CLayerDlg::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
delete this;
::pdlg=NULL; //???#####???j'ai du le mettre mais je ne comprends pas
pourquoi??##########????
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Ambassadeur Kosh
un objet est typé, pas l'inverse. ici, l'équivalence objet/classe est assez pourrie/degueu. le delete this est d'ailleurs symptomatique de l'affirmation précédente.
et c'est pas parcequ'un objet est "closé" qu'il faut le deleter. on peut tres bien faire un show apres.
donc, solution :
- soit tu fais une variable globale pdlg et l'entrée dans la dll fait un new, la sortie fait un delete pdlg ; et form_open fait juste un show. visibilité et existence de l'objet coincident. (ce qui est le but recherché)
- soit tu fais une fenetre qui fait delete this comme ici, mais en aucun cas tu n'exposes l'adresse de cet objet dans une quelquonque variable. autrement dit, ton pdlg disparait et devient une variable locale du form_open qui va acceuillir le resultat du new pour faire deux trois initialisation, tu show, et apres, tu perds de vue toute reference à cette fenetre. c'est elle qui te previendra, mais pas l'inverse, vu qu'à tout moment, elle peut mourir. la visibilité/portée est englobée par la vie de l'objet. (ce qui est une bonne chose)
en fait ce qui craint, c'est de pouvoir à un moment dans le code acceder à une variable qui pointe sur n'importe quoi. le cas 1 sert à gerer une seule et unique fenetre. le cas 2 sert à en gerer N.
donc, ce qui compte, c'est la localité.
paix et serenité, news Tiscali.
un objet est typé, pas l'inverse. ici, l'équivalence objet/classe est assez
pourrie/degueu.
le delete this est d'ailleurs symptomatique de l'affirmation précédente.
et c'est pas parcequ'un objet est "closé" qu'il faut le deleter. on peut
tres bien faire un show apres.
donc, solution :
- soit tu fais une variable globale pdlg et l'entrée dans la dll fait un
new, la sortie fait un delete pdlg ; et form_open fait juste un show.
visibilité et existence de l'objet coincident. (ce qui est le but recherché)
- soit tu fais une fenetre qui fait delete this comme ici, mais en aucun cas
tu n'exposes l'adresse de cet objet dans une quelquonque variable. autrement
dit, ton pdlg disparait et devient une variable locale du form_open qui va
acceuillir le resultat du new pour faire deux trois initialisation, tu show,
et apres, tu perds de vue toute reference à cette fenetre. c'est elle qui te
previendra, mais pas l'inverse, vu qu'à tout moment, elle peut mourir. la
visibilité/portée est englobée par la vie de l'objet. (ce qui est une bonne
chose)
en fait ce qui craint, c'est de pouvoir à un moment dans le code acceder à
une variable qui pointe sur n'importe quoi. le cas 1 sert à gerer une seule
et unique fenetre. le cas 2 sert à en gerer N.
un objet est typé, pas l'inverse. ici, l'équivalence objet/classe est assez pourrie/degueu. le delete this est d'ailleurs symptomatique de l'affirmation précédente.
et c'est pas parcequ'un objet est "closé" qu'il faut le deleter. on peut tres bien faire un show apres.
donc, solution :
- soit tu fais une variable globale pdlg et l'entrée dans la dll fait un new, la sortie fait un delete pdlg ; et form_open fait juste un show. visibilité et existence de l'objet coincident. (ce qui est le but recherché)
- soit tu fais une fenetre qui fait delete this comme ici, mais en aucun cas tu n'exposes l'adresse de cet objet dans une quelquonque variable. autrement dit, ton pdlg disparait et devient une variable locale du form_open qui va acceuillir le resultat du new pour faire deux trois initialisation, tu show, et apres, tu perds de vue toute reference à cette fenetre. c'est elle qui te previendra, mais pas l'inverse, vu qu'à tout moment, elle peut mourir. la visibilité/portée est englobée par la vie de l'objet. (ce qui est une bonne chose)
en fait ce qui craint, c'est de pouvoir à un moment dans le code acceder à une variable qui pointe sur n'importe quoi. le cas 1 sert à gerer une seule et unique fenetre. le cas 2 sert à en gerer N.
donc, ce qui compte, c'est la localité.
paix et serenité, news Tiscali.
Jean-Claude
Un grand MERCI, J'ai choisi la 2ème solution. Pour éviter l'ouverture de plusieurs dlgs à la fois, j'utilise une variable "dlg_is_open" if (!dlg_is_open) { open_dlg(); dlg_is_open=TRUE;} et lorsque je click sur OK de mon dlg, j'envoie un message au prg principal qui initialise "dlg_is_open" à FALSE
paix et serenité à toi aussi ;-)
Un grand MERCI,
J'ai choisi la 2ème solution. Pour éviter l'ouverture de plusieurs dlgs à la
fois, j'utilise une variable "dlg_is_open"
if (!dlg_is_open) { open_dlg(); dlg_is_open=TRUE;}
et lorsque je click sur OK de mon dlg, j'envoie un message au prg principal
qui initialise "dlg_is_open" à FALSE
Un grand MERCI, J'ai choisi la 2ème solution. Pour éviter l'ouverture de plusieurs dlgs à la fois, j'utilise une variable "dlg_is_open" if (!dlg_is_open) { open_dlg(); dlg_is_open=TRUE;} et lorsque je click sur OK de mon dlg, j'envoie un message au prg principal qui initialise "dlg_is_open" à FALSE
paix et serenité à toi aussi ;-)
Ambassadeur Kosh
au fait, je me suis rendu compte apres que c'était ambigu, mais par visibilité, j'entendais au sens portée, au sens ou la variable pdlg est visible dans une portion de code. pas la visibilité de la fenetre.
enfin, j'imagine que tu avais percuté...
voila voila.
au fait, je me suis rendu compte apres que c'était ambigu, mais par
visibilité, j'entendais au sens portée, au sens ou la variable pdlg est
visible dans une portion de code. pas la visibilité de la fenetre.
au fait, je me suis rendu compte apres que c'était ambigu, mais par visibilité, j'entendais au sens portée, au sens ou la variable pdlg est visible dans une portion de code. pas la visibilité de la fenetre.