2009-02-26 18 views

Répondre

22

Vous pouvez envoyer un message Windows au contrôle d'édition créé par InputBox, qui marquera le contrôle d'édition pour l'entrée du mot de passe. Code ci-dessous tiré de http://www.swissdelphicenter.ch/en/showcode.php?id=1208:

const 
    InputBoxMessage = WM_USER + 200; 

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    procedure InputBoxSetPasswordChar(var Msg: TMessage); message InputBoxMessage; 
    public 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.DFM} 

procedure TForm1.InputBoxSetPasswordChar(var Msg: TMessage); 
var 
    hInputForm, hEdit, hButton: HWND; 
begin 
    hInputForm := Screen.Forms[0].Handle; 
    if (hInputForm <> 0) then 
    begin 
    hEdit := FindWindowEx(hInputForm, 0, 'TEdit', nil); 
    { 
     // Change button text: 
     hButton := FindWindowEx(hInputForm, 0, 'TButton', nil); 
     SendMessage(hButton, WM_SETTEXT, 0, Integer(PChar('Cancel'))); 
    } 
    SendMessage(hEdit, EM_SETPASSWORDCHAR, Ord('*'), 0); 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    InputString: string; 
begin 
    PostMessage(Handle, InputBoxMessage, 0, 0); 
    InputString := InputBox('Input Box', 'Please Enter a Password', ''); 
end; 
+0

Wow! façon élégante de différer l'exécution :-) –

3

Je ne pense pas que Delphi inclut une telle chose hors de la boîte. Peut-être que vous pouvez en trouver un au http://www.torry.net/ ou ailleurs dans le net. Sinon, écrivez-en un vous-même - ne devrait pas être si difficile. :-) Vous pouvez même regarder le code source si vous avez une version "assez grande" Delphi.

Uli. InputBox appelle la fonction InputQuery dans Dialogs, ce qui crée le formulaire de manière dynamique.

9

Vous pouvez toujours faire une copie de cette fonction et changer la propriété PasswordChar de TEdit.

26

En XE2, InputBox() et InputQuery() ont été mis à jour pour supporter nativement masquer l'entrée TEdit, bien que cette fonction n'a pas été documentée encore. Si le premier caractère du paramètre APrompt est réglé sur une valeur < #32 alors le TEdit.PasswordChar sera réglé sur *, par exemple:

answer := InputBox('a', #31'b', 'c'); 
+2

Maintenant c'est intuitif! –

+5

Ils ont eu la peine d'étendre 'InputQuery()' (que 'InputBox()' utilise en interne) avec de nouveaux paramètres pour les invites multiples et un rappel 'OnCloseQuery', mais ils ne pouvaient pas être dérangés pour créer un nouveau paramètre pour spécifier le masquage du mot de passe? Les invites multiples prennent en charge le masquage par invite, mais ils auraient pu rendre cette interface plus intuitive. Au lieu d'utiliser un tableau de chaînes avec des caractères spéciaux, ils auraient dû utiliser un tableau d'enregistrements contenant des paires chaîne/masque. Cela aurait même permis d'ajouter de nouveaux champs pour un contrôle plus fin des contrôles 'TEdit'. Mais non. –

Questions connexes