2009-02-26 51 views

Respuesta

22

Puede enviar un mensaje de Windows al control de edición creado por InputBox, que marcará el control de edición para ingresar la contraseña. Código de abajo tomada 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! manera elegante de diferir la ejecución :-) –

3

No creo que Delphi incluya tal cosa fuera de la caja. Tal vez puedas encontrar uno en http://www.torry.net/ o en otro lugar de la red. De lo contrario, solo escriba uno usted mismo, no debería ser tan difícil. :-) Incluso puede ver el código fuente si tiene una versión Delphi "lo suficientemente grande".

Uli.

9

InputBox llama a la función InputQuery en Diálogos, que crea la forma de forma dinámica. Siempre puede hacer una copia de esta función y cambiar la propiedad PasswordChar de TEdit.

26

En XE2, InputBox() y InputQuery() fueron actualizadas para soportar de forma nativa enmascarar la entrada TEdit, aunque esta característica no se ha documentado aún. Si el primer carácter del parámetro APrompt se establece en cualquier valor < #32 entonces el TEdit.PasswordChar se establecerá en *, por ejemplo:

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

¡Eso es intuitivo! –

+5

Se tomaron la molestia de expandir 'InputQuery()' (que 'InputBox()' usa internamente) con nuevos parámetros para varias solicitudes y una devolución de llamada 'OnCloseQuery', pero no se les pudo molestar para crear un nuevo parámetro para especificando enmascaramiento de contraseña? Las solicitudes múltiples admiten el enmascaramiento por solicitud, pero podrían haber hecho esa interfaz más intuitiva. En lugar de usar una matriz de cadenas con caracteres principales especiales, deberían haber usado una matriz de registros que contengan pares de cadenas/máscaras. Eso incluso habría permitido agregar campos futuros para un control más preciso sobre los controles 'TEdit'. Pero no. –

Cuestiones relacionadas