Bonjour,
Je crée dynamiquement des menus, que je veux supprimer par la suite.
Voici le code pour la création :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
bool CreerMenu(TMenuItem *menu,TNotifyEvent fonctionClickl)
{
TMenuItem *nouveauMenu;
int index;
/*
 Exécution d'une requête pour retrouver les menus à créer dans une table
*/
SQLQuery->First();
for(index = 0;index < SQLQuery->RecordCount;index++)
       {nouveauMenu = NULL;
	 nouveauMenu = new TMenuItem(NULL);
	 if (nouveauMenu != NULL)
		{nouveauMenu->Name = "Menu"+(String)index;
		 nouveauMenu->OnClick = fonctionClick;
		 nouveauMenu->Caption = SQLQuery->FieldByName("TITRE")->AsString;
		 nouveauMenu->Tag = 10 + index; // pour repérer le menu créé
 
		 menu->Add(nouveauMenu);
		}
	 SQLQuery->Next();
	}
La création des menu fonctionne correctement, le clic sur un élément de menu fait bien appel à la fonction pointée par le paramètre 'fonctionClick'.

Voici le code pour supprimer ces menus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
void NettoyerMenu(TMenuItem *menu)
{
int index,nbSousMenus;
 
index = 0;
nbSousMenus = menu->Count;
 
if (nbSousMenus >=1)
	{// il y a au moins 1 sous menu
	 for (index = nbSousMenus-1;index >= 0;index--)
		{// les menus créés ont un Tag supérieur ou égal à 10
                 if(menu->Items[index]->Tag >= 10)   
			{menu->Delete(index);
			}
		}
	}
}
Ce code fonctionne correctement aussi.
Si j'appelle plusieurs fois les fonctions de suppression puis création des menus, tout se déroule normalement.

Par contre, après la création du menu, je clique sur un élément créé, la fonction correspondante est appelée et fonctionne normalement.
Je quitte la fonction, je demande la suppression des menus, et là je me retrouve avec un message "Violation d'accès ..."

Pour la suppression des menu, j'ai aussi utilisé le code suivant, sans succès :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
			{menu->Items[index]->Free();
Si quelqu'un a une idée ...merci d'avance