Menu dynamique depuis une liste de fichiers
Bonjour tout le monde,
encore une fois j'envoie une bouteille à la mer car je prépare une usine à gaz...
Mon idée : au lancement du logiciel, il scanne un dossier à la recherche des fichiers dont l'extension est ".sb2", puis les liste dans un menu "Exemples". Mais ce qu'il me manque est de paramétrer pour chaque entrée du menu une action sur le OnClick...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| __fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Extensions->Add(".sb2");
// Appel à Search, avec pour liste des fichiers les items des deux listes "Biblio" & "Examples"
SearchEx(ExtractFilePath(Application->ExeName)+"bibliotheque\\", Extensions, Biblio,0);
SearchEx(ExtractFilePath(Application->ExeName)+"exemples\\", Extensions, Examples,1);
delete Extensions;
}
//-----------------------------fonction de listage de fichiers------------------
void __fastcall TForm1::SearchEx(AnsiString FilePath, TStringList * Extensions, TStrings * ListeFichiers, int RangMenu)
{
TSearchRec Infos_fichier;
TMenuItem *NewItem = new TMenuItem(this);
if (!FindFirst(FilePath+"*.*", faAnyFile, Infos_fichier))
do
{
for (int i = 0 ; i < Extensions->Count ; i++)
{
if (ExtractFileExt(Infos_fichier.Name).LowerCase() == Extensions->Strings[i].LowerCase())
{
ListeFichiers->Add(ExpandFileName(Infos_fichier.Name));
AnsiString CleanName = StringReplace(Infos_fichier.Name, ".sb2", "",TReplaceFlags() << rfReplaceAll); //nom seul du fichier, sans le chemin
//nettoie le nom de fichier de son extension sb2
ListBox1->Items->Add(CleanName);
//rajout d'entrées dans le menu
NewItem = new TMenuItem(this);
NewItem->Caption = CleanName;
NewItem->Name = CleanName;
NewItem->OnClick=ExempleClick(Infos_fichier.Name); // et là ça ne marche pas ! J'aimerais que chaque entrée provoque l'utilisation du programme ci-dessous ExempleClick
MainMenu1->Items->Items[0]->Items[RangMenu]->Add(NewItem);
}
}
}
while(!FindNext(Infos_fichier));
FindClose(Infos_fichier);
}
//---------------------pour le fichier ça écrit dans un fichier BAT puis le lance pour que ce soit visible/compréhensible par l'utilisateur------------------------------
void __fastcall TForm1::ExempleClick(AnsiString NomFichier)
{
ofstream fichier_s2("scratch2.bat", ios::out | ios::trunc); // ouverture en écriture avec effacement du fichier ouvert
if(fichier_s2)
{
//fichier_s2 << "@echo off\nbreak ON\ncls\nSET currentpath=%~dp1\nSET dossier_scratch="<< '"' << locate_scratch2 << '"'<< "\nstart %dossier_scratch% %currentpath%" << NomFichier << ".sb2";
fichier_s2.close();
}
else ShowMessage("Le fichier scratch2.bat n'existe pas.");
ShellExecute(0, 0, "scratch2.bat", 0, 0 , SW_HIDE );
} |
La création du "NewItem->Click=ExempleClick(Infos_fichier.Name);" ne fonctionne pas, il me dit "ce n'est pas un type autorisé"...et là je suis perdu.
Encore une fois merci de prendre le temps de me lire.:ave: