Partage
  • Partager sur Facebook
  • Partager sur Twitter

GtkAda - Les signaux

instantiation error at gtk-handlers.ads

Sujet résolu
    12 décembre 2020 à 11:23:36

    Bonjour,

    En commençant la partie signaux j'ai essayé l’instanciation du paquetage avec les commandes :

    package p_Callback is new Gtk.Handlers.Callback(Gtk_Window_Record);
    use p_Callback;

    Et je tombe sur ce message d'erreur :

    main.adb:28:03: instantiation error at gtk-handlers.ads:1039
    main.adb:28:03: subprogram must not be deeper than access type
    gprbuild: *** compilation phase failed

    (La ligne 28 étant la première ligne du code en ada)

    Je ne trouve pas beaucoup des réponses en faisant mes recherches, c'est pour cela que j'utilise le dernier recours du forum OpenClassrooms.

    Je vous remercie par avance pour vos réponses :D.

    Autres informations :

    • OS : Ubuntu 20.04 LTS
    • Commande de compilation :
    gprbuild main.adb
    •  Version de GtkAda : 19 (installé via le paquet libgtkada19)
    • J'ai mis le code en Ruby parce qu'il n'y avait pas d'Ada ^^'

    Merci pour toutes réponses ^^.

    -
    Edité par Raznaël 13 décembre 2020 à 11:36:05

    • Partager sur Facebook
    • Partager sur Twitter
      14 décembre 2020 à 15:35:08

      Bonjour,

      Merci beaucoup! Tu me débloques bien (bizarrement j'avais déjà vu cette page mais il ne me donné pas la même chose).

      Je reste tout de même un peu bloqué suite au message d'erreur :

      Compile
         [Ada]          main.adb
      main.adb:17:07: no selector "On_Delete" for type "Gtk_Window_Record'class" defined at gtk-window.ads:73
      gprbuild: *** compilation phase failed

      Pour la ligne :

      Window.On_Delete(Handlers.Delete_Event'Access); -- Connect handler

      Cependant le on_destroy est quand même reconnu et si je met le ligne en erreur en commentaire le code fonctionne bien (selon le résultat attendu).

      Ça me chiffonne un petit peu ^^'.

      Quelle est exactement la différence en on_destroy et on_delete ? (à part que l'un demande un accès à une fonction et l'autre une procédure).

      Merci beaucoup pour ta réaction, j'avoue que je ne pensais pas avoir de réponse.

      -
      Edité par Raznaël 14 décembre 2020 à 15:35:41

      • Partager sur Facebook
      • Partager sur Twitter
        14 décembre 2020 à 17:17:52

        je pense que la différence c'est que delete c'est une suppression mais on conserve une partie des données en mémoire (on peut réutiliser l'élément sans le recréer entièrement), alors que destroy on efface aussi les données (si on veut réutiliser l'élément il faut le recréer entièrement)
        • Partager sur Facebook
        • Partager sur Twitter
          14 décembre 2020 à 18:34:55

          Pour le coup, je te recommande de garder sous le coude le reference manual de GTKAda : https://docs.adacore.com/live/wave/gtkada/html/gtkada_rm/index.html

          Couplé aux user guide : https://docs.adacore.com/live/wave/gtkada/html/gtkada_ug/index.html

          + la doc officiel de GTK (en C) : https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget-delete-event

          Tu gagnera du temps.

          Sache que la partie consacré à GTK du cours Ada est en partie obsolète.

          De plus, dans le monde Ada, on utilise toujours massivement les newsgroups. Alors oui c'est préhistorique, mais les habitudes des Ancêtres ont la vie dur :D :

          - comp.lang.ada

          - fr.comp.lang.ada

          À l'occasion, tu pourra jetter un coup d'œil à ce projet que j'avais fait à la fac entièrement en Ada et qui utilise GtkAda : https://github.com/Heziode/lsystem-editor

          -
          Edité par Heziode 14 décembre 2020 à 18:38:17

          • Partager sur Facebook
          • Partager sur Twitter
          Ensemble créons l'avenir !
            15 décembre 2020 à 12:34:07

            Merci beaucoup à toi Umfred pour tes réponses (je suis allé voir et tu as raison sur la différence c'est bien ça).

            Merci beaucoup à toi aussi Heziode, je dois avouer que j'ai beaucoup de mal. C'est un peu obscure mais je vais m'y faire assez vite je pense.

            Je met rapidement la réponse à ceux qui la rechercherai :

            • il faut bien mettre les Handlers dans un paquet à part pour ne pas avoir la même erreur que moi
            • on_destroy est pour la destruction du widget et on_delete pour la suppression sans avoir à le reconstruire après

            J'ai un paquet Handlers avec la procédure :

            procedure quit(window : access Gtk_Widget_Record'Class) is
            begin
              main_quit;
            end quit;

            Et ma procédure principale avec :

            window.on_destroy(handlers.quit'access);

            (je vais faire un edit pour on_delete)

            Bonne journée à vous ^^

            -
            Edité par Raznaël 15 décembre 2020 à 12:34:43

            • Partager sur Facebook
            • Partager sur Twitter

            GtkAda - Les signaux

            × 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