Bonjour à tous
J'utilise dans un application un TMenuItem "baladeur", qui va passer d'un popup menu à un autre. pour ce faire, à chaque changement de popup menu, je le retire de son ancien parent et lui affecte le nouveau :
jusque là pas de problème, le TMenuItem est affiché par tous les TPopupMenu qui en ont besoin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if Assigned(MenuBaladeur.Parent) then MenuBaladeur.Parent.Remove(MenuBaladeur); NouveauPopup.Items.Insert(0, MenuBaladeur);
là où ça se corse, c'est que les TPopupMenu en question sont contenus dans des TPanel, qui vont parfois être libérés.
Lorsque le TPopupMenu du TPanel libéré (tout le monde suit ?) ne possède pas le menu baladeur, pas de soucis. mais s'il le possède, il faut éviter que ce dernier soit lui aussi libéré.
qu'à cela ne tienne, on recolle notre code magique dans le destructeur du TPanel :
ou plus spécifiquement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if Assigned(MenuBaladeur.Parent) then MenuBaladeur.Parent.Remove(MenuBaladeur);
et on évite ainsi la libération du Menu baladeur, qui va pouvoir être utilisé par d'autres TPopupMenu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if MenuBaladeur.Parent = PopupDuPanelADetruire.Items then PopupDuPanelADetruire.Items.Remove(MenuBaladeur);
oui MAIS (il y a toujours un mais...) :
dans ces conditions, lorsque le Menu baladeur est utilisé dans un autre TPopupMenu, l'impensable se produit :
- le menu baladeur est bien inséré au TPopupMenu
- MenuBaladeur.Visible = true... sur le papier ! car en réalité, il ne l'est plus ! aucun TPopupMenu ne peut plus afficher le mystérieux menu baladeur...
ou est l'erreur ?
(je précise que si le menu baladeur est retiré du TPopupMenu AVANT la libération du Panel, pas de soucis, le menu baladeur reste utilisable... j'ai donc naïvement pensé à appeler un petit "Application.ProcessMessages" après l'extraction du menu baladeur, mais le problème reste inchangé)
si vous avez la solution...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 destructor TPanelADetruire.Destroy; begin if MenuBaladeur.Parent = PopupDuPanelADetruire.Items then PopupDuPanelADetruire.Items.Remove(MenuBaladeur); Application.ProcessMessages; inherited; end;
edit : démo du problème :
http://www.developpez.net/forums/vie...034275#2034275
Partager