2009-02-26 33 views

Trả lời

22

Bạn có thể gửi tin nhắn Windows cho điều khiển chỉnh sửa được tạo bởi InputBox, sẽ gắn cờ điều khiển chỉnh sửa để nhập mật khẩu. Mã dưới đây lấy từ 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! cách thanh lịch để trì hoãn việc thực hiện :-) –

3

Tôi không nghĩ rằng Delphi bao gồm một thứ như vậy ra khỏi hộp. Có lẽ bạn có thể tìm thấy một tại http://www.torry.net/ hoặc ở nơi khác trong mạng. Nếu không, chỉ cần viết một bản thân - không nên quá khó. :-) Bạn thậm chí có thể xem mã nguồn nếu bạn có phiên bản Delphi "đủ lớn".

Uli.

9

InputBox gọi hàm InputQuery trong Hộp thoại, tạo biểu mẫu động. Bạn luôn có thể tạo một bản sao của hàm này và thay đổi thuộc tính PasswordChar của TEdit.

26

Trong XE2, InputBox()InputQuery() đã được cập nhật để hỗ trợ natively che TEdit đầu vào, mặc dù tính năng này đã không được ghi nhận nêu ra. Nếu ký tự đầu tiên của tham số APrompt được thiết lập để bất kỳ giá trị < #32 thì TEdit.PasswordChar sẽ được thiết lập để *, ví dụ:

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

Bây giờ là trực quan! –

+5

Họ gặp rắc rối khi mở rộng 'InputQuery()' (mà 'InputBox()' sử dụng nội bộ) với các tham số mới cho nhiều lời nhắc và lời gọi lại 'OnCloseQuery', nhưng chúng không thể bị làm phiền khi tạo tham số mới cho xác định mặt nạ mật khẩu? Multi-prompt sẽ hỗ trợ chế độ che dấu nhắc nhở, nhưng họ có thể làm cho giao diện đó trực quan hơn. Thay vì sử dụng một chuỗi các chuỗi có các ký tự dẫn đầu đặc biệt, chúng nên sử dụng một mảng các bản ghi chứa các cặp chuỗi/mặt nạ. Điều đó thậm chí còn cho phép các trường trong tương lai được thêm vào để kiểm soát tốt hơn các điều khiển 'TEdit'. Nhưng không. –

Các vấn đề liên quan