2009-02-26 6 views

risposta

22

È possibile inviare un messaggio di Windows al controllo di modifica creato da InputBox, che contrassegna il controllo di modifica per l'immissione della password. Codice qui sotto tratto da 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! modo elegante per posticipare l'esecuzione :-) –

3

Non credo che Delphi includa una cosa del genere fuori dalla scatola. Forse puoi trovarne uno a http://www.torry.net/ o altrove nella rete. Altrimenti, scrivine uno solo - non dovrebbe essere così difficile. :-) Puoi anche guardare il codice sorgente se hai una versione Delphi "abbastanza grande".

Uli.

9

InputBox chiama la funzione InputQuery nelle finestre di dialogo, che crea il modulo in modo dinamico. È sempre possibile fare una copia di questa funzione e modificare la proprietà PasswordChar di TEdit.

26

In XE2, InputBox() e InputQuery() sono stati aggiornati per supportare nativamente mascherare l'ingresso TEdit, anche se questa caratteristica non è stato ancora documentato. Se il primo carattere del parametro APrompt è impostato su qualsiasi valore < #32 poi il TEdit.PasswordChar verrà impostato *, ad esempio:

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

Ora è intuitivo! –

+5

Hanno avuto l'ambizione di espandere 'InputQuery()' (che 'InputBox()' utilizza internamente) con nuovi parametri per prompt multipli e un callback 'OnCloseQuery', ma non potevano essere disturbati per creare un nuovo parametro per specificando il mascheramento della password? I multi-prompt supportano il masking per-prompt, ma avrebbero potuto rendere quell'interfaccia più intuitiva. Invece di usare una serie di stringhe con caratteri speciali speciali, avrebbero dovuto usare una serie di record contenenti coppie stringa/maschera. Ciò avrebbe persino consentito l'aggiunta di campi futuri per un controllo più preciso sui controlli "TEdit". Ma no. –

Problemi correlati