如何解决如何将密码文本隐藏在编辑框中?
| 我有一个输入框,希望用户输入密码,但同时将其隐藏。 这可能吗? 到目前为止,这是我的代码:var password : string;
begin
password := InputBox(\'Password: \',\'Please enter your password: \',password)
end;
解决方法
您不能为此使用
InputBox
,因为,很显然,此功能不会隐藏文本。
不过,标准的Windows编辑控件具有“密码模式”。要对此进行测试,只需在表单中添加TEdit
并将其PasswordChar
设置为*
。
如果要在输入框中使用这种编辑,则必须自己编写此对话框,例如我的“超级输入对话框”:
type
TMultiInputBox = class
strict private
class var
frm: TForm;
lbl: TLabel;
edt: TEdit;
btnOK,btnCancel: TButton;
shp: TShape;
FMin,FMax: integer;
FTitle,FText: string;
class procedure SetupDialog;
class procedure ValidateInput(Sender: TObject);
public
class function TextInputBox(AOwner: TCustomForm; const ATitle,AText: string; var Value: string): boolean;
class function NumInputBox(AOwner: TCustomForm; const ATitle,AText: string; AMin,AMax: integer; var Value: integer): boolean;
class function PasswordInputBox(AOwner: TCustomForm; const ATitle,AText: string; var Value: string): boolean;
end;
class procedure TMultiInputBox.SetupDialog;
begin
frm.Caption := FTitle;
frm.Width := 512;
frm.Position := poOwnerFormCenter;
frm.BorderStyle := bsDialog;
lbl := TLabel.Create(frm);
lbl.Parent := frm;
lbl.Left := 8;
lbl.Top := 8;
lbl.Width := frm.ClientWidth - 16;
lbl.Caption := FText;
edt := TEdit.Create(frm);
edt.Parent := frm;
edt.Top := lbl.Top + lbl.Height + 8;
edt.Left := 8;
edt.Width := frm.ClientWidth - 16;
btnOK := TButton.Create(frm);
btnOK.Parent := frm;
btnOK.Default := true;
btnOK.Caption := \'OK\';
btnOK.ModalResult := mrOk;
btnCancel := TButton.Create(frm);
btnCancel.Parent := frm;
btnCancel.Cancel := true;
btnCancel.Caption := \'Cancel\';
btnCancel.ModalResult := mrCancel;
btnCancel.Top := edt.Top + edt.Height + 16;
btnCancel.Left := frm.ClientWidth - btnCancel.Width - 8;
btnOK.Top := btnCancel.Top;
btnOK.Left := btnCancel.Left - btnOK.Width - 4;
frm.ClientHeight := btnOK.Top + btnOK.Height + 8;
shp := TShape.Create(frm);
shp.Parent := frm;
shp.Brush.Color := clWhite;
shp.Pen.Style := psClear;
shp.Shape := stRectangle;
shp.Align := alTop;
shp.Height := btnOK.Top - 8;
shp.SendToBack;
end;
class function TMultiInputBox.TextInputBox(AOwner: TCustomForm; const ATitle,AText: string; var Value: string): boolean;
begin
FTitle := ATitle;
FText := AText;
frm := TForm.Create(AOwner);
try
SetupDialog;
edt.NumbersOnly := false;
edt.PasswordChar := #0;
edt.Text := Value;
edt.OnChange := nil;
result := frm.ShowModal = mrOK;
if result then Value := edt.Text;
finally
frm.Free;
end;
end;
class function TMultiInputBox.PasswordInputBox(AOwner: TCustomForm;
const ATitle,AText: string; var Value: string): boolean;
begin
FTitle := ATitle;
FText := AText;
frm := TForm.Create(AOwner);
try
SetupDialog;
edt.NumbersOnly := false;
edt.PasswordChar := \'*\';
edt.Text := Value;
edt.OnChange := nil;
result := frm.ShowModal = mrOK;
if result then Value := edt.Text;
finally
frm.Free;
end;
end;
class procedure TMultiInputBox.ValidateInput(Sender: TObject);
var
n: integer;
begin
btnOK.Enabled := TryStrToInt(edt.Text,n) and InRange(n,FMin,FMax);
end;
class function TMultiInputBox.NumInputBox(AOwner: TCustomForm; const ATitle,AMax: integer; var Value: integer): boolean;
begin
FMin := AMin;
FMax := AMax;
FTitle := ATitle;
FText := AText;
frm := TForm.Create(AOwner);
try
SetupDialog;
edt.NumbersOnly := true;
edt.PasswordChar := #0;
edt.Text := IntToStr(value);
edt.OnChange := ValidateInput;
result := frm.ShowModal = mrOK;
if result then Value := StrToInt(edt.Text);
finally
frm.Free;
end;
end;
尝试一下:
procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
begin
str := \'\';
if TMultiInputBox.PasswordInputBox(Self,\'Password\',\'Please enter your password:\',str) then
ShowMessageFmt(\'You entered %s.\',[str]);
end;
, 这看起来像在这里回答:
用Delphi InputBox输入密码?
, 不要使用InputBox
。自己创建一个对话框,并确保将TEdit.PasswordChar
设置为#0
以外的值。
也可能可以通过Windows消息获取InputBox的Edit控件的句柄并设置ѭ3,但是我不知道该怎么办(特别是因为InputBox是一个阻止通话)。
创建新表格时,Delphi XE还可以使用ѭ11表格。较旧的版本也可能这样做,XE恰好是我现在正在运行的版本。 (Edit Delphi 2007也有它。2007&XE是我现在安装的唯一Delphi版本,因此我无法验证其他任何版本。)
, const
InputBoxMessage = WM_USER + 200;
type
TForm1 = class(TForm)
...
procedure InputBoxSetPasswordChar(var Msg: TMessage); message InputBoxMessage;
function GetPassword: String;
...
end;
...
procedure TForm1.InputBoxSetPasswordChar(var Msg: TMessage);
var
hInputForm,hEdit: HWND;
begin
hInputForm := Screen.Forms[0].Handle;
if (hInputForm <> 0) then
begin
hEdit := FindWindowEx(hInputForm,\'TEdit\',nil);
SendMessage(hEdit,EM_SETPASSWORDCHAR,Ord(\'*\'),0);
end;
end;
function TForm1.GetPassword: String;
begin
PostMessage(Handle,InputBoxMessage,0);
Result := InputBox(\'Title\',\'Password:\',\'\');
end;
, 我认为您还需要设置:
Echomode := eemPassword
至少对于TdlcxLabeledDBTextEdit。
, procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if checkbox1.checked = true then
edit1.passwordchar := \'*\'
else
edit1.PasswordChar := #0;
end;
end;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。