2009-02-26 13 views
10

Inputbox:Delphi InputBox zur Passworteingabe?

answer:=Inputbox('a','b','c'); 

funktioniert gut, aber ich bin für einen maskierten einen Blick, wie ein Passwort Feld, in dem nur wenig Sterne anstatt die eingegebenen Zeichen sehen.

Antwort

22

Sie können eine Windows-Nachricht an das Bearbeitungssteuerelement senden, das von InputBox erstellt wurde und das das Bearbeitungssteuerelement für die Kennworteingabe kennzeichnet. Code unten aus http://www.swissdelphicenter.ch/en/showcode.php?id=1208 genommen:

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! elegante Art, die Ausführung zu verzögern :-) –

3

Ich denke nicht, dass Delphi so etwas aus der Box enthält. Vielleicht finden Sie einen unter http://www.torry.net/ oder anderswo im Netz. Ansonsten schreibe einfach einen selbst - sollte nicht so schwer sein. :-) Sie können sogar den Quellcode einsehen, wenn Sie eine "groß genug" Delphi-Version haben.

Uli.

9

InputBox ruft die InputQuery-Funktion in Dialogen auf, die das Formular dynamisch erstellt. Sie könnten immer eine Kopie dieser Funktion erstellen und die PasswordChar-Eigenschaft von TEdit ändern.

26

In XE2, InputBox() und InputQuery() nativ aktualisiert wurden zur Unterstützung der TEdit Eingang Maskierung, obwohl diese Funktion wurde bisher noch nicht dokumentiert. Wenn das erste Zeichen des APrompt Parameter auf einen beliebigen Wert gesetzt wird < #32 dann wird der TEdit.PasswordChar-* eingestellt werden, zB:

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

Jetzt ist das intuitiv! –

+5

Sie haben sich die Mühe gemacht, 'InputQuery()' (was 'InputBox()' intern verwendet) mit neuen Parametern für Multi-Eingabeaufforderungen und einem 'OnCloseQuery'-Callback zu erweitern, aber sie konnten nicht daran interessiert sein, einen neuen Parameter zu erstellen Passwort-Maskierung festlegen? Die Mehrfacheingabeaufforderungen unterstützen die Maskierung pro Eingabeaufforderung, aber sie hätten diese Schnittstelle intuitiver machen können. Anstatt ein Array von Strings mit speziellen Lead-Zeichen zu verwenden, sollten sie ein Array von Datensätzen mit String/Mask-Paaren verwendet haben. Dies hätte sogar zukünftige Felder hinzugefügt werden können, um die "TEdit" -Steuerungen feiner zu kontrollieren. Aber nein. –