API :: MESSAGEBOXINDIRECT

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 27 mai 2004 à 01:12
Inekman Messages postés 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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.

https://codes-sources.commentcamarche.net/source/23179-api-messageboxindirect

Inekman Messages postés 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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és 328 Date d'inscription jeudi 26 août 2004 Statut Membre Derniè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és 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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és 30 Date d'inscription mardi 29 avril 2003 Statut Membre Derniè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és 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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és 30 Date d'inscription mardi 29 avril 2003 Statut Membre Derniè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és 69 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 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és 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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és 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
27 mai 2004 à 23:22
Oui, c'est beaucoup mieux comme ça. Pardon d'avoir cafté ;)
Merci Delphiprog !
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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és 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
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és 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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és 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
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és 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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és 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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és 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 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és 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
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és 30 Date d'inscription mardi 29 avril 2003 Statut Membre Derniè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és 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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és 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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és 30 Date d'inscription mardi 29 avril 2003 Statut Membre Derniè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és 291 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 30 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és 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
27 mai 2004 à 01:12
Je n'ai pas le temps de tester ton code, ça a l'air intéressant.

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.
Rejoignez-nous