2009-02-26 21 views
10

Inputbox:Delphi InputBox?

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

iyi çalışır, ancak ben sadece küçük yıldız yerine yazdığınız karakter görmek şifre kutusu gibi, bir maskeli birini arıyorum.

cevap

22

Düzenleme denetimini parola girişi için işaretleyecek olan InputBox tarafından oluşturulan düzenleme denetimine Windows iletisi gönderebilirsiniz. Kod aşağıda http://www.swissdelphicenter.ch/en/showcode.php?id=1208 alınan:

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

Vay! yürütme ertelemek için zarif bir yol :-) –

3

Delphi'nin kutudan böyle bir şey içerdiğini sanmıyorum. Belki de http://www.torry.net/ numaralı telefondan veya internette başka bir yerde bulabilirsiniz. Aksi halde sadece kendiniz yazın - o kadar da zor olmamalı. :-) "Yeterince büyük" bir Delphi sürümüne sahipseniz, kaynak koduna bile bakabilirsiniz.

Uli.

9

InputBox, formu dinamik olarak oluşturan Dialog'larda InputQuery işlevini çağırır. Bu işlevin bir kopyasını her zaman yapabilir ve TEdit'in PasswordChar özelliğini değiştirebilirsiniz.

26

XE2'de yılında InputBox() ve InputQuery() doğal TEdit girişini maskeleme desteklemek için güncellendi, bu özellik henüz bildirilmemiş olup, her ne kadar. APrompt parametrenin ilk karakteri herhangi bir değere ayarlanırsa < #32 sonra TEdit.PasswordChar, * ayarlanır örn:

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

Şimdi bu sezgisel! –

+5

'InputQuery()' ('InputBox() ') dahili olarak kullanan çoklu girişler ve' OnCloseQuery' geri çağrıları için yeni parametrelerle genişlediklerine rağmen, yeni bir parametre oluşturmak için rahatsız olmazlardı. şifre maskeleme belirleniyor mu? Çoklu istemler, her sefere yönelik maskelemeyi destekler, ancak bu arabirimi daha sezgisel hale getirmiş olabilirler. Özel kurşun karakterleri olan bir dizi diziyi kullanmak yerine, dizgeyi/maske çiftlerini içeren bir dizi kayıt kullanmış olmalıdırlar. Bu, 'TEdit' kontrolleri üzerinde daha iyi kontrol için gelecekteki alanların eklenmesine bile izin verecek. Ama hayır. –