Traitée Enchainer les menus

  • jeudi 12 avril 2012 07:44
     
      A du code
    Bonjour,
    J'ai donc un premier niveau de menu qui fonctionne bien tant à la compilation qu'a l'exécution.
    Le choix de WinFom semble pertinent pour mon besoin
    Je cherche maintenant a introduire un deuxième menu qui a pour fonction de donner à l'utilisateur une vision des documents présent dans le répertoire ou on pointe.
    J'ai utilisé les composants ListBox et directorySearcher et j'ai appelé le fichier du nouveau menu dans le fichier du menu principal
    Code :
    #include "OpenFileMenue.h"
    et j'ai essayé d'appeler le menu par l'action correspondante dans le menu principal Je voudrais que sur la sélection du choix on choisisse l'action correspondante qui est d'ouvrir le menu d'ouverture.
    J'ai essayé de voire ce que le codage contextuelle me proposait et il ne m'a rien proposé. J'ai donc codé:
    Code :
    this->openafileToolStripMenuItem->OnSelect->OpenFileMenue();
    et bien entendu le compilateur n'a pas accepté.
    J'ai en outre essayer de mettre une progressBar dans la form et j'ai codé
    Code :
    Form1::progressBar1->TabIndex = 50;
    Qui a fait réagir également le compilateur comme indiqué ci-dessous
    Citation:
    Test3.cpp(16): error C2227: la partie gauche de '->TabIndex' doit pointer vers un type class/struct/union/générique
    J'ai également essayé d'agir dans la form1:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    Form1(void)
    		{
    			InitializeComponent();
    			if( this->openafileToolStripMenuItem->Name == L"openafileToolStripMenuItem") 
    			{
    				OpenFileMenue();
    			}
    		}
    Ce qui compile mais ne fait rien à l'exécution comme si on restait coincé dans le menu Form1
    Comment adresser les objets crées avec WinForm pour les manipuler?
    Que faut il faire. je crois qu'il faut coder une fonction OnSelect. Y a t' il un exemple disponible quelque part? ce serait

