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 |
|
|
| Un moyen d'appeler des boites de message personnalisées | |
|
+5Jicehel Jean Claude Minibug Nardo26 Klaus 9 participants | Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Un moyen d'appeler des boites de message personnalisées Ven 26 Juin 2015 - 1:40 | |
| Je me suis amusé à faire ceci: - Code:
-
label clic
dim s$, i%, t$
combo 1 : top 1,10 : left 1,10 : width 1,200 item_add 1,"Bouton OK seul" item_add 1,"Boutons OK et Annuler" item_add 1,"Boutons Recommencer et Annuler" item_add 1,"Boutons Oui et Non" item_add 1,"Boutons Oui, Non et Annuler"
combo 2 : top 2,40 : left 2,10 : width 2,200 item_add 2,"Point d'exclamation" item_add 2,"(i)" item_add 2,"Point d'interrogation" item_add 2,"Signe Stop"
alpha 3 : top 3,70 : left 3,10 : caption 3,"Message:" memo 4 : top 4,70 : left 4,80 : height 4,60 : width 4,200
alpha 5 : top 5,140 : left 5,10 : caption 5,"Titre:" edit 6 : top 6,140 : left 6,80 : width 6,200
button 7 : top 7,170 : left 7,10 : caption 7,"Message" : on_click 7,clic
alpha 8 : top 8,200 : left 8,10 : caption 8,"Résultat:" alpha 9 : top 9,200 : left 9,80
end
clic: s$ = "" if count(4)>0 for i%=1 to count(4) s$ = s$ + item_read$(4,i%) + chr$(13) + chr$(10) next i% end_if if len(s$)>0 then s$ = left$(s$,len(s$)-2) t$ = trim$(text$(6)) MessageBox(s$,t$,item_index(1),item_index(2)) caption 9,str$(MessageBox%)
return
sub MessageBox(txt$,tit$,popt%,pico%) ' Valeurs possibles pour popt%: ' 1 = MB_OK = 0x00000000L - one push button: OK. This is the default. ' 2 = MB_OKCANCEL = 0x00000001L - two push buttons: OK and Cancel. ' 3 = MB_RETRYCANCEL = 0x00000005L - two push buttons: Retry and Cancel. ' 4 = MB_YESNO = 0x00000004L - two push buttons: Yes and No. ' 5 = MB_YESNOCANCEL = 0x00000003L - three push buttons: Yes, No, and Cancel. ' ' Valeurs possibles pour pico%: ' 1 = MB_ICONWARNING = 0x00000030L - An exclamation-point icon appears in the message box. ' 2 = MB_ICONINFORMATION = 0x00000040L - An icon consisting of a lowercase letter i in a circle appears in the message box. ' 3 = MB_ICONQUESTION = 0x00000020L - A question-mark icon appears in the message box. The question-mark message icon is no longer recommended because it does not clearly represent a specific type of message and because the phrasing of a message as a question could apply to any message type. In addition, users can confuse the message symbol question mark with Help information. Therefore, do not use this question mark message symbol in your message boxes. The system continues to support its inclusion only for backward compatibility. ' 4 = MB_ICONSTOP = 0x00000010L - A stop-sign icon appears in the message box.
dim_local res%, ad1%, hdc%, ad2%, ad3%, opt%, ico% if variable("MessageBox%")=0 then dim MessageBox% dll_on "User32.dll"
ad1% = adr(txt$) poke adr(ad2%),peek(ad1%) poke adr(ad2%+1),peek(ad1%+1) poke adr(ad2%+2),peek(ad1%+2) poke adr(ad2%+3),peek(ad1%+3) ad1% = adr(tit$) poke adr(ad3%),peek(ad1%) poke adr(ad3%+1),peek(ad1%+1) poke adr(ad3%+2),peek(ad1%+2) poke adr(ad3%+3),peek(ad1%+3) if popt%=1 then opt% = 0 if popt%=2 then opt% = 1 if popt%=3 then opt% = 5 if popt%=4 then opt% = 4 if popt%=5 then opt% = 3
if pico%=1 then ico% = 48 if pico%=2 then ico% = 64 if pico%=3 then ico% = 32 if pico%=4 then ico% = 16
MessageBox% = dll_call4("MessageBoxA",0,ad2%,ad3%,opt%+ico%)
dll_off end_sub end
| |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Ven 26 Juin 2015 - 2:20 | |
| Klaus ! Je m’étais amusé avec aussi à l'époque où les SUB n'existaient pas...(j'aime pas les GOSUB avec variables globales ) C'est clair que maintenant c'est beaucoup plus exploitable et plus intéressant à utiliser ! | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Ven 26 Juin 2015 - 6:06 | |
| C'est utile, effectivement !
A conserver. Ça peut toujours servir... | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Ven 26 Juin 2015 - 7:18 | |
| Heu... ça sert à quoi ?
A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Ven 26 Juin 2015 - 10:57 | |
| En fait, j'ai fait un essai d'appels de fonctions API de Windows, sans passer par KGF.dll. En effet, pour moi, ce serait simple d'ajouter une fonction à KGF.dll pour faire ce que fait cette procédure. Et hop ! Ni vu ni compris !
Car en fait, l'objectif est là. Montrer comment appeler une API de Windows, directement par Panoramic. Il y a des milliers de fonctions disponibles dans Windows, souvent très intéressantes, mais inaccessibles en Panoramic. Or, Panoramic offe la possibilité d'accéder aux DLLs. C'est très restrictif, c'est souvent une vraie gymnastique à programmer, mais ça marche.
Un des problèmes principaux, c'est le passage de chaînes de caractères à une API. Windows s'attend à recevoir l'adresse d'une chaîne de caractères, en général une chaîne terminée par un octet 0. Par chance, ceci est la cas en Panoramic: toutes les chaînes sont terminées par un octet 0. Mais le problème est la fonction ADR(s$). Elle ne retourne pas l'adresse du texte de la chaîne de caractères, mais l'adresse d'un mout contenant l'adresse du texte de la chaîne ! On a l'adresse d'un pointeur, en somme. Alors que adr(n%) retourne vraiment l'adresse des données de la variable n%, et pareil pour les variables flottantes.
Alors, comment résoudre ce problème ? C'est ce que montre ma procédure. On utililise la fonction PEEK et la commande POKE pour récupérer le contenu du mot pointé par ADR(s$) pour obtenir la vraie adresse du texte de la variable s$. Et ensuite, on peut passer cette adresse à la fonction DLL de Windows.
Et je dois dire que, malgré une palette correcte de fonctions de messages de Panoramic, cela reste assez restrictif. Certes, le but de Panoramic est atteint: rester simple et facile à utiliser. Soit. Mais j'aurais aimé pouvoir paramétrer le titre de ma boite de messages, et la présence de tel ou tel bouton. En plus, pouvoir afficher une des icônes standard de Windows dans la boite de messages, tel qu'on est habitué à le voir avec mes messages provenant directement de Windows ou de certains utilitaires, ce serait sympa.
Or, l'API MessageBox de Windows est capable de faire cela. J'ai donc choisi cette API pour montrer: - comment appeler une API - comment passer une chaîne de caractères - faire des messages avec titre, boutons et icônes paramétrables
Evidemment, en soi, cela n'a que peu d'intérêt, sauf pour des cas très particuliers. Mais cela montre la technique de base pour appeler une API Windows quelconque, et c'est l'intérêt principal de ce petit code. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Ven 26 Juin 2015 - 11:13 | |
| Woui et à mon avis entre Papydall qui aime bien triturer les api Windows et Klaus, on va encore avoir des procédures sympas. Moi de mon côté, j'ai un peu lâché et je devrais faire du tri pour pouvoir me remettre à jour ma bibliothèque de procédures et l'intégrer à mon futur éditeur de code Panoramic, mais c'est vrai qu'avec une bonne gestion de la bibliothèque, on devrait pouvoir retrouver ces petits bijoux facilement pour quand on en a besoin.
Dernière édition par Jicehel le Ven 26 Juin 2015 - 11:35, édité 1 fois | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Ven 26 Juin 2015 - 11:24 | |
| Merci pour les explications, Klaus. C'est plus clair pour moi, même si ça reste complexe, l'utilisation est simple. Je me demande combien d'API il peut y avoir dans Windows.
A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Ven 26 Juin 2015 - 11:44 | |
| Très difficile à dire comme ça, de but en blanc. Il y a des centaines de DLLs Windows, et chacune a des dizaines, des centaines et quelques fois des milliers de fonctions. En tout cas, c'est énorme.
Il faut bien voir que Windows se compose essentiellement de 4 groupes d'éléments: un noyau bootable, relativement petit, des centaines de DLLs contenant toutes les APIs, donc les fonctionnalités "accessibles" du système, des drivers et des programmes utilitaires. Tout sauf le noyau est chargé dynamiquement, selon les besoins. Et Windows lui-même utilise ces DLLs pour se gérer lui-même. Plus de 90 % de Windows est réalisé sous forme de DLLs. | |
| | | pascal10000
Nombre de messages : 812 Localisation : Troyes Date d'inscription : 05/02/2011
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Sam 27 Juin 2015 - 8:43 | |
| bonjour @Klaus
C'est très intéressant ton code et je suis sur que je ne suis le seul a être intéressé a avoir accès aux apis de Windows! et si tu pouvais nous proposé d'autre code de temps en temps si ça ne te dérange pas ça serai sympa de ta part parce que j'ai déjà essaye de trifouiller des codes et cela n'ont pas marché comme par exemple d'y mettre une icône aux item des sub_menu et ce n'est pas évident et même en essayant d'utilisé rundll32.exe enfin sur ce a+ et bonne programmation | |
| | | Pedro
Nombre de messages : 1595 Date d'inscription : 19/01/2014
| Sujet: Boîte de message personnalisée. Sam 27 Juin 2015 - 10:01 | |
| Bonjour. Pour ma part, il y a bien longtemps que je n'utilise plus la commande 'message'. Voici la routine que je me suis concoctée: - Code:
-
sub message(param1%,param2%,txt$) ' afficher_car_speciaux_espagnols%=1 affiche des boutons permettant de saisir les car accentués. ' oui: res%=1 ' non: res%=0 inactive 0 att%=0 parametre_message%=param1% temporaire$=txt$
if label("pos_clic")=0 then label pos_clic if label("pos_clac")=0 then label pos_clac
for k%=1451 to 1455 effacer_objet(k%,0) next k%
if form_180_creee%=false% form 180 left 180,-200 memo 821 else show 180 clear 821 end_if
haut(180,-500,0) on_close 180,pos_clac
if param1%=0 then caption 180,"Message d'information." if param1%=1 then caption 180,"Merci de confirmer ou non." if param1%=2 then caption 180,"Saisissez le texte." if param1%=3 or param1%=5 then caption 180,"Sélectionner l'élément dans la liste." if param1%=4 then caption 180,"Historique des versions." if param1%=6 then caption 180,"Choisissez votre profil." color 180,255,255,128 font_name 180,"Calibri" font_size 180,12 font_bold 180 width 180,text_width(txt$,180)+40
nl%=1 for i%=1 to len(txt$) if mid$(txt$,i%,1)=chr$(13) then nl%=nl%+1 next i% if param1%<>4 then height 180,nl%*text_height(txt$,180)+125 if param1%=2 then hauteur(180,height(180)+50,0) if param1%=4 then hauteur(180,500,0)
parent 821,180 full_space 821 if param2%=0 then color 821,255,255,164 if param2%=1 then color 821,128,255,128 if param2%=3 then color 821,0,64,128 font_color 821,0,0,0 if param1%=5 or param1%=6 then font_color 821,0,0,0 if param2%=2 color 821,128,0,0 font_color 821,255,204,51 font_size 821,18 end_if
if nl%=1 item_add 821,txt$ else while true%=1 zz%=instr(txt$,chr$(13)) if zz%=0 if len(txt$)>0 then item_add 821,txt$ exit_while end_if
item_add 821,left$(txt$,zz%-1) txt$=right_pos$(txt$,zz%+1) end_while end_if
a$="" for i%=1 to count(821) if len(item_read$(821,i%))>len(a$) then a$=item_read$(821,i%) next i% width 180,text_width(a$,180)+50 if width(180)<400 then largeur(180,400,0) if height(180)<200 then hauteur(180,200,0) if param1%=6 then height 180,350 gauche(180,largeur_ecran%/2-width(180)/2,0) haut(180,hauteur_ecran%/2-height(180)/2,0)
if francusem%=true% font_name 821,"Cieszyn" font_size 821,12 corriger_caracteres_speciaux_polonais(text$(821)) clear 821 item_add 821,ccs$ end_if
show 821 effacer_objet(360,0) ' Utilisation d'un objet Hviewer. if param1%=0 hide 821 hviewer 360 parent 360,180 full_space 360 file_open_write 999,"memo.htm" file_writeln 999,"<body background='images\brique.jpg'>" file_writeln 999,"<h4>" for k%=1 to count(821) file_writeln 999,item_read$(821,k%) file_writeln 999,"<br>" next k% file_close 999 file_load 360,"memo.htm" end_if
if param1%=0 or param1%=4 or param1%=5 or param1%=6 then creer("button",664,180,width(180)/2-50,height(180)-80,100,30,"Calibri","OK",1,0,12,128,0,0) if param1%=1 or param1%=3 creer("button",664,180,width(180)/2-150,height(180)-80,100,30,"Calibri","Oui",1,0,12,128,0,0) creer("button",665,180,width(180)/2+50,height(180)-80,100,30,"Calibri","Non",1,0,12,128,0,0) on_click 665,pos_clac end_if if param1%=3 or param1%=5 creer("combo",267,180,10,20,250,30,"Calibri","",1,0,12,255,255,128) if param1%=5 largeur(267,width(180)-30,0) haut(267,top(664)-40,0) end_if if param1%=3 then on_click 267,lire_regle end_if
if param1%=6 for k%=1451 to 1455 creer("option",k%,180,20,(k%-1450)*40,width(180)-50,30,"Calibri","",1,0,14,0,0,0) caption k%,sens$(k%-1450) font_color k%,0,0,0 on_click k%,choix_du_profil next k% end_if
if param1%=2 creer("memo",860,180,20,height(180)-150,200,30,"Calibri","",1,0,12,0,0,255) creer("button",664,180,width(180)/2-150,height(180)-80,100,30,"Calibri","OK",1,0,12,128,0,0) creer("button",665,180,width(180)/2+50,height(180)-80,100,30,"Calibri","Annuler",1,0,12,128,0,0) on_click 665,pos_clac focus(860) end_if
on_click 664,pos_clic if param1%<>0 and param1%<>2 then focus(821) form_180_creee%=true%
for k%=611 to 615 effacer_objet(k%,0) next k%
if afficher_car_speciaux_espagnols%=1 for k%=611 to 615 creer("button",k%,180,(k%-610)*30-10,height(180)-120,30,30,"Calibri","",1,0,12,0,0,0) caption k%,caracteres_speciaux_espagnol$(k%-610) on_click k%,inserer_dans_message next k% end_if
' Cacher les boutons de réduction, agrandissement et fermeture. hnd%=handle(180) res%=dll_call2("SetMinimizeMaximize",hnd%,0) res%=dll_call2("SetCloseBox",hnd%,0)
bar_none 821 if param1%=4 file_load 821,"historique_versions.dat" bar_vertical 821 end_if if param1%=3 clear 267 file_open_read 99,fichier$ while file_eof(99)<>1 file_readln 99,ligne$ ligne$=trim$(ligne$) if len(ligne$)>0 then item_add 267,left$(ligne$,instr(ligne$,";")-1) end_while text 267,item_read$(267,1) file_close 99 end_if
if param1%=5 clear 267 for index%=1 to nombre_sens% ' Ce qui permet d'ajouter un tableau quelconque à la combo. if instr(sens$(1),";")=0 item_add 267,sens$(index%) else ' jouer;v;jugar;v;s'amuser temporaire$=sens$(index%) for y%=1 to 4 i%=instr(temporaire$,";") if y%=1 then chaine$=left$(temporaire$,i%-1) if y%=3 then chaine$=chaine$+" = "+left$(temporaire$,i%-1) temporaire$=right_pos$(temporaire$,i%+1) next y% if len(temporaire$)>0 then chaine$=chaine$+" [sens: "+temporaire$+"]" item_add 267,chaine$ end_if next index% text 267,item_read$(267,1) end_if
res%=0 while att%=0 pause 200 end_while exit_sub
choix_du_profil: profil$=caption$(number_click) return
inserer_dans_message: text 860,text$(860)+caption$(number_click) return
pos_clic: res%=1 resultat$="" if object_exists(860)=1 if param1%=2 then resultat$=text$(860) end_if
if parametre_message%=5 if object_exists(267)=1 index%=item_index(267) if index%=0 then index%=1 resultat$=item_read$(267,index%) else resultat$="" end_if end_if
pos_clac: att%=1 effacer_objet(267,0) effacer_objet(860,0) effacer_objet(664,0) effacer_objet(665,0) active 0 hide 180 return
end_sub Dans le cas le plus simple, elle est appelée comme suit: message(0,1,"texte") | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 27 Juin 2015 - 13:02 | |
| Comme Pascal, si tu as un moyen d' ajouter une icône dans un sub menu, je suis preneur. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Sam 27 Juin 2015 - 13:03 | |
| Bonjour à tous, - Klaus a écrit:
- Car en fait, l'objectif est là. Montrer comment appeler une API de Windows, directement par Panoramic.
Cool, c'est aussi ce que je faisais dans le sujet sur les mémoires tampons. - Citation :
- Panoramic offre la possibilité d'accéder aux DLL. C'est très restrictif...
Entièrement d'accord, ce ne serais pas du luxe si jack pouvait lever ces restrictions. Même si panoramic est conçu pour être facile à utiliser pour le débutant, au bout d'un certain temps, un débutant n'est plus un débutant. @pascal10000 - pascal10000 a écrit:
- ...et si tu pouvais nous proposé d'autre code de temps en temps...
clique sur mon profil, regarde les sujets qui concernent la mémoire tampon et tick count, tu y trouveras des exemples. J'ai produis une LIB qui facilite les appels aux DLL, amuse toi bien! EDIT: @ygeronimi Ça confirme ce que je disais, quand on est plus un débutant, on devient frustré par les limitations de panoramic. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Sam 27 Juin 2015 - 15:35 | |
| - silverman a écrit:
- ...quand on est plus un débutant, on devient frustré par les limitations de panoramic.
Mais on arrive toujours à trouver d'autres échappatoires, par le jeu comme jean-claude... Ou Papydall qui s'amuse à faire du LOGO avec Pano. (il fut un temps j'avais fait une adaptation du langage brainfuck ) Je m'amuse aussi à faire des trucs en récursifs (ça sert pas à grand chose mais c'est juste pour le challenge) Klaus se défoule comme un fou avec ses DLLs, Jicehel s'eclate avec les couleurs, etc... Je pense qu'à la base Jack ne s'attendait pas à ce qu'on utilise son Langage pour des applications "poussées". Perso je considère Panoramic comme étant un langage qui doit être abordé par son côté ludique. Et puis si tout était parfait, on n'aurait plus le plaisir d'embêter Jack !!! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Sam 27 Juin 2015 - 16:02 | |
| Perso, je ne suis pas encore frustré, mais ça tient au fait que je suis encore un débutant. C'est pour cela que Panoramic et Pangine2g me permettent de m'éclater. Je reste un bidouilleur (expérimenté dans le contournement) Maintenant, si Panoramic devient un super langage pour les pros, ça ne me gêne pas du tout car je n'utiliserais que les mots-clés dont je sais me servir correctement. A+ | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 27 Juin 2015 - 16:21 | |
| Je ne suis pas frustré...enfin...je ne crois pas... Un débutant, oui toujours, je suis à des années lumière des connaissances de klaus et de tous ceux qui sont à son niveau. Et, justement, si Panoramic se veut ludique, il faut qu' il permette de faire des choses compliqués de manière simple. Peek et Poke, c' est déjà de la haute voltige pour moi. Donc, si une petite commande ( style : Ico N,adresse$ ) me permet de rajouter une petite icône dans un sub_menu au lieu d' aller titiller les API... | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Sam 27 Juin 2015 - 16:59 | |
| Puisque l'on en est aux demandes : Avoir la possibilité d’écrire des fonctions qui retournent une valeur, cela serait vraiment un + et un grand pas en avant pour le langage... Mais bon, les journées ne sont malheureusement pas extensible.. | |
| | | Invité Invité
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées Sam 27 Juin 2015 - 22:07 | |
| Pour ce qui est des fonctions, il me semble que Jack avait reconnu qu'il avait du mal à le faire sur le noyau Panoramic, qui n'était pas prévu pour cela. Pour ma part, j'essaye de revoir une autre conception qui semble marché, mais la mise au point est délicate, avec le clavier. Inkey$ et scancode sont très limités, et de plus certains disent que Scancode marche mal chez eux. Le but est de pouvoir refaire une bibliothèque d'objets en couleurs, chose que je ne peux obtenir ici. Il est quant même ahurissant qu’avec Microsoft, cela soit dur à avoir, alors par exemple ORIC 1 avec son processeur 8 bits permettait d'écrire de différentes couleurs, même en flash!. Plus il y a de la vitesse, et de la mémoire, et moins on en a J'ai déjà mis un exemple avec un gif. Je ne vais pas en dire plus, cela n'intéresse que moi. |
| | | Contenu sponsorisé
| Sujet: Re: Un moyen d'appeler des boites de message personnalisées | |
| |
| | | | Un moyen d'appeler des boites de message personnalisées | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |