Delphi InputBox para entrada de senha?
Pergunta
Caixa de entrada:
answer:=Inputbox('a','b','c');
Funciona bem, mas estou procurando uma caixa de senha mascarada, como uma senha, onde você só vê pequenas estrelas em vez dos caracteres digitados.
Solução
Você pode enviar uma mensagem do Windows para o controle de edição criado por InputBox
, isso sinalizará o controle de edição para entrada de senha. Código abaixo tirado 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;
Outras dicas
Em XE2, InputBox()
e InputQuery()
foram atualizados para apoiar nativamente o mascarar o TEdit
A entrada, embora esse recurso ainda não tenha sido documentado. Se o primeiro personagem do APrompt
O parâmetro está definido como qualquer valor #32
então o TEdit.PasswordChar
será definido como *
, por exemplo:
answer := InputBox('a', #31'b', 'c');
O InputBox chama a função de entrada em diálogos, que cria o formulário dinamicamente. Você sempre pode fazer uma cópia desta função e alterar a propriedade Passwordchar do TEDIT.
Eu não acho que Delphi inclua uma coisa dessas. Talvez você possa encontrar um em http://www.torry.net/ ou em outros lugares da rede. Caso contrário, apenas escreva um você mesmo - não deve ser tão difícil. :-) Você pode até olhar para o código-fonte se tiver uma versão Delphi "grande o suficiente".
Uli.
Você pode usar o InputQuery em vez do InputBox. Quando o verdadeiro argumento for definido, o campo de senha será mascarado.
InputQuery('Authenticate', 'Password:',TRUE, value);
Algum recurso aqui; http://lazarus-ccr.sourceforge.net/docs/lcl/dialogs/inputquery.html