Delphi 输入框用于密码输入?

问题描述 投票:0回答:7

输入框:

answer:=Inputbox('a','b','c');

效果很好,但我正在寻找一个蒙面的,就像一个密码框,你只能看到小星星而不是键入的字符。

delphi mask textinput inputbox
7个回答
44
投票

在 XE2 中,

InputBox()
InputQuery()
已更新,以原生支持屏蔽
TEdit
输入,尽管该功能尚未记录。 如果
APrompt
参数的第一个字符设置为任意值 <
#32
,则
TEdit.PasswordChar
将设置为
*
,例如:

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

30
投票

您可以向由

InputBox
创建的编辑控件发送一条 Windows 消息,这将标记编辑控件以输入密码。以下代码取自 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;

9
投票

InputBox调用Dialogs中的InputQuery函数,动态创建表单。 您始终可以复制此函数并更改 TEdit 的 PasswordChar 属性。


3
投票

我不认为 Delphi 包含这样的开箱即用的东西。也许您可以在 http://www.torry.net/ 或网络上的其他地方找到一个。否则就自己写一个吧——应该不会那么难。 :-) 如果您有“足够大”的 Delphi 版本,您甚至可以查看源代码。

乌利。


2
投票

如果有人仍然需要一个简单的解决方案,这里是:

InputQuery('MyCaption', #0 + 'MyPrompt', Value); // <-- the password char '*' is used

这是可行的,因为 InputQuery 函数具有以下嵌套函数:

function GetPasswordChar(const ACaption: string): Char;
begin
  if (Length(ACaption) > 1) and (ACaption[1] < #32) then
    Result := '*'
  else
    Result := #0;
end;

每个提示都会调用它:

PasswordChar := GetPasswordChar(APrompts[I]);

因此,如果 APrompts 中的第一个字符是 < #32 (ex. #0), the password char of the TEdit will be '*'.

在Delphi 10.4上测试。我不确定这个是什么时候引入的,我从D6直接跳到10.4并且没有在D6上测试。


0
投票

您可以使用InputQuery代替InputBox。当设置 TRUE 参数时,密码字段将被屏蔽。

InputQuery('Authenticate', 'Password:',TRUE, value);     

这里有一些资源; http://lazarus-ccr.sourceforge.net/docs/lcl/dialogs/inputquery.html


0
投票

有人已经指出,如果提示的第一个字符的值小于 32,输入将被屏蔽。我只是补充一点,根据 Firemonkey 输入查询的文档,该字符应该是 SOH(值 1):

要屏蔽文本输入字段的内容,以便在您键入时显示点而不是字符,请在 APrompts 的相应标签字符串的开头包含

标题开始 (SOH) 控制字符
。例如:

  • 德尔福:
    #1'Password:'
  • C++:
    "\1Password:"

来源:https://docwiki.embarcadero.com/Libraries/Sydney/en/FMX.Platform.IFMXDialogServiceSync.InputQuerySync

不过,我不确定这是否也适用于 VCL。

© www.soinside.com 2019 - 2024. All rights reserved.