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 :

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);
jusque là pas de problème, le TMenuItem est affiché par tous les TPopupMenu qui en ont besoin.

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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
if Assigned(MenuBaladeur.Parent) then
  MenuBaladeur.Parent.Remove(MenuBaladeur);
ou plus spécifiquement :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
if MenuBaladeur.Parent = PopupDuPanelADetruire.Items then
  PopupDuPanelADetruire.Items.Remove(MenuBaladeur);
et on évite ainsi la libération du Menu baladeur, qui va pouvoir être utilisé par d'autres TPopupMenu.

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é)

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;
si vous avez la solution...


edit : démo du problème :
http://www.developpez.net/forums/vie...034275#2034275