Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Problème avec l'objet Toolbar | |
| | |
Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 2:33 | |
| Alors là, tu m'épates. Sous XP, c'est impeccable, et en traçant la DLL, je note aucune exception dans le sans Windows, c'est-à-dire aucune anomalie d'exécution. Faut que je réfléchisse. Pour le moment, je n'ai aucune piste... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 19 Jan 2014 - 2:35 | |
| En même temps, RemoveToolbar essaye de détruire un objet en cours d' utilisation...
Edit : on s' est croisé. Perso, je suis sous w7 mais je ne sais pas pour Pan59. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 2:39 | |
| Certes, Ygeronimi, mais pas un objet géré par Panoramic. J'ai même fait ceci: - Code:
-
click_toolbar: yy%=val(text$(1)) message yy% if yy%=3 fin_toolbar() ' res% = dll_call1("RemoveToolbar",1) dll_off message "On sort..." terminate end_if return et mon petit message s'affiche bien, et en le validant on finit par sortir du programme. Je peux même fermer le programme brutalement, par la croix rouge, sans passer par RemoveToolbar ni DLL_OFF, et il n'y a pas de problème. Je répète, je suis perplexe... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 2:39 | |
| J'ai testé et ça marche sans problème. Vive XP!
Edit : la DLL que j'utilise est un peu ancienne.
Dernière édition par papydall le Dim 19 Jan 2014 - 2:43, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 2:40 | |
| Ouf ! Merci, Papydall! Au moins une nouvelle rassurante ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 19 Jan 2014 - 2:46 | |
| Je te confirme que la sortie par la croix se passe de dll_off et de removetollbar même sous w7 et sans souci ( maintenant ). Mais si je fais sauter le dll_off et terminate du code précédent j' ai droit à ceci : si je réactive les deux zozos j' ai droit à PANORAMIC.exe a cessé de fonctionner Là je pense que c' est du au terminate qui coucircuite la violation. Edit : Pour moi perso, la sortie par la croix me suffit. je ne mets pas de bouton "quitter" et l' utilisateur est bien obligé de passer par la croix. Je poursuis les testes pour ceux comme Pan59 qui ont besoin d' une finition plus pro. Bon, il est temps pour moi d' aller , je ne sais pas ce que j' ai en ce moment...je ne tiens plus la route... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 2:53 | |
| Ah, là, tu me donnes une piste. En désactivant de ld DLL_OFF et terminate, j'ai bien mon message "On sort...", mais ensuite, j'ai un message "Erreur abstraite". Si je rétablis le ON_CLOSE 0,CLOSE0 avec le traitement approprié, cette anomalie est éliminée. Tu avais raison: on ne peut pas supprimer la toolbar pas un bouton de la même toolbar ! Bravo, Ygeronimi. Voici le code opérationnel que je propose: - Code:
-
label click_toolbar, close0
dim res%, icon$, after%, hint$, yy%
dll_on "KGF.dll"
edit 1 : hide 1
on_change 1,click_toolbar on_close 0,close0
res% = dll_call4("CreateToolbar",handle(0),handle(1),0,2) ' res% = dll_call4("ModifyToolbar",7,16,0,0) ' res% = dll_call4("ModifyToolbar",1,255,255,255) : ' blanc res% = dll_call4("ModifyToolbar",7,16,0,0) : ' icones 32 x 32 width 0, width(0) + 200 height 0,screen_y-40 res% = dll_call4("ModifyToolbar",2,0,0,0)
hint$ = "" icon$ = "KGF_266" res% = dll_call4("AddButtonToToolbar",1,0-1,adr(hint$),adr(icon$))
hint$ = "" icon$ = "KGF_66" res% = dll_call4("AddButtonToToolbar",2,0-1,adr(hint$),adr(icon$))
hint$ = "" icon$ = "KGF_204" res% = dll_call4("AddButtonToToolbar",3,0-1,adr(hint$),adr(icon$))
end
click_toolbar: yy%=val(text$(1)) message yy% if yy%=3 terminate end_if return close0: fin_toolbar() res% = dll_call1("RemoveToolbar",1) dll_off message "On sort..." return
sub fin_toolbar() res% = dll_call1("RemoveToolbar",1) end_sub | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 19 Jan 2014 - 3:07 | |
| J' ai essayé...ben c' est pareil le message revient lors de la fermeture par le bouton de la toolbar. PANORAMIC.exe a ces..... bref si je passe par la croix, aucun souci. il faudrait essayer un gosub fin et fin: Terminate return (ou sans return ) car là on sort de la toolbar...enfin je crois...quoi que je ne sais plus... Aller bonne nuit à tous ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 3:10 | |
| Mon test précédent était fait avec une version ancienne de KGF.DLL. Je viens de télécharger la nouvelle version du dimanche 19 janvier 2014 01:13:50. C’est OK ! No problem !
@klaus Dans ton dernier exemple, la sub fin_toolbar() n’a plus sa raison d’exister ni son appel à la ligne 43, ou suis-je complètement hors jeu ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 3:19 | |
| Tu as raison - moi aussi, je vais prendre un peu de sommeil. N'empêche - avec le code que je viens de poster ci-dessus, je n'arrive plus a produire de crah, quelque soit la manière dont je m'y prends. EDIT Allez, un petit dernier pour la route (ça marche impeccablement chez moi: - Code:
-
label click_toolbar, close0, sortir
dim res%, icon$, after%, hint$, yy%
dll_on "KGF.dll"
edit 1 : hide 1
on_change 1,click_toolbar on_close 0,close0
res% = dll_call4("CreateToolbar",handle(0),handle(1),0,2) ' res% = dll_call4("ModifyToolbar",7,16,0,0) ' res% = dll_call4("ModifyToolbar",1,255,255,255) : ' blanc res% = dll_call4("ModifyToolbar",7,16,0,0) : ' icones 32 x 32 width 0, width(0) + 200 height 0,screen_y-40 res% = dll_call4("ModifyToolbar",2,0,0,0)
hint$ = "" icon$ = "KGF_266" res% = dll_call4("AddButtonToToolbar",1,0-1,adr(hint$),adr(icon$))
hint$ = "" icon$ = "KGF_66" res% = dll_call4("AddButtonToToolbar",2,0-1,adr(hint$),adr(icon$))
hint$ = "" icon$ = "KGF_204" res% = dll_call4("AddButtonToToolbar",3,0-1,adr(hint$),adr(icon$))
end
click_toolbar: yy%=val(text$(1)) message yy% if yy%=3 timer 17 timer_interval 17,500 on_timer 17,sortir end_if return sortir: timer_off 17 close0: res% = dll_call1("RemoveToolbar",1) message "On sort..." terminate
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 3:25 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 3:31 | |
| YES!!!!!!!!! Merci, Papydall ! On verra l'avis de Ygeronimi et Pan59 demain - euh, toute à l'heure ! Allezz, dodo maintenant ! | |
| | | pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 12:32 | |
| Bonjour. Le nouveau code fonctionne parfaitement. Cependant, je trouve plusieurs choses bizarres tout de même. Je ne savais pas qu'il était possible d'afficher une variable entière sans utiliser str$(nom), comme dans message yy%. Selon moi, il manquerait un return afin de sortir du label ' sortir' Enfin ! - Code:
-
yy%=val(text$(1)) message yy% sortir: timer_off 17
close0: res% = dll_call1("RemoveToolbar",1) message "On sort..." terminate
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 13:20 | |
| Salut pan59 - pan59 a écrit:
- Je ne savais pas qu'il était possible d'afficher une variable entière sans utiliser str$(nom), comme dans message yy%.
La command message permet d’afficher soit un texte soit une valeur numérique. Elle peut même évaluer une expression mathématique avant de l’afficher comme dans ce code : - Code:
-
dim a a = 123.456 message a + a + sin(1.123) * rnd(100)
message se comporte un peu comme print - pan59 a écrit:
- Selon moi, il manquerait un return afin de sortir du label 'sortir'
Au contraire, si on mettait un return, on ne pourrait plus sortir puisqu’on coupe court au close0 : Ce n’est pas parce qu’un label existe qu’il faut obligatoirement se terminer par un return. En l’absence de return, le programme se poursuit à l’instruction suivante et il n’y a rien d’incorrect s’il rencontre un autre label ou d'autres labels dont au moins le dernier doit se terminer par un return. J’espère que j’étais clair !
Dernière édition par papydall le Dim 19 Jan 2014 - 13:31, édité 1 fois | |
| | | pan59
Nombre de messages : 367 Age : 67 Localisation : Wattignies Date d'inscription : 16/10/2011
| Sujet: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 13:29 | |
| Bonjour.
Merci papydall pour les infos.
C'est très clair.
Bon dimanche. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 13:43 | |
| Pour le label sortir: Effectivement, je n'ai pas conçu "sortir" comme un sous-programme indépendant, mais comme un point d'entrée dans la routine close0. C'est la même technique que la notion desd ENTRY en Fortran: créer différents points d'entrée dans un sous-programme ou une fonction, afin d'effectuer des traitements d'initialisation différents, avant de parcourir le corps commun de la routine. Dans le cas présent, il est impératif de stopper le timer avant de faire le reste du traitement, sous peine de rester bloqué dans une boucle infinie ! Le code fourni est bien celui qu'il faut prendre.
L'idée générale est la suivante: Comme on ne peut en aucun cas supprimer un objet qui a déclenché la routine évènement en cours, même de façon détournée, je génère un évènement timer différé, donnant ainsi le temps au traitement du clic sur le bouton de se terminer. Et lorsque l'évènement timer survient, le bouton est redevenu inactif, et je peux supprimer la toolbar, en prenant bien soin de désactiver le timer immédiatement, afin de ne pas relancer ce code indéfiniment. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 19 Jan 2014 - 14:33 | |
| @ Klaus, Ton dernier code solutionne le problème chez w7... Il ne reste plus qu' à mettre cela dans la doc pour que le sujet ne reviennent plus sur le tapis... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 14:46 | |
| Exact, Ygeronimi. Je vais m'y appliquer, avec un programme exemple complet, entièrement commenté. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 16:07 | |
| Qu'est-ce que tu penses du code suivant ? J'ai repris la solution que j'ai postée ci-dessus, pour la structurer et commenter. Je prévois d'inclure cela dans la doc: - Code:
-
' démo_toolbar_avec_bouton_de_sortie.bas
' Ce petit programme montre l'utilisation de la toolbar dans un programme Panoramic. ' La toolbar est un objet externe à Panoramic, créé par une fonction de KGF.dll ' et injecté dans une fenêtre du programme Panoramic. ' ' Chaque bouton de la toolbar est visualisé par une icône carrée, dont les ' dimensions en pixels sont précisées lors de la création de la toolbar. ' Toutes les icônes ont les mêmes dimensions. Les icônes peuvent être chargées ' à partir d'un fichier icône (*.ico), à partir de la bibliothèque interne ou ' à partir d'une bibliothèque fournie par l'utilisateur (*.ilb). Elles peuvent ' être également un séparateur (un espace vide non cliquable de la taille d'une icône) ' ou un diviseur (une barre verticale étroite non cliquable) pour les toolbar horizontales ' ' Lors de la création de la toolbar, on indique la fenêtre (form) dans laquelle ' elle devra apparaître, et un objet EDIT invisible qui recevra l'identifiant ' de chaque bouton cliqué, et dont l'évènement ON_CHANGE servira pour signaler ' un clic sur un des boutons de la toolbar. ' ' Chaque bouton est associé à un identifiant. C'est uune valeur entière 1, 2, ... ' qui servira à identifier le bouton cliqué, dans la routine ON_CHANGE du EDIT ' associé à la toolbar. C'est dans cette routine qu'il faut placer les traitements ' spécifiques pour chaque bouton. ' ' Pour pouvoir arrêter le programme Panoramic, il faut supprimer la toolbar avant ' de sortir. Sinon, on obtient en général des crashs (violation de mémoire ou autre). ' Ceci doit être fait dans une routine ON_CLOSE 0. ' ' Un cas particulier est à traiter d'une façon spéciale. Si l'on veut placer un ' bouton dans la toolbar dont l'action sera l'arrêt du programme. En effet, si ' l'on arrête simplement le programme par "termnate", on a alors un conflit: la ' routine ON_CLOSE de la form 0 sera appelée pour supprimer la toolbar, mais la ' routine évènement déclenchant det évènement est toujours en cours. Ceci provoque ' inévitablement un crash. ' ' Alors, la solution consiste à déclencher un autre évènement, avec un délai ' suffisamment long pour laisser la routine évènement du clic se terminer. ' Un timer Panoramic est parfaitement adapté à cela. On le programme pour un ' délai de 500 ms dans la routine ON_CHANGE de l'objet EDIT, puis cette routine ' se termine normalement. Lorsque le timer se déclenche, on stoppe le timer ' tout de suite, on supprime le timer, et maintenant, on peut supprimer la ' toolbar sans risque, puis décharger KGF.dll. ' ' Le programme suivant illustre ces techniques.
' les labels utilisés: label click_toolbar : ' routine évènement pour le clic des boutons label close0 : ' appelé lors de la fermeture de form 0 label sortir : ' appelé par le timer activé par le 3ème bouton
' variables diverses dim res%, icon$, after%, hint$, yy%
' ouverture de KGF.dll dll_on "KGF.dll"
' un objet EDIT caché par lequel la toolbar signale ' l'identification du bouton cliqué. Chaque clic charge ' l'identifiant du bouton dans cet objet EDIT, et son ' évènement ON_CHANGE déclenche alors la routone click_toolbar ' dans laquelle on va traiter le bouton cliqué. edit 1 : hide 1 on_change 1,click_toolbar
' assurer une fermeture propre en supprimant la toolbar on_close 0,close0
' création de la toolbar (horizontale en haut de la fenêtre) ' Les paramètres passés sont: ' handle(0) = fenêtre dans laquelle la toolbar apparaîtra ' handle(1) = objet EDIT recevant l'identification du bouton cliqué ' 0 = paramètre non utilisé pour le moment (extension future) ' 0 = position de la toolbar ' 0=bord haut 1=bord gauche 2=bord bas 3=bord droit res% = dll_call4("CreateToolbar",handle(0),handle(1),0,0)
' changement de la couleur de fond de la toolbar (jaune dans ce cas) res% = dll_call4("ModifyToolbar",1,255,255,0)
' définition de la taille des icônes en pixels (défaut: 16) res% = dll_call4("ModifyToolbar",7,16,0,0)
' changer la taille de la fenêtre et adapter la position de la toolbar width 0, width(0) + 200 height 0,screen_y-40 res% = dll_call4("ModifyToolbar",2,0,0,0)
' créer un premier bouton. Paramètres: ' 1 = identifiant du bouton (chargé dans lobjet EDIT en cliquant) ' 0-1 = valeur -1 pour dire "placer l'icône après la dernière icône présente" ' adr(hint$) = texte de la bulle d'information ' adr(icon$) = nom de l'icône ' Possibilités: ' - nom de fichier *.ico ' - "KGF_n" pour choisir l'icône numéro n de la bibliothèque iinterne ' - "USER_n" pour choisir l'icône numéro n de la bibliothèque utilisateur ' - " " (un espace) pour créer un séparateur (espace vide de la taille d'une icône ' - "" (chaîne vide) pour créer un diviseur (uniquement toolbars horizontales) hint$ = "" icon$ = "KGF_266" res% = dll_call4("AddButtonToToolbar",1,0-1,adr(hint$),adr(icon$))
' créer un deuxième bouton hint$ = "" icon$ = "KGF_66" res% = dll_call4("AddButtonToToolbar",2,0-1,adr(hint$),adr(icon$))
' créer un troisième bouton hint$ = "" icon$ = "KGF_204" res% = dll_call4("AddButtonToToolbar",3,0-1,adr(hint$),adr(icon$))
end
' routine évènement lancée lorqu'un des boutons est cliqué click_toolbar: ' récupérer l'identifiant du bouton cliqué yy%=val(text$(1)) ' effectuer le traitement approprié pour chaque identifiant select yy% case 1 message "Click sur bouton 1" case 2 message "Click sur bouton 2" case 3 ' utiliser le 3ème bouton comme bouton de sortie timer 17 : ' créer un timer timer_interval 17,500 : ' fixer l'interval à 500 ms on_timer 17,sortir : ' indiquer le label pour l'évènement timer end_select return ' ici, le timer activé par le 3ème bouton a été déclenché. On veut sortir. sortir: timer_off 17 : ' désactiver le timer delete 17 : ' et supprimer ce timer ' demander confirmation (on peut supprimer cette ligne pour une sortie directe) if message_confirmation_yes_no("Voulez-vous vraiment sortir ?")<>1 then return ' on a accepté la sortie, donc continuer directement avec ce qui suit. ' ici, la form 0 est en train de fermer. ' On va supprimer la toolbar et décharger KGF.dll. close0: ' supprimer complètement la toolbar ' paramètres: ' 1 = suppression des boutons ET de la toolbar res% = dll_call1("RemoveToolbar",1) ' décharger la DLL, par sécurité. ' De fait, dans ce programme exemple, dll_off n'est pas nécessaire, ' mais c'est une bonne pratique de programmation de décharger ce qu'on a chargé. dll_off message "On sort..." ' la ligne suivante pourrait être "return" si on ne considère que le ' passage par l'évènement ON_CLOSE qui appelle la rourine close0. ' Mais, comme ce code peut aussi être exécuté à partir de l'évènement timer ' en activant la routine "sortir", il faut mettre "terminate" pour forcer ' l'arrêt du programme. Dans le cas d'une sortie par la croix rouge (ce qui ' déclenche l'évènement ON_CLOSE 0, la commande "terminate" agit exactement ' comme la commande "return". terminate | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 19 Jan 2014 - 16:13 | |
| C'est très bien commenté et le programme fonctionne... ...que demander de plus ?... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| | | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 16:25 | |
| C'est désespérant, Ygeronimi ! Est-ce que ça fait la même chose chez vous, Papydall et Pan59 ? | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 19 Jan 2014 - 16:29 | |
| Je vais re-zipper et mettre sur mon webdav. voilà l' erreur : | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 19 Jan 2014 - 16:31 | |
| Petite précision :
L' erreur vient sur la fermeture par le bouton et pas par la croix. J' utilise la fonction 8 de modifytoolbar. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec l'objet Toolbar Dim 19 Jan 2014 - 16:32 | |
| Là, je dois partir, mais je vais regarder ça ce soir. | |
| | | Contenu sponsorisé
| Sujet: Re: Problème avec l'objet Toolbar | |
| |
| | | | Problème avec l'objet Toolbar | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |