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

Composants VCL Delphi Discussion :

ajouter dynamiquement des items dans un popup menu


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut ajouter dynamiquement des items dans un popup menu
    Bonjour,

    j'ai besoin de créer les items de mon popup menu au lancement de mon appli , en me basant sur un fichier ini.
    pas de problemes pour créer l'item, lui modifier son caption etc.. mais je n'arrive pas a lui mettre une action.
    voila a quoi ressemble mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    popup.items.create(popup);
    popup.items[popup.items.count-1].caption:='test';
    popup.items[popup.items.count-1].onclick:=shellexecute(0,'open',pansichar(path_de_mon_truc_a_lancer),nil,nil,sw_show)
    donc sur le onclick j'ai une erreue types incompatibles, "tnotifyEvent" et "cardinal".
    Si qqun peut me mettre sur la voie...
    merci

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    C'est noraml, il faut que tu affctes à ton onClick un évènement, pas le résultat de SheelExecute. Voilà comment tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TMonObjet.MonClic(Sender : TObject);
    begin
      shellexecute(0,'open',pansichar(path_de_mon_truc_a_lancer),nil,nil,sw_show);
    end;
     
    {...}
    popup.items.create(popup); 
    popup.items[popup.items.count-1].caption:='test'; 
    popup.items[popup.items.count-1].onclick:=monClic;
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut
    types incompatibles, 'tnotifyevent' et 'procedure, untyped pointer or untyped parameter'
    edit: non en fait ca passe dsl, par contre j'ai besoin de passer un parametre a la procedure qui va servir d'action , dans mon cas une string.
    et la j'ai un peu du mal a declarer la procedure ou l'utiliser...
    je declare ma procedure comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure launch_item(path:string;sender:Tobject)
    et j'essaye de lancer comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    popup.items[popup.items.count-1].onclick:=launch_item('mon_chemin',popup)
    et j'ai un peu de mal , types incompatibles etc...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut
    bon en fait j'ai reussi a arriver a ce que je recherchais en utilisant une variable globale , c'est un peu du bricolage mais bon .
    Vu que la question principale du sujet a été expliquée, je met resolu, encore merci pour la reponse rapide

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    non, un évenement OnClick s'attend à un TNotifyEvent. Si tu fait control + click sur le mot TNotifyEvent ( ou dans l'aide ) , tu peut voir qu'il est déclaré comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TNotifyEvent = procedure(Sender: TObject) of object;
    le procedure(Sender: TObject) signifie que la procédure que tu met en paramètre doit être procedure QuelqueChose (Sender: TObject) et le of object signifie que ta procédure doit appartenir à un object ou class ( par exemple ta forme ). Donc tu doit faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.launch_item(Sender : TObject);
    begin
     //Pour accéder à l'objet, il faut faire un cast
     //ici, tu peut faire pour récupérer le menuItem
     TMenuItem(Sender).Caption := "Cool";
    end;
     
    //Pour assigner :
    popup.OnClick := Self.launch_item;

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut
    ok merci beaucoup pour ces infos, j'y vois plus clair

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 129
    Points : 128
    Points
    128
    Par défaut
    bon je reprend le topic parce qu'il ya qque chose que je ne comprends toujours pas:

    donc en pratique voila ce que je veux faire:
    lire un fichier ini au demarrage de l'appli , et construire les items de mon popup, avec pour chaque evenement onclick d'un item, un shell execute du chemin de l'appli associé a l'item.
    deja le code pour la création des items etait mauvais, voila comment je fais maintenant:

    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
     
    procedure tform1.check_applis;
    var
      myIni: TIniFile;
      appli,path:string;
      sl_temp:tstringlist;
      i,pos:integer;
      myitem:Tmenuitem;
     
    begin
     
      sl_temp:=tstringlist.Create;
     
      myIni:=TIniFile.Create(ExtractFilePath(application.ExeName)+'conf.ini');
     
      //je met dans une string list les lignes de mon fichier ini
      myini.ReadSectionValues('application_off',sl_temp);
     
     
      for i:=0 to sl_temp.Count-1 do
     
      begin
     
     //je separe le nom de l'appli de son chemin pour l'exe
      pos:=PosEx('=',sl_temp[i]);
     
    //nom de l'appli pour la caption de l'item
      appli:=leftstr(sl_temp[i],pos-1);
     
    //chemin relatif de l'exe pour le shell execute
      path:=RightStr(sl_temp[i],length(sl_temp[i])-pos);
     
     //path_item est une variable globale
      path_item:=path;
     
     
    //creation de l'item et mise a jour de ses propriétés 
      myitem:=TMenuItem.Create(pop2);
      myitem.Caption:=appli;
    //lauch item est une procedure qui utilise la variable globale path_item pour "savoir quoi lancer"
      myitem.OnClick:=launch_item;
     
     
      end;
    bon mon code est completement debile , vu que des que l'evenement onclik d'un item sera lancé, il lancera la procedure launch_item, qui aura comme variable path_item la derniere valeur de la boucle.
    je me vois mal créer une procedure par item possible, donc j'avoue mal voir comment gerer ca


    edit: j'ai trouvé un moyen qui a le merite de marcher mais bon
    je met le chemin de l'exe dans le hint de l'item, et je l'utilise apres dans la procedure launch_item avec comme parametre menuitem(sender).hint

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    A mon avis il serais peut être préférable de modifier ton fichier ini afin que cela soit plus simple.

    Exemple:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    [Item_0]
     
    ....
    // tes valeurs 
    ....
     
    [Item_1]
     
    ...
    // Tes valeurs
    ...
     
    [Item_X]
    Apres il suffit que tu récupères le numéro apres item_ et que tu l'assignes au tag du TMenuItem.
    enfin, il te reste plus qu'a faire ta fonction de click dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    procedure Form1.MonOnclick(Sender : TObject);
    var
      sSection : string;
      myIni: TInifiles
    begin
      if Sender is TMenuItem then
      begin
        sSection := 'Item_' + inttostr((Sender as TMenuItem).Tag);
        myIni:=TIniFile.Create(ExtractFilePath(application.ExeName)+'conf.ini');
        // puis il te reste plus qu'a gérer la section et la récupération des chemins et autres directement avec des readstring.
      end;
    end;
    C'est une solution possible parmis tant d'autres
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter dynamiquement des item au menu
    Par Ryu2000 dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 16/05/2012, 16h24
  2. Réponses: 8
    Dernier message: 24/08/2010, 12h44
  3. Réponses: 2
    Dernier message: 30/07/2010, 15h55
  4. ajout dynamique des option dans un select
    Par rochdi123 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/10/2009, 20h30
  5. ajout dynamique d'item dans menu
    Par med_ellouze dans le forum VB.NET
    Réponses: 2
    Dernier message: 23/01/2008, 10h45

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