Plus de contrôle de la messagedlg
Le MessageDlg fonction est très utile car il gère tous les wordwrapping du message et les poignées de positionnement des boutons. Mais deux besoins différents pour un non-défaut de comportement de la MessageDlg m'a fait explorer le code source de la boîte de dialogue de l'unité.
Cet article est initialement paru sur www.undu.com
j'ai d'Abord besoin d'une boite modale qui allait fermer lorsqu'une touche a été pressée et de faire rapport de ce qui touche a été pressée. Un peu comme le TurboPascal commandes SI KEYPRESSED PUIS TheKey:=READKEY.
j'ai besoin de contrôler des boutons dans la boîte de dialogue a été par défaut. Si vous avez un MessageDlg demandant 'voulez-vous vraiment supprimer ce fichier?' ayant alors la Oui-bouton par défaut (qui est la norme dans MessageDlg) pourrait créer des problèmes pour le bien-désireux de l'utilisateur.
Les boîtes de dialogue de l'unité a une fonction appelée CreateMessageDialog qui est utilisé par MessageDlg pour faire de la boîte de dialogue. En utilisant CreateMessageDialog directement, vous obtenez le meilleur de MessageDlg (wordwrapping et d'autres automatique designelements), plus vous obtenez plus de contrôle sur le comportement de la boîte de dialogue.
voici ma solution pour les deux besoins.
Créer une nouvelle application. Mettre deux boutons et d'une étiquette sur le formulaire. Attribuer l'événement onClick de button1 pour TForm1.Button1Click et attribuer l'événement onClick de bouton2 à TForm2.Button2Click.
en Cliquant sur Button1 va désormais produire une boîte de dialogue se ferme lorsque l'utilisateur appuie sur l'une des 'clés' ou lorsque l'utilisateur appuie sur la touche ECHAP ou clique sur le proche-icône. La touche qui a été pressée sera affiché dans Label1.
en Cliquant sur Bouton2 affichera un message standard dialogue avec une différence: le Pas de bouton par défaut, et non pas la touche Oui. Afin de trouver le bouton Aucune-je utiliser SI TButton(Contrôles[n]).Nom='No'. Remplacer 'Aucune' par 'YesToAll','Abort' ou tout autre bouton sous-titres pour créer un bouton par défaut.
unit Unit1
interface
& nbsp & nbsp Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls
type
& nbsp & nbsp TForm1 = class(TForm)
& ! & ! & ! & nbsp Button1: TButton
& ! & ! & ! & nbsp Label1: TLabel
& ! & ! & ! & nbsp Bouton2: TButton
& ! & ! & ! & nbsp procédure Button1Click(Sender: TObject)
& ! & ! & ! & nbsp procédure HelpBoxKeyPress(Sender: TObject var Key: Char)
& ! & ! & ! & nbsp procédure Button2Click(Sender: TObject)
& nbsp & nbsp privé
& ! & ! & ! & nbsp { Private declarations }
& nbsp & nbsp public
& ! & ! & ! & nbsp { déclarations Publiques }
& nbsp & nbsp fin
var
& nbsp & nbsp Form1: TForm1
application
{$R *.DFM}
VAR
& nbsp & nbsp LegalKeys: String
procedure TForm1.Button1Click(Sender: TObject)
VAR
& nbsp & nbsp s:String
begin
& nbsp & nbsp LegalKeys:='ABC123'
& nbsp & nbsp s:='Que voulez-vous faire maintenant?' #13#13
& ! & ! & ! & ! 'A. rentrer à la maison' #13
& ! & ! & ! & ! 'B. Manger' = #13
& ! & ! & ! & nbsp C. Sommeil' #13
& ! & ! & ! & ! '1. Programme en Delphi' #13
& ! & ! & ! & ! '2. Commander une Pizza' #13
& ! & ! & ! & ! '3. Rien'
& nbsp & nbsp AVEC CreateMessageDialog(s, mtConfirmation, []) NE
& nbsp & nbsp COMMENCER
& ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & nbsp onKeyPress:=HelpBoxKeyPress
& ! & ! & ! & ! & ! & nbsp SI ShowModal=mrOK
& ! & ! & ! & ! & ! & nbsp PUIS Label1.Caption:='Vous avez appuyé sur:' LegalKeys[Tag]
& ! & ! & ! & ! & ! & nbsp AUTRE Label1.Caption:='Vous avez appuyé sur: ''Annuler'
& ! & ! & ! & nbsp enfin
& ! & ! & ! & ! & ! & nbsp Gratuit
& ! & ! & ! & nbsp fin //try..finally
& nbsp & nbsp FIN //avec
fin
procedure TForm1.HelpBoxKeyPress(Sender: TObject var Key: Char)
BEGIN
& nbsp & nbsp SI Pos(UpCase(Clé),LegalKeys)>0, ALORS
& ! & ! & ! & nbsp COMMENCER
& ! & ! & ! & ! & ! & nbsp TForm(Expéditeur).Tag:=Pos(UpCase(Clé),LegalKeys)
& ! & ! & ! & ! & ! & nbsp TForm(Expéditeur).ModalResult:=mrOK
& ! & ! & ! & nbsp FIN
& nbsp & nbsp ELSE if Key=#27 TForm(Expéditeur).ModalResult:=mrCancel
FIN
procedure TForm1.Button2Click(Sender: TObject)
VAR
& nbsp & nbsp n:Integer
begin
& nbsp & nbsp AVEC CreateMessageDialog('voulez-vous vraiment supprimer ce fichier?',mtWarning,[mbYes,mbNo]) NE
& ! & ! & ! & nbsp COMMENCER
& ! & ! & ! & ! & ! & nbsp POUR n:=0 POUR ControlCount-1 DO
& ! & ! & ! & ! & ! & ! & ! & nbsp SI (Contrôles[n] est TButton)
& ! & ! & ! & ! & ! & ! & ! & nbsp PUIS SI TButton(Contrôles[n]).Name= ' Non ' ALORS TButton (Contrôles[n]).TabOrder:=0
& ! & ! & ! & ! & ! & nbsp ShowModal
& ! & ! & ! & nbsp FIN
fin
à la fin.
Plus de controle de la messagedlg
Plus de controle de la messagedlg : Plusieurs milliers de conseils pour vous faciliter la vie.
Le MessageDlg fonction est tres utile car il gere tous les wordwrapping du message et les poignees de positionnement des boutons. Mais deux besoins differents pour un non-defaut de comportement de la MessageDlg m'a fait explorer le code source de la boîte de dialogue de l'unite.
Cet article est initialement paru sur www.undu.com
j'ai d'Abord besoin d'une boite modale qui allait fermer lorsqu'une touche a ete pressee et de faire rapport de ce qui touche a ete pressee. Un peu comme le TurboPascal commandes SI KEYPRESSED PUIS TheKey:=READKEY.
j'ai besoin de controler des boutons dans la boîte de dialogue a ete par defaut. Si vous avez un MessageDlg demandant 'voulez-vous vraiment supprimer ce fichier?' ayant alors la Oui-bouton par defaut (qui est la norme dans MessageDlg) pourrait creer des problemes pour le bien-desireux de l'utilisateur.
Les boîtes de dialogue de l'unite a une fonction appelee CreateMessageDialog qui est utilise par MessageDlg pour faire de la boîte de dialogue. En utilisant CreateMessageDialog directement, vous obtenez le meilleur de MessageDlg (wordwrapping et d'autres automatique designelements), plus vous obtenez plus de controle sur le comportement de la boîte de dialogue.
voici ma solution pour les deux besoins.
Creer une nouvelle application. Mettre deux boutons et d'une etiquette sur le formulaire. Attribuer l'evenement onClick de button1 pour TForm1.Button1Click et attribuer l'evenement onClick de bouton2 a TForm2.Button2Click.
en Cliquant sur Button1 va desormais produire une boîte de dialogue se ferme lorsque l'utilisateur appuie sur l'une des 'cles' ou lorsque l'utilisateur appuie sur la touche ECHAP ou clique sur le proche-icone. La touche qui a ete pressee sera affiche dans Label1.
en Cliquant sur Bouton2 affichera un message standard dialogue avec une difference: le Pas de bouton par defaut, et non pas la touche Oui. Afin de trouver le bouton Aucune-je utiliser SI TButton(Controles[n]).Nom='No'. Remplacer 'Aucune' par 'YesToAll','Abort' ou tout autre bouton sous-titres pour creer un bouton par defaut.
unit Unit1
interface
& nbsp & nbsp Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls
type
& nbsp & nbsp TForm1 = class(TForm)
& ! & ! & ! & nbsp Button1: TButton
& ! & ! & ! & nbsp Label1: TLabel
& ! & ! & ! & nbsp Bouton2: TButton
& ! & ! & ! & nbsp procedure Button1Click(Sender: TObject)
& ! & ! & ! & nbsp procedure HelpBoxKeyPress(Sender: TObject var Key: Char)
& ! & ! & ! & nbsp procedure Button2Click(Sender: TObject)
& nbsp & nbsp prive
& ! & ! & ! & nbsp { Private declarations }
& nbsp & nbsp public
& ! & ! & ! & nbsp { declarations Publiques }
& nbsp & nbsp fin
var
& nbsp & nbsp Form1: TForm1
application
{$R *.DFM}
VAR
& nbsp & nbsp LegalKeys: String
procedure TForm1.Button1Click(Sender: TObject)
VAR
& nbsp & nbsp s:String
begin
& nbsp & nbsp LegalKeys:='ABC123'
& nbsp & nbsp s:='Que voulez-vous faire maintenant?' #13#13
& ! & ! & ! & ! 'A. rentrer a la maison' #13
& ! & ! & ! & ! 'B. Manger' = #13
& ! & ! & ! & nbsp C. Sommeil' #13
& ! & ! & ! & ! '1. Programme en Delphi' #13
& ! & ! & ! & ! '2. Commander une Pizza' #13
& ! & ! & ! & ! '3. Rien'
& nbsp & nbsp AVEC CreateMessageDialog(s, mtConfirmation, []) NE
& nbsp & nbsp COMMENCER
& ! & ! & ! & nbsp essayer
& ! & ! & ! & ! & ! & nbsp onKeyPress:=HelpBoxKeyPress
& ! & ! & ! & ! & ! & nbsp SI ShowModal=mrOK
& ! & ! & ! & ! & ! & nbsp PUIS Label1.Caption:='Vous avez appuye sur:' LegalKeys[Tag]
& ! & ! & ! & ! & ! & nbsp AUTRE Label1.Caption:='Vous avez appuye sur: ''Annuler'
& ! & ! & ! & nbsp enfin
& ! & ! & ! & ! & ! & nbsp Gratuit
& ! & ! & ! & nbsp fin //try..finally
& nbsp & nbsp FIN //avec
fin
procedure TForm1.HelpBoxKeyPress(Sender: TObject var Key: Char)
BEGIN
& nbsp & nbsp SI Pos(UpCase(Cle),LegalKeys)>0, ALORS
& ! & ! & ! & nbsp COMMENCER
& ! & ! & ! & ! & ! & nbsp TForm(Expediteur).Tag:=Pos(UpCase(Cle),LegalKeys)
& ! & ! & ! & ! & ! & nbsp TForm(Expediteur).ModalResult:=mrOK
& ! & ! & ! & nbsp FIN
& nbsp & nbsp ELSE if Key=#27 TForm(Expediteur).ModalResult:=mrCancel
FIN
procedure TForm1.Button2Click(Sender: TObject)
VAR
& nbsp & nbsp n:Integer
begin
& nbsp & nbsp AVEC CreateMessageDialog('voulez-vous vraiment supprimer ce fichier?',mtWarning,[mbYes,mbNo]) NE
& ! & ! & ! & nbsp COMMENCER
& ! & ! & ! & ! & ! & nbsp POUR n:=0 POUR ControlCount-1 DO
& ! & ! & ! & ! & ! & ! & ! & nbsp SI (Controles[n] est TButton)
& ! & ! & ! & ! & ! & ! & ! & nbsp PUIS SI TButton(Controles[n]).Name= ' Non ' ALORS TButton (Controles[n]).TabOrder:=0
& ! & ! & ! & ! & ! & nbsp ShowModal
& ! & ! & ! & nbsp FIN
fin
a la fin.
Plus de contrôle de la messagedlg
By commentfaire
Plus de contrôle de la messagedlg : Plusieurs milliers de conseils pour vous faciliter la vie.