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 :

Creation dynamique d'elements de menu avec une DLL [Non suivi]


Sujet :

C++Builder

  1. #1
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut Creation dynamique d'elements de menu avec une DLL
    Bonsoir,

    Encore une p'tite question nocturne....

    J'ajoute des TMenuItems au TMainMenu de ma form principale au moyen d'une fonction appellée d'une DLL.
    Celle ci lit les valeurs contenues ds une table pour ajouter les items et ajuste la propriété Enabled en fonction de valeurs ds cette meme table.

    Tout va bien, jusqu'au 'OnClick()' des TMenuItems, qui ne génèrent aucune erreur mais ne donnent pas les réponses attendues.Seuls les premiers et derniers items répondent correctement, et les autres sont soit muets soit taquins.
    A noter qu'avant insertion de ces nouveaux items, il existe déja 3 items 'fixes' (dont les 'OnClick()' sont codés 'en dur' ds la fiche principale donc ne posant pas de problemes).

    Ci joint un bout de code de la DLL, l'action se situant ds ActionChargerMenu :
    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
     
     
    //---------------------------------------------------------------------------
     
    void __fastcall ActionChargerMenu(TMainMenu* AMenu, TTable* ATable)
    {
    //..................
     
    TMenuItem *pItem; String TexteComplet, PremiereLettre;
    for (int i = 7; i < ATable->Fields->Count; i ++)
    {
    PremiereLettre = ATable->Fields->Fields[i]->DisplayName.SubString(1,1);
    TexteComplet = (ATable->Fields->Fields[i]->DisplayName.LowerCase()).Delete(1,1);
            pItem = new TMenuItem(AMenu);
            pItem->Name = "Menu" + IntToStr(i);
            pItem->Caption = TexteComplet.Insert(PremiereLettre,1);
            pItem->Tag = i;
            pItem->Enabled = ATable->Fields->Fields[i]->AsBoolean;
            pItem->OnClick = frmReponseInterfac->ActionReponseMenu->OnExecute;
            AMenu->Items->Insert(i - 6, pItem);
     
    }
     
    //...........
     
    }
    //---------------------------------------------------------------------------
    Pour la 'réponse' au click, j'espérait utiliser betement un truc comme :
    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
     
    void __fastcall TfrmReponseInterfac::ActionReponseMenuExecute(
          TObject *Sender)
    {
    TMenuItem* pItem = dynamic_cast < TMenuItem * > (Sender);
     
    switch ( pItem->Tag )
    {
            case 7:
           //.........
            break;
            case 8:
            //...........
                    ShellExecute(Handle, "open", "Ventes.exe", NULL, NULL, SW_SHOW);
            break;
            default:
            //..............
            break;
    }
     
    }
    Merci d'avance pour vos conseils éclairés,
    @ +

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    Tu veux dire que le premier et le dernier éléments ajoutés par ta fonction sont correctement traités mais pas les autres??

  3. #3
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir,

    Oui, effectivement , c'est exactement ce qui arrive

    je sais, je sais, cela ne parait pas tres clair, mais c'est pourtant ce qui arrive.

    //Edit :
    J'ai menti.............c'est pire. Y'a un des éléments 'dynamique' qui prends l'action du premier élément 'fixe'.
    Ca pourrait presque me faire rire, si ce n'etait pas si génant pour mon cas en cours.
    //


  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    Je ne vois pas trop quelle pourrait être l'erreur.

    Je vois que tu changes le nom de l'objet... Est-ce vraiment nécessaire? As-tu essayé sans, car l'aide de Borland précise:
    Warning: Changing Name at runtime causes any references to the old name to become undefined. Any subsequent code that uses the old name will cause an exception.
    Peut-être que ton pointeur n'est plus vraiment valide après le changement de nom (mais je ne pense pas)

    As-tu vérifié si le pointeur sur OnClick est bien le même au moment de la création pour chaque élément?

    Est-il modifié par une autre partie du code qui pourrait expliquer ce comportement?

    As-tu essayé de faire le Insert avant le OnClick? D'associer directement le pointeur sur la fonction (sans passer par l'action->OnExecute):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pItem->OnClick = frmReponseInterfac->ActionReponseMenuExecute
    Ce ne sont que des pistes... et aucune ne me convainc vraiment :-(

    Bonne chance

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    D'une part on a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pItem->OnClick = frmReponseInterfac->ActionReponseMenu->OnExecute;
    Et d'autre part on montre un prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void __fastcall TfrmReponseInterfac::ActionReponseMenuExecute( 
          TObject *Sender)
    Ne faudrait-il pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pItem->OnClick = frmReponseInterfac->ActionReponseMenuExecute;
    A plus !

  6. #6
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonsoir a tous,

    Merci d'abord pour vos différentes réponses...
    J'ai essayé (ou réessayé en fonction des cas) ce qui m'avait été indiqué, et je n'ai pas de nouveau résultat. (C'est fou ca...)
    Je ne peut pas vraimment faire du sur-place pendant trop longtemps, j'ai donc troqué mon idée première pour une fonction qui ne gère que le caractère 'Enabled' en fonction des TMenuItems des valeurs lues dans la table; en espérant trouver le pourquoi du comment un peu plus tard.
    (Bon je suis obligé de rester avec des TMenuItems 'fixes', mais tant pis pour l'instant)

    Merci et @ +

Discussions similaires

  1. [C++ Win32] un menu avec une fenêtre Dialog
    Par swo.line dans le forum C++
    Réponses: 0
    Dernier message: 27/04/2008, 11h03
  2. Element de menu avec lettre soulignée
    Par Ivynox dans le forum Windows Forms
    Réponses: 4
    Dernier message: 10/12/2007, 17h45
  3. cocher un item dans un menu, avec une dialog
    Par Racailloux dans le forum MFC
    Réponses: 1
    Dernier message: 07/12/2007, 10h49
  4. Problème de creation de repertoire avec une DLL
    Par Avisseau dans le forum Delphi
    Réponses: 4
    Dernier message: 19/06/2006, 09h13
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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