Как скрыть текст пароля в поле ввода? - PullRequest
9 голосов
/ 14 июня 2011

У меня есть поле ввода и я хочу, чтобы пользователь ввел пароль, но в то же время скрыл его.

Возможно ли это?

Это мой код:

var password : string;
begin
 password := InputBox('Password: ', 'Please enter your password: ', password)
end;

Ответы [ 6 ]

16 голосов
/ 14 июня 2011

Вы не можете использовать 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,
  AText: string; AMin, 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;

Снимок экрана http://privat.rejbrand.se/superinputdlgpsw.png

5 голосов
/ 14 июня 2011

Похоже, что здесь ответили:

Delphi InputBox для ввода пароля?

3 голосов
/ 14 июня 2011

Не используйте InputBox. Создайте диалог самостоятельно и убедитесь, что для TEdit.PasswordChar установлено значение, отличное от #0.

Может также быть возможным получить дескриптор элемента управления Edit в InputBox и установить PasswordChar с помощью сообщения Windows, но я не знаю, как это сделать на макушке головы (тем более, что InputBox блокирующий вызов).

Delphi XE также имеет форму Password Dialog, доступную для использования при создании новой формы. Старые версии, вероятно, тоже делают, XE, как раз то, что у меня сейчас работает. (Правка Delphi 2007 также есть. 2007 и XE - единственные версии Delphi, которые я установил прямо сейчас, поэтому я не могу проверить другие версии.)

2 голосов
/ 14 июня 2011
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, 0, 'TEdit', nil);
    SendMessage(hEdit, EM_SETPASSWORDCHAR, Ord('*'), 0);
  end;
end;

function TForm1.GetPassword: String;
begin
  PostMessage(Handle, InputBoxMessage, 0, 0);
  Result := InputBox('Title', 'Password:', '');
end;
0 голосов
/ 06 февраля 2016

Я думаю, вам также нужно установить:

  Echomode := eemPassword

Как минимум для TdlcxLabeledDBTextEdit.

0 голосов
/ 27 июня 2012
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if checkbox1.checked = true then
    edit1.passwordchar := '*'
   else
    edit1.PasswordChar := #0;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...