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 :

Prob création popupmenu


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club

    Homme Profil pro
    En recherche d'emploi sur la région de Toulouse
    Inscrit en
    Novembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En recherche d'emploi sur la région de Toulouse
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 62
    Points : 34
    Points
    34
    Billets dans le blog
    1
    Par défaut Prob création popupmenu
    Bonjour, je souhaiterais charger un item de mon popupmenu a l'aide d'une section d'un fichier .ini
    j'ai écrit ceci :
    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
    if (FileExists(Chemin+"ListCarte.ini"))
    {
    try
    {
    	f = new TIniFile(Chemin+"ListCarte.ini");
    for(i=0;i<=2;i++)
    	{
    AnsiString s = f->ReadString("Liste des cartes", "Carte" + AnsiString(i), "");
    //???	 this->PopupMenu1->FindItem(1,fkCommand)->Find("Cartes")->Add(s) ;
    	 TListBox *List;
    	   List->Items->Add(s);
    	 }
    }
    __finally
    {
       delete f;
    }
    mais tout se que j'obtient c'est une erreur "EAccesViolation".
    Vous auriez une idée svp ?

  2. #2
    Membre régulier Avatar de jehrikhan
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Points : 89
    Points
    89
    Par défaut
    Il faudrait que tu crée le TListBox avec l'opérateur new

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TListBox *List = new TListBox(this);
    Par contre il ne faut pas oublier la propriété ParentWindow de l'objet qui est indispensable à définir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List->ParentWindow = Form1->handle;

  3. #3
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Pour ta boucle tu peux essayer ça:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    AnsiString s;
    TMenuItem *m ;
     
    for(i=0;i<=2;i++)
    {
        s = f->ReadString("Liste des cartes", "Carte" + AnsiString(i), "");
        m = new TMenuItem(PopupMenu1) ;
        m->Caption = s ;
        PopupMenu1->Items->Add( m );
    // pour ajouter des sous items au Nième élément d'un PopumMenu:
    // PopupMenu1->Items->Items[N]->Add( m ); 
    }

    A quoi sert ta ListBox? Si tu n'a pas besoin de la voir et que c'est juste pour stocker des AnsiString, utilise plutôt la classe TStringList qui est faite pour ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TStringList *list = new TStringList();
    // utilisation de la liste
    delete list ;
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  4. #4
    Nouveau membre du Club

    Homme Profil pro
    En recherche d'emploi sur la région de Toulouse
    Inscrit en
    Novembre 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : En recherche d'emploi sur la région de Toulouse
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 62
    Points : 34
    Points
    34
    Billets dans le blog
    1
    Par défaut
    OK merci sat83,
    c'est bien ce que je voulais faire,
    mais pour preciser la chose, je souhaiterais charger la section voulue, en l'occurence "Liste des cartes" dans un TListbox ou TStringList ce qui me permettrais de savoir combien d'item je vais charger dans mon popupmenu et donc remplacer mon "2" de la boucle for "for(i=0;i<=2;i++)" que j'avais mis pour test par le nombre des items.

    j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TStrings *n;
    f->ReadSection("Liste des cartes",n);
    mais j'ai le même soucis : erreur "EAccesViolation".
    Une autre petite idée ?

  5. #5
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    j'ai essayé ça :

    TStrings *n;
    f->ReadSection("Liste des cartes",n);

    mais j'ai le même soucis : erreur "EAccesViolation".
    C'est normal! Tu déclare un objet, puis tu l'utilise sans l'avoir créée. Il faut toujours avoir:
    1) DECLARATION (ça tu l'a fais),
    2) CREATION (avec un new),
    3) UTILISATION,
    4) DESTRUCTION (avec delete).

    Tu peux en effet utiliser ReadSection et un TStringList pour charger les élements de ton Menu (mais c'est à toi de bien écrire ton fichier INI !):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     TStringList *list = new TStringList();
     f->ReadSection("Liste des cartes",list);
     TMenuItem *m ;
     
     for(i=0; i< list->Count; i++)
     {
        m = new TMenuItem(PopupMenu1) ;
        m->Caption = list->Strings[i] ;
        PopupMenu1->Items->Add( m );
     // pour ajouter des sous items au Nième élément d'un PopumMenu:
     // PopupMenu1->Items->Items[N]->Add( m ); 
     }
     
     delete list ;
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  6. #6
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Posts ajouté avant le Rollback

    Citation Envoyé par jeanmichmuch66
    Merci pour ces infos qui mon bien débloqué, maintenant il me reste a affecter une fonction click sur les items du popupmenu créés au démarrage (lu d'un fichier .ini)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TMenuItem *ItemCarte;
    	ItemCarte =dynamic_cast <TMenuItem *>(Sender);
    Itemclick = this->PopupMenu1->Items->Name;         // ??  donne pas le nom de l'item ??
     
    if (FileExists("f:\\****.ini"))   	// remplacer "f:\\****.ini" par
    //le fichier pointé par l'item "d'appel du popupmenu"
    {
    try
    {
    	f = new TIniFile("f:\\****.ini");  //idem
    	i = f->ReadString("Carte", "Image", "");
    }
    __finally
    Mais je n'arrive pas a obtenir le nomm de l'item "cliqué".
    Alors comment faire svp ?
    Citation Envoyé par sat83
    Je ne sais pas si j'ai tous a fait compris ce que tu veux faire, mais voici peut etre une piste:

    Tu créer une méthode générale :
    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
    void __fastcall TForm1::PersoItemPopupMenuClick(TObject *Sender)
    {
      TMenuItem *itemTmp;
      itemTmp = ((TMenuItem *)Sender) ;
     
      AnsiString filename ;
      filename = "f:\\" + itemTmp->Caption + ".ini" ;
     
      if ( FileExists( filename )  
     {
         try
         {
    	f = new TIniFile( filename );  //idem
    	i = f->ReadString("Carte", "Image", "");
         }
    //[...]
    }
    Et ensuite tu ajoute l'affectation à cette méthode pour le click pour les Items créés dynamiquement:
    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
     TStringList *list = new TStringList();
     f->ReadSection("Liste des cartes",list);
     TMenuItem *m ;
     
     for(i=0; i< list->Count; i++)
     {
        m = new TMenuItem(PopupMenu1) ;
        m->Caption = list->Strings[i] ;
        m->OnClick = PersoItemPopupMenuClick;
        PopupMenu1->Items->Add( m );
     // pour ajouter des sous items au Nième élément d'un PopumMenu:
     // PopupMenu1->Items->Items[N]->Add( m ); 
     }
     
     delete list ;
    Citation Envoyé par jeanmichmuch66
    Encore merci ca fonctionne au détails prés que ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString fichier = itemTmp->Caption;
    j'obtient bien le caption de l'item mais il y a un "&" devant qui bloque tout.
    j'aimerais savoir comment récupérer le caption sans le "&" ou une fonction qui me permettrait de récuperer les caractéres aprés un caractére spécifié ("&" pour mon cas) si quelqu'un connais cette fonction...
    Merci
    Citation Envoyé par sat83
    Essai ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      AnsiString fichier = itemTmp->Caption;
      if( fichier.Length() >= 2)
      {
         if( fichier[1] == '&' )
         {
            fichier = fichier.SubString(2,fichier.Length()) ;
         }
      }
    Citation Envoyé par jeanmichmuch66
    malheureusement ca fonctionne que pour le premier item car je viens de m'apercevoir que le "&" se déplace en fonction de la position de l'item.
    alors est il possible de cibler le "&" et de l'extraire de la chaine de caractère.
    Alors regarde du cote de la fonction AnsiReplaceStr():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString fichier = AnsiReplaceStr( itemTmp->Caption, "&", "")
    Citation Envoyé par jeanmichmuch66
    merci c'est tout a fait ce qu'il me fallait, mais serais tu par hasard pourquoi ce "&" apparait dans le caption?
    Citation Envoyé par pottiez
    Le & du caption, signifie que la lettre suivant ce & sera souligné dans ton Item, et grâce à cela, si tu fait la combinaison Alt+"Lettre souligné" lorsque ton menu est ouvert, cela sélectionnera automatiquement l'Item dont la lettre souligné correspond à la lettre tapé.
    Citation Envoyé par TABZ
    Il existe une fonction pour éliminer le '&' lors de la reprise du Caption : "StripHotkey", soit dans votre cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiString fichier = StripHotkey(itemTmp->Caption);
    Il est théoriquement possible d'empêcher l'autocréation des raccourcis (&) en mettant la propriété "AutoHotkeys" à "maManuel". J'ai remarqué qu'en utilisant les PopupMenus de la catégorie TPopupActionBar, celà ne fonctionne qu'à partir des sous-menus, comme s'il y avait un p'tit bug quelque part...
    Quand une réponse vous a été utile, pensez à utiliser le nouveau système de notation

    Lisez le magazine de developpez.com.
    Mes tutos : http://pottiez.developpez.com

    La FAQ BCB -> 642 Questions/Réponses, si vous voulez participer, contactez moi. Aide de BCB6 en français

    N'oubliez pas que l'aide existe et est affichée sous simple pression de la touche F1 , une touche c'est plus rapide que tout un message .

Discussions similaires

  1. Création d'un popupmenu
    Par nemsz dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 11/04/2012, 15h40
  2. [Prob] Création d'archive zip
    Par hannibal.76 dans le forum Langage
    Réponses: 2
    Dernier message: 19/06/2011, 11h19
  3. Création dynamique des lignes d'un PopupMenu
    Par bionicleman dans le forum Langage
    Réponses: 5
    Dernier message: 08/02/2008, 08h43
  4. prob création liste avec javascript
    Par herve70 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/11/2006, 16h18
  5. [VBA-A]Prob création XLS
    Par Mad X dans le forum VBA Access
    Réponses: 6
    Dernier message: 22/03/2006, 12h46

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