japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 2021
-
27 mai 2004 à 01:12
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006
-
8 août 2005 à 03:54
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 8 août 2005 à 03:54
juste un vieux thème que j'avais à l'époque où j'ai capté l'API ;-)
cs_bloom1
Messages postés328Date d'inscriptionjeudi 26 août 2004StatutMembreDernière intervention 8 mars 2007 8 août 2005 à 02:47
Tu es sous Mac ou bien tu as juste un Thème ???
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 31 mai 2004 à 11:40
J'ai essayé aussi et ça ne fonctionne pas non plus.
...Et si ma solution était LA solution pour utiliser cette fonction ? :-P
cs_Partagas
Messages postés30Date d'inscriptionmardi 29 avril 2003StatutMembreDernière intervention 1 juin 2004 30 mai 2004 à 17:48
j'ai essaye les deux, aucun ne marche. J'ai aussi essaye de recuperer la valeur de MakeIntResource(numero), c'est un PAnsiChar, et je n'y arrive pas et ca m'ennerve, alors j'ai abandonne.
Enfin pour conclure, si on en revient a la source originale, on n'a rien change, et ca, c'est rare ici...
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 30 mai 2004 à 13:16
Je pense qu'il faut une chaîne désignant le chemin de l'icône sur le disque dur. "C:\Mon Dosssier\MonIcone.ico". La valeur à utiliser c'est celle qui est générée par la fonction MakeIntRessource(), c'est à dire l'entier qui désigne la ressource.
Mais je viens de penser à un truc, il faudrait essayer de nommer l'icone dans le fichier ressource et d'utiliser justement son nom dans la propriété lpszIcon au lieu d'une adresse sur le disque dur....à tester.
cs_Partagas
Messages postés30Date d'inscriptionmardi 29 avril 2003StatutMembreDernière intervention 1 juin 2004 30 mai 2004 à 12:04
kuste une question bete:
le parametre LPCSTR lpszIcon; demande une chaine, ou une resource avec MakeIntResource();
mais quel type de chaine, et surtout quelle genre de valeur peut etre utilise ici??
SiZiOUS
Messages postés69Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 novembre 2006 28 mai 2004 à 16:36
Magnfique !
Ca m'evitera de partir de zéro et de faire une MsgBox avec une TForm.
Vraiment, merci !
Un petit 10/10 pour completer le message :)
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 28 mai 2004 à 12:20
Donc on compare avec les constantes mr*** et tout le monde est heureux :-)
Merci pour l'appréciation du code DelphiProg et vous autres qui avez posté un commentaire.
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 27 mai 2004 à 23:22
Oui, c'est beaucoup mieux comme ça. Pardon d'avoir cafté ;)
Merci Delphiprog !
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 27 mai 2004 à 23:04
Alors, comme ça, je suis reponsable de ce qui arrive. Admettons...;o)
Je suis perplexe car la doc Microsoft et celle de Borland indiquent que la fonction retourne un integer !...
Or, quelque soit le bouton cliqué, la fonction retourne toujours vrai puisque la déclaration dans l'unité Windows.pas est celle-ci :
function MessageBoxIndirect(const MsgBoxParams: TMsgBoxParams): BOOL; stdcall;
Mais, en C, comme tout ce qui est différent de 0 est considéré comme vrai, en transtypant en un cardinal on obtient à nouveau une valeur exploitable.
Si ça n'allège pas vraiment le code, je suis d'accord avec Japee pour affirmer qu'une comparaison avec une des constantes comme mrYes rend le code nettement plus lisible.
C'est mieux comme ça ?
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 27 mai 2004 à 21:51
Oui, c'est ça, la constante MsgBoxParam renvoie la valeur cardinale du bouton pressé, c'est bien ce que je voulais exprimer ;)
Je veux pas cafter, mais je ne crois pas que ton post soit responsable de l'affichage déplorable de cette page (il faudrait au minimum un écran 16/9 pour l'afficher correctement, lol). Mais ça remonte au message de Delphiprog (pardon, j'ai cafté...)
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 27 mai 2004 à 19:48
Hum, je n'ai pas trop compris ta grosse bétise :-) et j'avous ne pas voir à pourrait correspondre la constante dont tu parles...la valeur cardinale du bouton pressé ?
--> Pourquoi mon post fait partir en sucette la présentation de cette page ?
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 27 mai 2004 à 19:40
Décidément, ce code inspire les commentaires.
En effet, Delphiprog, après vérification,
"function MessageBoxIndirect(const MsgBoxParams: TMsgBoxParams): BOOL; stdcall;"
retourne bien un Boolean, d'ailleurs
"MessageBoxIndirect(aBox)"
retourne bien True, quel que soit le bouton cliqué.
Mais je crois comprendre qu'elle renvoie également la valeur de la constante MsgBoxParams de type TMsgBoxParams (variable aBox dans le code d'Inekman), et que dans le cas de
"Cardinal(MessageBoxIndirect(aBox))"
on récupère la valeur de la constante MsgBoxParams.
En espérant n'avoir pas dit une grosse bêtise...
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 27 mai 2004 à 19:26
....j'ai également mis à jour le code en haut, concernant les boutons, leurs équivalents cardinaux et leurs drapeaux.
Merci pour vos commentaires.
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 27 mai 2004 à 19:13
J'ai essayé ce que t'as dis Partagas avant de poster mon code et ça ne marche pas non plus, c'est la raison pour laquelle j'ai utilisé les valeurs cardinales. ;-)
Oui oui Japee, on peut par exemple personnaliser le bouton qui aura le focus par défaut en mettant MB_DEFBUTTON1 ou MB_DEFBUTTON2 ou MB_DEFBUTTON3 ou MB_DEFBUTTON4, le numéro indiquant le bouton qui aura le focus.
MB_HELP : pour afficher un bouton d'aide, auquel cas il faudra préciser dans la propriété "dwContextHelpId" l'identifiant de l'aide qui sera appelé.
MB_RIGHT : pour mettre le texte à droite :-p
MB_RTLREADING : pour ceux qui lisent de droite vers la gauche.
J'ai mis à jour la capture pour illustrer ces deux derniers drapeaux.
pyroflo
Messages postés323Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention17 mai 2005 27 mai 2004 à 18:55
Sympa comme astuce, la source est bien commentée (la raison de mon post).
Bien joué ;-)
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 27 mai 2004 à 13:43
Mais ça marche ainsi:
if Cardinal(MessageBoxIndirect(aBox)) = mrYes then...
et bien sûr aussi avec case...of.
On peut donc faire selon son goût (si l'on est "chiffre" ou "lettres"). Pour ma part, je trouve plus facile à mémoriser mrYes ou mrCancel que 6 ou 2.
Sinon le code tient ses promesses. C'est plutôt sympa de pouvoir faire apparaître ses propres icones :)
Et on doit bien arriver à faire d'autre trouvailles...
cs_Partagas
Messages postés30Date d'inscriptionmardi 29 avril 2003StatutMembreDernière intervention 1 juin 2004 27 mai 2004 à 12:34
ah, autant pour moi, comme j'ai pas delphi sous la main, j'ai pas pu tester, et je me melange souvent entre les MBtruc, MRmacin, et IDchose. a la rigueur, essaie un
if MessageBoxIndirect(aBox) = IDYes
si tu as le temps, on ne sait jamais. un coup d'oeil dans le MSDN me fait penser que ca peut marcher, mais je ne suis pas sur de moi...
et personnellement, je trouve que ca allege (si ca marche...), simplement parceque je n'aime pas le transtypage en fait. Mais bon, c'est vrai que ca reste une ligne de code, quoi qu'il arrive...
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 27 mai 2004 à 12:13
J'ai testé ta proposition Partagas et ça ne fonctionne pas :-P
Donc on reste sur :
if Cardinal(MessageBoxIndirect(aBox)) = mrYes
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 27 mai 2004 à 12:10
Oui, ça veut aussi dire ça :p mais ça ne l'allège pas pour autant... ;-)
cs_Partagas
Messages postés30Date d'inscriptionmardi 29 avril 2003StatutMembreDernière intervention 1 juin 2004 27 mai 2004 à 10:20
ca veut surtout dire que la ligne
if Cardinal(MessageBoxIndirect(aBox)) = 6
peut etre remplacee par
if MessageBoxIndirect(aBox) = mrYes
ce qui allege et facilite le code.
Inekman
Messages postés291Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention30 juin 2006 27 mai 2004 à 01:22
Ah et bien voilà une information intéressante, on sait à présent comment détecter les autres boutons grâce à toi.
Merci beaucoup.
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 27 mai 2004 à 01:12
Je n'ai pas le temps de tester ton code, ça a l'air intéressant.
8 août 2005 à 03:54
8 août 2005 à 02:47
31 mai 2004 à 11:40
...Et si ma solution était LA solution pour utiliser cette fonction ? :-P
30 mai 2004 à 17:48
Enfin pour conclure, si on en revient a la source originale, on n'a rien change, et ca, c'est rare ici...
30 mai 2004 à 13:16
Mais je viens de penser à un truc, il faudrait essayer de nommer l'icone dans le fichier ressource et d'utiliser justement son nom dans la propriété lpszIcon au lieu d'une adresse sur le disque dur....à tester.
30 mai 2004 à 12:04
le parametre LPCSTR lpszIcon; demande une chaine, ou une resource avec MakeIntResource();
mais quel type de chaine, et surtout quelle genre de valeur peut etre utilise ici??
28 mai 2004 à 16:36
Ca m'evitera de partir de zéro et de faire une MsgBox avec une TForm.
Vraiment, merci !
Un petit 10/10 pour completer le message :)
28 mai 2004 à 12:20
Merci pour l'appréciation du code DelphiProg et vous autres qui avez posté un commentaire.
27 mai 2004 à 23:22
Merci Delphiprog !
27 mai 2004 à 23:04
Je suis perplexe car la doc Microsoft et celle de Borland indiquent que la fonction retourne un integer !...
Or, quelque soit le bouton cliqué, la fonction retourne toujours vrai puisque la déclaration dans l'unité Windows.pas est celle-ci :
function MessageBoxIndirect(const MsgBoxParams: TMsgBoxParams): BOOL; stdcall;
Mais, en C, comme tout ce qui est différent de 0 est considéré comme vrai, en transtypant en un cardinal on obtient à nouveau une valeur exploitable.
Si ça n'allège pas vraiment le code, je suis d'accord avec Japee pour affirmer qu'une comparaison avec une des constantes comme mrYes rend le code nettement plus lisible.
C'est mieux comme ça ?
27 mai 2004 à 21:51
Je veux pas cafter, mais je ne crois pas que ton post soit responsable de l'affichage déplorable de cette page (il faudrait au minimum un écran 16/9 pour l'afficher correctement, lol). Mais ça remonte au message de Delphiprog (pardon, j'ai cafté...)
27 mai 2004 à 19:48
--> Pourquoi mon post fait partir en sucette la présentation de cette page ?
27 mai 2004 à 19:40
En effet, Delphiprog, après vérification,
"function MessageBoxIndirect(const MsgBoxParams: TMsgBoxParams): BOOL; stdcall;"
retourne bien un Boolean, d'ailleurs
"MessageBoxIndirect(aBox)"
retourne bien True, quel que soit le bouton cliqué.
Mais je crois comprendre qu'elle renvoie également la valeur de la constante MsgBoxParams de type TMsgBoxParams (variable aBox dans le code d'Inekman), et que dans le cas de
"Cardinal(MessageBoxIndirect(aBox))"
on récupère la valeur de la constante MsgBoxParams.
En espérant n'avoir pas dit une grosse bêtise...
27 mai 2004 à 19:26
Merci pour vos commentaires.
27 mai 2004 à 19:13
Oui oui Japee, on peut par exemple personnaliser le bouton qui aura le focus par défaut en mettant MB_DEFBUTTON1 ou MB_DEFBUTTON2 ou MB_DEFBUTTON3 ou MB_DEFBUTTON4, le numéro indiquant le bouton qui aura le focus.
MB_HELP : pour afficher un bouton d'aide, auquel cas il faudra préciser dans la propriété "dwContextHelpId" l'identifiant de l'aide qui sera appelé.
MB_RIGHT : pour mettre le texte à droite :-p
MB_RTLREADING : pour ceux qui lisent de droite vers la gauche.
J'ai mis à jour la capture pour illustrer ces deux derniers drapeaux.
27 mai 2004 à 18:55
Bien joué ;-)
27 mai 2004 à 13:43
if Cardinal(MessageBoxIndirect(aBox)) = mrYes then...
et bien sûr aussi avec case...of.
On peut donc faire selon son goût (si l'on est "chiffre" ou "lettres"). Pour ma part, je trouve plus facile à mémoriser mrYes ou mrCancel que 6 ou 2.
Sinon le code tient ses promesses. C'est plutôt sympa de pouvoir faire apparaître ses propres icones :)
Et on doit bien arriver à faire d'autre trouvailles...
27 mai 2004 à 12:34
if MessageBoxIndirect(aBox) = IDYes
si tu as le temps, on ne sait jamais. un coup d'oeil dans le MSDN me fait penser que ca peut marcher, mais je ne suis pas sur de moi...
et personnellement, je trouve que ca allege (si ca marche...), simplement parceque je n'aime pas le transtypage en fait. Mais bon, c'est vrai que ca reste une ligne de code, quoi qu'il arrive...
27 mai 2004 à 12:13
Donc on reste sur :
if Cardinal(MessageBoxIndirect(aBox)) = mrYes
27 mai 2004 à 12:10
27 mai 2004 à 10:20
if Cardinal(MessageBoxIndirect(aBox)) = 6
peut etre remplacee par
if MessageBoxIndirect(aBox) = mrYes
ce qui allege et facilite le code.
27 mai 2004 à 01:22
Merci beaucoup.
27 mai 2004 à 01:12
Juste un petit mot pour information.
Les valeurs retournées par MessageDlg, soit:
mrYes, mrNo, mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll, mrYesToAll
correspondent respectivement aux valeurs cardinales:
6, 7, 1, 2, 3, 4, 5, 8, 9, 10.