【问题标题】:How do I make my Delphi 5 app display password "blobs"?如何让我的 Delphi 5 应用程序显示密码“blob”?
【发布时间】:2009-10-20 14:14:27
【问题描述】:

很简单的一个,但我找不到答案。

我正在 Delphi 5 Enterprise 中构建一个应用程序,并希望我的应用程序在密码字段中使用新的粗体黑点而不是星号。

我该怎么做?

【问题讨论】:

    标签: windows delphi delphi-5


    【解决方案1】:

    PasswordBox: A Better Way to Enter Passwords:

    根据视觉风格显示黑点非常简单!

        private const int ES_PASSWORD = 0x0020;
        ...
    
        protected override CreateParams CreateParams
        {
            CreateParams cp = base.CreateParams;
            ...
    
            cp.Style |= ES_PASSWORD;
            ...
    
            return cp;
        }
    

    【讨论】:

    • @Daniel A. White:谢谢。我不知道任何 Delphi,但它应该很容易翻译。
    • 如果我快速查看单元 StdCtrls,我注意到 TCustomEdit 有一个虚拟的 CreateParams 可以覆盖。 (它甚至可能在 FPasswordChar#0 时已经设置了 ES_PASSWORD 标志
    • 我已经覆盖了 CreateParams 并传递了 ES_PASSWORD(十进制的 32?),但我仍然得到“*”而不是新密码“blob”。
    • @Drarok 请注意,上面的代码没有将cp.Style 设置为0x0020。它正在设置cp.Style = cp.Style | 0x0020,其中| 是按位or
    【解决方案2】:

    感谢上述所有尝试以及所有贡献,但我必须将所有相关部分结合在一起才能获得完整的解决方案。

    感谢 Sinan Ünür 指出 ES_PASSWORD 标志,该标志在 Delphi 中默认使用,但前提是 PasswordChar 为 #0 (NUL)。

    这意味着当您将 PasswordChar 设置为某个值时,它会设置 ES_PASSWORD 标志,然后调用 SendMessage(Handle, EM_SETPASSWORDCHAR, Ord(FPasswordChar), 0);(感谢 Stijn Sanders 将我指向 StdCtrls 源)。

    如果我创建一个子类并绕过发送 EM_SETPASSWORDCHAR 字段的行,我仍然只会得到星号。

    我忘记做的是启用主题(在我的旧版 Delphi 中需要编译资源文件)。嘿 presto,它有效;斑点比比皆是!

    所以,总结一下:

    1. 如果您还没有 ES_PASSWORD 常量,请定义它。

      const
        ES_PASSWORD = 32;
      
    2. 创建一个 TEdit 子类并覆盖 CreateParams 以在窗口样式中包含 ES_PASSWORD。

      procedure TPasswordEdit.CreateParams(var Params: TCreateParams);
      begin
        inherited;
        Params.Style := Params.Style or ES_PASSWORD;
      end;
      
    3. 为您的程序启用主题。

    并且不要设置 PasswordChar 属性。完成!

    【讨论】:

      【解决方案3】:

      我确定它使用标准 UI 字体。 CharMap 代码为 U+25CF

      我不知道这是否可行,但你也许可以复制它。

      【讨论】:

      • 问题是在 Delphi 2009 之前的版本中,PasswordChar 属性是 AnsiChar 类型,它不能保存该字符。 Delphi 2009 及更高版本接受该属性的 Unicode 字符,但根据布鲁斯的回答,您不需要手动设置字符,因为控件已经显示了正确的字符。
      【解决方案4】:

      直到 Delphi 2007,使用 "*" 作为密码字符将显示为 "*"。从 Delphi 2009 开始,这个shows properly

      【讨论】:

        【解决方案5】:

        根据KB 956609,点字符是Unicode 0x25cf。它与特定字体无关,但链接页面特别提到 IE 使用 Tahoma 字体。

        【讨论】:

          【解决方案6】:

          密码字段中的粗黑点是 Unicode 字符 U+25CF(“BLACK CIRCLE”)。最常见的字体都有这个字符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-04
            • 2019-04-17
            • 1970-01-01
            • 1970-01-01
            • 2021-12-25
            相关资源
            最近更新 更多