Toutes les réponses

  • jeudi 12 avril 2012 19:02
    Modérateur
     
     

    Je ne suis pas sûr d'avoir tout compris.

    Mais votre problématique me semble étrange.

    On ne cherche jamais à faire appel à un menu à partir d'un autre menu.

    Il doit avoir une décorrélation forte entre les éléments d'IHM telle qu'un menu est les actions que peuvent provoquer une sélection de cet élément d'IHM.

    Il est ainsi facile d'avoir plusieurs éléments d'interface produisant la même action. Un item de menu, un bouton dans la toolbar, un raccourci clavier sont très souvent associés à une même action dans l'application.

    Pour faire cette décorrélation, tous ces éléments d'IHM appellent directement et uniquement une action dans un objet distinct comme un contrôleur dans un modèle MVC ou un document dans un modèle Document/vue à la MFC.


    Paul Bacelar, Ex - MVP VC++

  • lundi 16 avril 2012 14:11
     
      A du code

    Bonjour.

    Je dois préciser mon besoin :La tool bar comprend le menu et après si on choisi ouvrir un nouveau fichier il faut ouvrir une autre form

    C'est un besoin basique. je ne comprends pas la complexité apparente de la solution sous Windows

    Je vais mettre le code que j'ai en ce moment pour aider à la compréhension

    Form1(void)
    		{
    			
    			InitializeComponent();
    			Form1.Show( OpenAFile);
    		}

    J'ai mis en œuvre Visual Studio suite a des faiblesses récurrentes de Borland C++ Builder.

    J'ai réussi à tourner les faiblesses de BCB et j'ai aujourd'hui une solution qui marche avec BCB.

    Je ne comprendrai pas qu'on arrive pas à maquetter le fonctionnement de BCB avec VisualStudio;

    Je vous joins les forms de BCB pour documentation

    Je vous joins aussi les forms de VisualStudio pour la maquette, nottament la deuxième form à l'état de maquette

    En esperant que la complexité apparente de la solution proviennent de difficultés de communication et pas de complexité intrinsèque de Visual Studio.

    Je vous remercie de vos conseils.

    • Modifié JeanNoel53 mercredi 18 avril 2012 08:32
    •  
  • mercredi 18 avril 2012 14:08
    Modérateur
     
     Traitée A du code

    C'est très très vague votre truc.

    Primo. Visual Studio n'est ni lié à un langage ni lié à une bibliothèque graphique.

    Donc on va être d'aussi de mauvaise foi que vous.

    >Je dois préciser mon besoin :La tool bar comprend le menu et après si on choisi ouvrir un nouveau fichier il faut ouvrir une autre form

    >C'est un besoin basique. je ne comprends pas la complexité apparente de la solution sous Windows

    Alors basiquement :

    - je crée un projet C++/Winforms

    -J'ajoute à mon projet une nouvelle classe de type Form, qui portera par défaut le nom From2

    - j'ouvre le Designer de Formulaire la classe Form1 (celle pré crée)

    - je drop depuis la fenêtre "Toolbox" un menuStrip

    - j'ajoute les menuitem du menu de mon formulaire directement dans le Designer de Formulaire

    - je double-click sur l'item de menu en charge de la création du nouveau formulaire

    - VS ouvre le code source (dans Form1) sur le code de gestion de l'évènement de clcik du menuItem

    - vous ajoutez le code qui fait :

    ....
    {
    ....
        var toto = new Form2();
        toto.Show();
    ....
    }

    Je ne vois aucune "roquet science" dans tout cela.

    C'est quoi votre problème ? Avez-vous au moins lu un tutoriel sur les technologies que vous voulez employer ?


    Paul Bacelar, Ex - MVP VC++

  • vendredi 20 avril 2012 15:10
     
     Traitée A du code

    Merci c'est les 2 derniers points clefs qui me manquaient. J'ai galéré comme un malade et tu me l'a donné. Merci

    J'ai acheté 2 bouquins et j'ai fait les 2 premiers exercices sur msdn

    Je n'ai cependant pas trouve de livres sur C++ avec Visual studio 2010. Une référence serait la bienvenue

    Je n'arrive d'ailleurs plus a aller sur le tutorial de msdn un lien serait le bienvenu.

    Je trouve quand même, et je le dis avec reconnaissance que l'information pour débuter est très difficile à trouver:

    J'ai conscience d'avoir été un peu provoquant dans mon dernier message, mais j’avais besoin de donner un coup de pied dans la fourmilière, et je te remercie un fois encore de ta réponse que je te demande de compléter dans la suite du message. et j'avais pris la précaution de dire En espérant que la complexité apparente de la solution proviennent de difficultés de communication et pas de complexité intrinsèque de Visual Studio.

    je met d’abord la classe de référence à appeler c'est du code généré par VS

    public ref class OpenAFile : public System::Windows::Forms::Form
    	{
    	public:
    		OpenAFile(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: ajoutez ici le code du constructeur
    			//
    		}


    Je met après le code transposé de ton exemple j'ai essayé deux variantes avec des résultats divers

    private: System::Void openAFileToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
    				 var FormToOpen = gcnew OpenAFile();
                     FormToOpen.Show();
    			 }

    il ne semble pas aimer le var

    1>  Test6.cpp
    1>d:\usr\memoria\dev\aln_kernel\make\test6\test6\Form1.h(163): error C2065: 'var' : identificateur non déclaré
    1>d:\usr\memoria\dev\aln_kernel\make\test6\test6\Form1.h(163): error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'FormToOpen'
    1>d:\usr\memoria\dev\aln_kernel\make\test6\test6\Form1.h(163): error C2065: 'FormToOpen' : identificateur non déclaré
    1>d:\usr\memoria\dev\aln_kernel\make\test6\test6\Form1.h(164): error C2065: 'FormToOpen' : identificateur non déclaré
    1>d:\usr\memoria\dev\aln_kernel\make\test6\test6\Form1.h(164): error C2228: la partie gauche de '.Show' doit avoir un class/struct/union
    1>          le type est ''unknown-type''

    j'ai donc codé

    private: System::Void openAFileToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
    				 Test6::OpenAFile FormToOpen = gcnew OpenAFile();
                     FormToOpen.Show();
    			 }

    et la il crache moins mais ce n'est pas bon pour autant

    1>  Test6.cpp
    1>d:\usr\memoria\dev\aln_kernel\make\test6\test6\Form1.h(163): error C3673: 'Test6::OpenAFile' : la classe n'a pas de constructeur de copie
    1>
    1>ÉCHEC de la build.

    il y a donc un manquant dans l'explication. Quel type à donner à Toto ou a FormToOpen?

    en fait il faut les déclarer en classe

    private: System::Void openAFileToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
    				 Test6::OpenAFile^ FormToOpen = gcnew OpenAFile();
                     FormToOpen->Show();
    			 }

    Donc j'ajoute les points clefs suivants:

    -Toto doit être déclaré comme une classe par  Type^

    -il faut utiliser gcnew à la place de new

    - dès lors l'appel se fait par pointeur et donc FormToOpen->Show() au lieu de FormToOpen.show();





    • Modifié JeanNoel53 vendredi 20 avril 2012 15:12
    • Modifié JeanNoel53 vendredi 20 avril 2012 15:42
    • Modifié JeanNoel53 vendredi 20 avril 2012 21:06
    • Modifié JeanNoel53 samedi 21 avril 2012 08:33
    • Marqué comme réponse JeanNoel53 samedi 21 avril 2012 08:33
    •  
  • mercredi 2 mai 2012 09:59
    Modérateur
     
     

    Désolé pour la mauvaise humeur de ma réponse.

    De plus, vous avez fait l'effort de corriger mes énormes fautes.

    Mon code était en C# et non en C++. Encore désolé.

    Ma réponse est une réaction à votre "coup de pied dans la fourmilière" et est donc aussi un peu provocatrice.

    Je vous ai donné la méthode la plus rapide pour faire l'enchaînement mais cela implique l'utilisation non du C++ mais du C++/CLI.

    Comme vous avez fait l'amer constat, la documentation de M$ est pléthorique (et je la trouve bien faite) mais elle a plus l'air d'un tsunami d'information pour une personne débutant sous Windows. Il est important d'avoir des repères pour voir si une documentation est applicable ou pas dans un contexte défini.

    Et le C++/CLI n'est pas l'une des technologies des plus accessibles aux novices, car il aborde énormément de concepts de Windows.

    Si vous êtes motivé pour apprendre l'ensemble des arcanes de Windows, le C++/CLI est une bonne solution mais ce n'est pas forcement la technologie avec la courbe d'apprentissage la plus efficiente. ;-)

    Mais au vu de votre réponse, il semble que vous n'êtes pas un manchot. ;-)

    Donc si vous voulez continuer sur cette voie du C++/CLI, il y a juste 2 remarques pour que vous ne vous perdiez pas :

    Le C++/CLI c'est une variante du C++ qui ajoute des fonctionnalités d'utilisation du Framework .NET au langage C++.

    Les Winform, la bibliothèque graphique, que vous utilisez sont des composants .NET, ils ne sont utilisables qu'avec un langage dit .NET (C#, VB.NET, C++/CLI ...). C'est pour cela que vous devez utiliser le C++/CLI et non de C++ "simple" pour pouvoir vous en servir.

    En très grosse approximation, .NET est un environnement d'exécution assez proche du runtime JAVA, le garbage-collector en particulier.

    C'est pour cela qu'en C++/CLI, il existe deux types de classe/structure, les classes dites managées et les classes dites non managées.

    Les classes "traditionnelle" C++ sont les classes non managées.

    Les objets de classe managées doivent "vivre" dans l'environnement .NET (ou CLR pour Common Language Runtime) car ils doivent pouvoir être déplacés en mémoire par le ce Runtime et les "finalizer/destructeurs" par le garbage-collector de ce même Runtime.

    le mot clé gcnew (pour garbage-collectable new, peut-être) est un mot clé de C++/CLI pour demander au compilateur de créer l'objet dans l'environemment .NET et non dans la mémoire "gérée" pat le C-Runtime (malloc, via new ou non).

    Type^, ce n'est pas un pointeur à proprement parlé, ni une référence, c'est un "handle" sur un objet managé. Un objet managé est succeptible d'être déplacé en mémoire par le Runtime .NET. En passant par cet intermédiaire, votre code C++ peut toujours utiliser l'objet même après un compactage de la mémoire managée de .NET qui déplace les objets managés en mémoire.

    le -> n'est pas vraiment "suivre le pointeur" dans ce cas là, mais "récupérer l'objet correspondant au handle".

    Le C++/CLI devient nettement moins fun quand les données des objets managées doivent être accédées par des fonctions du système qui demande des pointeurs par exemple. :-(

    P.S.: pour faire une boite de dialogue pour choisir un fichier ou un répertoire, Winform dispose d'un composant clé en main : "OpenFileDialog" (il est dans ma section "Boîtes de dialogue" de la Toolbox). ;-)


    Paul Bacelar, Ex - MVP VC++

  • mercredi 2 mai 2012 10:30
     
     
    Merci de cette réponse documenté, je n'avais qu'un bon souvenir de toi. il n'y a pas à s'excuser.

    Jean Noël Martin