sur Win 7, MessageDLG affiche l'icône d'informations au lieu de l'icône de confirmation (point d'interrogation). Voici le code:
MessageDlg('Are you sure you want to delete this file?'+ CRLF+ FileName, mtConfirmation, [mbYes, mbNo], 0)= mrYes
3 Réponses :
Premièrement, remarquez qu'une solution de contournement simple consiste à utiliser la fonction Windows API MessageBox code> à la place:
if (Win32MajorVersion >= 6) and ThemeServices.ThemesEnabled then
with TTaskDialog.Create(Self) do
try
Caption := 'Test';
Title := 'Test';
Text := 'This is a test.';
CommonButtons := [tcbYes, tcbNo];
CustomMainIcon.ReleaseHandle;
CustomMainIcon.Handle := LoadIcon(0, IDI_QUESTION);
Flags := [tfUseHiconMain];
Execute;
finally
Free;
end
else
MessageBox(Handle,
'This is a test.',
'Test',
MB_ICONQUESTION or MB_YESNO);
Le theMeservices.themesEnabled code> Le test m'a fait rire. Vous réalisez que j'espère que vous devez le faire en raison d'un bug idiot dans le Delphi Ttaskdialog. La boîte de dialogue de tâches est disponible pour Win32majorversion> = 6 et cela fonctionne parfaitement sur Windows Classic. Je ne sais pas pourquoi Embarcadero l'a fait la façon dont ils l'ont fait. Comme vous pouvez l'imaginer, j'utilise ma propre enveloppe de l'API de la boîte de dialogue de la tâche en raison de telles faiblesses.
@David: Oui, je n'ai jamais compris pourquoi les thèmes doivent être activés (mais je n'ai pas passé de temps à rechercher la question, non plus). Mais bien sûr, ttaskdialog code> a quelques problèmes. Plus important encore, il manque pratiquement de documentation. Mais il a aussi quelques bugs, par exemple Celui-ci .
Salut andreas. En fait, j'ai immédiatement changé de messagerie lorsque j'ai vu que MessageDLG ne fonctionne pas. Je voulais juste ce que je faisais mal. Merci pour votre explication la plus complète. Accepté.
Utilisez des drapeaux: = Drapeaux + [TfusehiconMain]; Sinon, vous perdez le bouton de fermeture de la boîte de dialogue sur Windows 10 :). +1 pour la réponse
Lorsque vous devez afficher des chaînes plus longues, MessageBox est bien meilleur que Ttaskdialog car Ttaskdialog enveloppera vos cordes trop tôt (sa largeur a tendance à être beaucoup plus petite que la largeur de MessageBox).
Il n'est pas stupide d'utiliser une boîte de dialogue personnalisée, je souhaite localiser mon programme, mais utiliser le Winapi, je ne peux pas modifier les textes de boutons. Changer la langue Windows ne fonctionne pas non plus, le pack de langue n'est peut-être pas installé. Donc, ma propre boîte de message est la seule option.
Si vous avez besoin de dialogues, vous pouvez regarder notre Unité de syntaskdialog Open Source pour Windows XP, Vista, sept. P>
Il appellera la boîte de dialogue des tâches natives sous Vista et sept et l'imitera sous XP. Vous aurez une meilleure interaction qu'avec l'unité de dialogue standard ou l'API Windows, et vous aurez l'icône de confirmation, tout comme prévu. P>
Voici le résultat sous un ordinateur Windows Seven 64 bits: P>
P>
Et voici la même boîte de dialogue créée à partir de notre code PURE Delphi émulé: P>
p>
Voici une boîte de dialogue de la tâche de sélection, avec des boutons "Liens de commande", dans les sept matchs natifs: p>
P>
Et voici la fenêtre comme créée avec le code d'émulation VCL: P>
p>
Notez qu'il y a l'icône de confirmation. ;) p>
Travailler de Delphi 6 jusqu'à XE. P>
Néanmoins, l'interface du programmeur semble plus facile à utiliser que l'interface du VCL ttaskdialog code>.
@Andreas Oui, l'icône de petite page de page est rendue à l'aide de GDI: c'est l'icône de dialogue standard extraite du système d'exploitation, étiré dans sa moitié de taille. Je devrais utiliser GDI + pour le rendre avec un meilleur anti-aliasing. Mais je ne voulais pas ajouter de dépendance supplémentaire à l'unité, pour la partie XP. Si vous savez comment récupérer une icône de demi-taille meilleure à travers API, je suis votre homme! Et oui, j'ai essayé de rendre l'interface plus facile que Ttaskdialog: ce n'est pas un clone libre, c'est une nouvelle implémentation (je n'ai pas regardé le code VCL, voulait juste que le travail soit fait).
Bon à savoir. Merci pour ce lien!
PS: Je pense que l'icône ne cherche pas parfaitement, mais acceptable. L'utilisateur comprendra sa signification. Ce n'est pas comme dans le cas de MessageDLG où l'icône était totalement fausse.
Vous pouvez résoudre le problème d'aliasing de l'icône en utilisant CreateIConfromsMallaLericon code> d'ici: Stackoverflow.com/questions/8112953/...
if (Win32MajorVersion >= 6) and ThemeServices.ThemesEnabled then with TTaskDialog.Create(Self) do try Caption := 'Delete'; Title := 'Are you sure to remove the minecraft?'; Text := 'if you delete minecraft it well be gone forever.'; CommonButtons := [tcbYes, tcbNo]; CustomMainIcon.ReleaseHandle; CustomMainIcon.Handle := LoadIcon(0, IDI_QUESTION); Flags := [tfUseHiconMain]; Execute; finally Free; end else MessageBox(Handle, 'if you delete minecraft it well be gone forever.', 'Are you sure to remove the minecraft?', MB_ICONQUESTION or MB_YESNO);
Bienvenue! Vous pouvez améliorer cette question à mon estimation si vous avez écrit quelques phrases décrivant en mots ce que vous essayez de faire et de ce que votre code ne fait pas comme vous l'avez écrit.
Voir QC.EMBARCADERO.COM/WC/QCMAIN.ASPX?D=91648 a>