CnPack Forum » CnVCL 组件包 » 关于CnOptionGroup字符为密码时,该如何隐藏字符


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

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

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

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

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

2009-2-21 11:04 Passion
组件包本身不具有这个功能,需要自行修改代码以实现它。

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;
    {* 关联对象属性密码掩码 }


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

[[i] 本帖最后由 雨中雪 于 2009-2-22 13:17 编辑 [/i]]

2009-2-25 22:05 zjy
代码已更新

请从 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 程序。

2009-2-26 10:52 雨中雪
CVS登录不上,说用户名和密码不正确

2009-2-26 11:06 Passion
请问是否参考了此贴?
[url]http://bbs.cnpack.org/viewthread.php?tid=1882&extra=page%3D1[/url]

如果是按里头做的,烦请贴出出错信息看看?

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就是密码输入框,就以*显示文本内容。

[[i] 本帖最后由 雨中雪 于 2009-2-26 14:02 编辑 [/i]]

2009-2-26 11:45 雨中雪
我刚才作了以下测试:发现以下问题:

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

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

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

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

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

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

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

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

2009-2-27 21:54 雨中雪
刚才做了一下测试,发现还有问题:


在程序创建后密码还是以明文显示,编辑后或获得焦点离开后,密码才以*号显示。

2009-2-28 11:09 zjy
可能跟事件定义顺序有关

如果你是动态关联事件的话,应该先关联事件,再设置Options属性。

2009-2-28 11:38 雨中雪
还想问一下, OnCreateInplaceEdit和OnGetItemText在Events列表中怎么没有呀

2009-2-28 12:33 zjy
如果已经安装过cnpack控件包

需要重新编译安装一次才会有。

2009-3-2 08:42 雨中雪
谢谢管理员

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.