IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Menu dynamique depuis une liste de fichiers


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 32
    Par défaut 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 : 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
    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.

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut, l'évènement Onlcik est de type System::Classes::TNotifyEvent. Donc il doit être défini comme celà:
    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void __fastcall ExempleClick(TObject *Sender);
    .cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::ExempleClick(TObject *Sender)
    {
        TMenuItem* LMenuItem = static_cast<TMenuItem*>(Sender);
        // ici tu utilises LMenuItem
    }
    Et dans ton code tu mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewItem->OnClick = ExempleClick;

  3. #3
    Membre averti
    Inscrit en
    Mai 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 32
    Par défaut
    Extra ! Merci beaucoup j'ai avancé d'un grand pas.

    Du coup je stocke dans Hint le chemin complet du fichier ppuis je le récupère grâce à ton idée du LMenuItem :
    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
    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
    void __fastcall TInterfaceS2A::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())
    	  {
    		//ajout dans la liste d'une ligen avec le chemin+nom du fichier trouvé
    		ListeFichiers->Add(ExpandFileName(Infos_fichier.Name));
    		//nettoie le nom de fichier de son extension sb2 pour le nom seul du fichier, sans le chemin
    		AnsiString CleanName = StringReplace(Infos_fichier.Name, ".sb2", "",TReplaceFlags() << rfReplaceAll);
    		//rajout d'entrées dans le menu
    		NewItem = new TMenuItem(this);
    		NewItem->Caption = CleanName;
    		NewItem->Name = CleanName;
    		//stockage du chemin complet + nom de fichier pour la fonction ExempleClick
    		NewItem->Hint = FilePath + Infos_fichier.Name.c_str();
    		NewItem->OnClick=ExempleClick;
    		//rajout au bon endroit de l'entrée dans le menu
    		MainMenu1->Items->Items[0]->Items[RangMenu]->Add(NewItem);
    	  }
    	}
      }
      while(!FindNext(Infos_fichier));
      FindClose(Infos_fichier);
    }
    //---------------------associer chaque entrée dynamique dans BIblio & Exemples à leur lancement-------------------
     
    void __fastcall TInterfaceS2A::ExempleClick(TObject *Sender)
    {
    AnsiString CheminNomFichier;
    ofstream fichier_s2("scratch2.bat", ios::out | ios::trunc);  // ouverture en écriture avec effacement du fichier ouvert
    		if(fichier_s2)
    		{
    			   //récupération des infos de l'entrée TMenu qui a déclenché cette fonction
    			   TMenuItem* LMenuItem = static_cast<TMenuItem*>(Sender);
    			   CheminNomFichier=LMenuItem->Hint;
    			   fichier_s2 << "@echo off\nbreak ON\ncls\nSET currentpath=%~dp1\nSET dossier_scratch="<< '"' << locate_scratch2 << '"'<< "\nstart %dossier_scratch% " << '"' << CheminNomFichier.c_str() << '"';
    			   fichier_s2.close();
    		}
    		else ShowMessage("Le fichier scratch2.bat n'existe pas.");
    ShellExecute(0, 0, "scratch2.bat", 0, 0 , SW_HIDE );
    }
    Donc dynamiquement à chaque lancement mon programme :
    • scanne un dossier,
    • créé une entrée dans le menu pour chaque fichier trouvé,
    • associe une commande d'ouverture de ce fichier à chaque entrée du menu.


    OBJECTIF ATTEINT ! à 90%.....quand le fichier a un espace ou un accent dans le nom, le logiciel ne se lance pas en m'annonçant ["fichier espace" n'est pas un nom de composant correct], et là il y a surement un pb de typage mais ça me dépasse...
    Je vais surement rester à apprécier mes 90%

Discussions similaires

  1. [XL-2003] Imprimer une liste de fichier depuis Excel
    Par Nikodemus dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/02/2012, 11h53
  2. Affichage Dynamique depuis une liste
    Par covin85 dans le forum Langage
    Réponses: 3
    Dernier message: 29/03/2011, 12h49
  3. Réponses: 1
    Dernier message: 06/02/2009, 17h58
  4. Supprimer des fichiers depuis une liste déroulante
    Par Flo88 dans le forum VBA Access
    Réponses: 7
    Dernier message: 28/03/2008, 09h14
  5. [MySQL] affichage dynamique depuis une liste de résultats
    Par cloridriks dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/10/2007, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo