如何将密码文本隐藏在编辑框中?

问题描述

| 我有一个输入框,希望用户输入密码,但同时将其隐藏。 这可能吗? 到目前为止,这是我的代码
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;