Board logo

Subject: 关于CnOptionGroup字符为密码时,该如何隐藏字符 [Print This Page]

Author: 雨中雪    Time: 2009-2-21 09:06     Subject: 关于CnOptionGroup字符为密码时,该如何隐藏字符

with Option.AddGroup('用户登录设置') do
     begin
       AddItem(GmConfig,'UserName','用户名');
       AddItem(GmConfig,'passowrd','密码');
     end;

在设置时密码以明文显示,请问该如何隐藏密码

[ 本帖最后由 雨中雪 于 2009-2-21 09:08 编辑 ]
Author: 雨中雪    Time: 2009-2-21 09:10

function TCnOptionGroup.AddItem(AInstance: TObject; const APropName: string;
  const AText: string; const AList: string; ADefaultValue, AMinValue,
  AMaxValue: Variant): TCnOptionItem;

如何加入一参数标识是否是密码:APassWord:boolean
Author: Passion    Time: 2009-2-21 11:04

组件包本身不具有这个功能,需要自行修改代码以实现它。
Author: 雨中雪    Time: 2009-2-22 13:16

我尝试着增加以下

procedure TCnOptionItem.setPasswordChar(const Value: string);
begin
  FPasswordChar := Value;
end;


function TCnOptionItem.GetPasswordChar: string;
begin
  if not VarIsNull(FPasswordChar) then
    Result := FPasswordChar
  else
      Result := '#0';
end;

在TCnOptionItem = class(TCnBaseOption)的published中增加
    property PassWordChar: string read GetPassWordChar write SetPassWordChar;
    {* 关联对象属性密码掩码 }


不知道还要增加哪些代码,请指教!

[ 本帖最后由 雨中雪 于 2009-2-22 13:17 编辑 ]
Author: zjy    Time: 2009-2-25 22:05     Subject: 代码已更新

请从 CVS 中更新 CnPack 最新的代码。
此次更新为 TCnAOTreeView 增加了一个 OnCreateInplaceEdit 事件,针对密码框的示例如下:

procedure TForm1.OnCreateInplaceEdit(Sender: TObject;
  InplaceEdit: TControl; AOption: TCnBaseOption);
begin
  if (InplaceEdit is TCustomEdit) and (AOption is TCnOptionItem) and
    SameText(TCnOptionItem(AOption).PropName, 'Password') then
    TEdit(InplaceEdit).PasswordChar := '*';
end;

详见 Demo 程序。
Author: 雨中雪    Time: 2009-2-26 10:52

CVS登录不上,说用户名和密码不正确
Author: Passion    Time: 2009-2-26 11:06

请问是否参考了此贴?
http://bbs.cnpack.org/viewthread.php?tid=1882&extra=page%3D1

如果是按里头做的,烦请贴出出错信息看看?
Author: 雨中雪    Time: 2009-2-26 11:41

这句能不能改成这样的:
  if (InplaceEdit is TCustomEdit) and (AOption is TCnOptionItem) and
    (pos('password',TCnOptionItem(AOption).PropName)>0) then
    TEdit(InplaceEdit).PasswordChar := '*';


这样就不会局限于密码的属性必须为Password,只要属性中包含password就是密码输入框,就以*显示文本内容。

[ 本帖最后由 雨中雪 于 2009-2-26 14:02 编辑 ]
Author: 雨中雪    Time: 2009-2-26 11:45

我刚才作了以下测试:发现以下问题:

图一是正常显示时,密码确以明文显示出来;

图二为在输入密码时显示是正确的;

[ 本帖最后由 雨中雪 于 2009-2-26 11:46 编辑 ]

Image Attachment: 2.png (2009-2-26 11:45, 562 bytes) / Download count 362
http://bbs.cnpack.org/attachment.php?aid=590



Image Attachment: 1.png (2009-2-26 11:45, 950 bytes) / Download count 389
http://bbs.cnpack.org/attachment.php?aid=591


Author: zjy    Time: 2009-2-26 21:18     Subject: 又增加了一个新事件

procedure TForm1.OnGetItemText(Sender: TObject; AOption: TCnOptionItem;
  var AText: string);
begin
  if SameText(TCnOptionItem(AOption).PropName, 'Password') then
    AText := '******';
end;

实际使用时事件处理代码可根据需要来调整,用 Pos 当然也是可以的,Demo 中只是一个示例。

用这个事件除了可以处理密码,还可以用来为某些属性定制特殊的显示内容,比如日期格式、浮点数格式格式等。

PS: 之所以用增加事件的方法来解决这些问题,主要是这一类的需求可能很多,事件用起来虽然比较麻烦,但可以灵活控制。
Author: 雨中雪    Time: 2009-2-27 21:54

刚才做了一下测试,发现还有问题:


在程序创建后密码还是以明文显示,编辑后或获得焦点离开后,密码才以*号显示。
Author: zjy    Time: 2009-2-28 11:09     Subject: 可能跟事件定义顺序有关

如果你是动态关联事件的话,应该先关联事件,再设置Options属性。
Author: 雨中雪    Time: 2009-2-28 11:38

还想问一下, OnCreateInplaceEdit和OnGetItemText在Events列表中怎么没有呀
Author: zjy    Time: 2009-2-28 12:33     Subject: 如果已经安装过cnpack控件包

需要重新编译安装一次才会有。
Author: 雨中雪    Time: 2009-3-2 08:42

谢谢管理员




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0