Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Tutoriel] Apprendre à programmer avec Ada

signaux

Sujet résolu
    4 juillet 2019 à 11:46:14

    Bonjour,

    j'ai un problème avec les signaux de gtk.

    with Gtk.Main;               use Gtk.Main;
    with Gtk.Window;             use Gtk.Window;
    with Gtk.Enums;              use Gtk.Enums;
    with Gtk.Button;             use Gtk.Button;
    with Gtk.Handlers;  
    
    procedure FenetreSignal is
       
       package P_Callback is new Gtk.Handlers.Callback (Gtk_Window_Record);
       use P_Callback;
       
       procedure Stop_Program (Emetteur : access Gtk_Window_Record'Class) is
          pragma Unreferenced(Emetteur);
       begin
          Main_Quit;
       end Stop_Program;
       
       win : Gtk_Window;
       btn : Gtk_Button;
       
    begin
       Init;
       Gtk_New (win, Window_Toplevel);
       win.Set_Title ("Fenetre");
       win.Set_Default_Size (200, 150);
       
       Gtk_New_With_Mnemonic (btn, "_Exit");
       
       win.Add(btn);
       
       Connect(win, "destroy", Stop_Program'Access);
       
       win.Show_All;
       
       Main;
    end FenetreSignal;
    

    Le code ci-dessus me donne l'erreur ci-dessous :

     Que changer pour que cela fonctionne ?

    • Partager sur Facebook
    • Partager sur Twitter
      5 juillet 2019 à 20:56:16

      Réponse courte :
      Instantie le package générique dans une unité de packtage.
      Explication :
      C'est une question d'accès et de visibilité.
      Il est possible d'affecter à une variable un sous programme de ton instanciation du package des Callbacks.
      C'est d'ailleurs ce que tu fait avec ta procédure Stop_Program à la ligne 31 :
      Connect(win, "destroy", Stop_Program'Access);
      Tu attach à la variable `win` la callback Stop_Program sur l'évènement "destroy".
      Bon, là `win` est déclarer dans ta procédure, mais si c'était un paramètre passer à la procédure, il serait alors possible de tenter d'appeler le `Stop_Program` sur un évènement "destroy" qui surviendrait plus loin dans le programme (en dehors du scope de `FenetreSignal`). C'est pour cela que c'est interdit par le langage. Car en dehors de `FenetreSignal`, la procédure `Stop_Program` n'est plus visible.
      Tu peux donc éviter ce problème déclarant ton instantiation dans un package.

      -
      Edité par Heziode 5 juillet 2019 à 20:57:49

      • Partager sur Facebook
      • Partager sur Twitter
      Ensemble créons l'avenir !
        9 juillet 2019 à 9:54:50

        Bonjour,

        c'est ce que j'ai remarqué en faisant la suite du tuto dans lequel il sépare tout.

        Merci

        -
        Edité par Ryumizuhi 9 juillet 2019 à 9:55:12

        • Partager sur Facebook
        • Partager sur Twitter

        [Tutoriel] Apprendre à programmer avec Ada

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown