捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
模仿QQ的小键盘控件
关键字:小键盘,QQ,圆形密码
来 自:原创
平 台:Win2k/XP/NT,Win2003 下载所需:0 火柴
深浅度:中级 完成时间:2010/4/2
发布者:kazi21com 发布时间:2010/6/2
编辑器:D2007 语  种:简体中文
分 类:图形 下载浏览:2512/10110
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
图片如果打不开,说明流量不够了,请稍候下载……
模仿QQ的小键盘和圆形密码
1.新建一个窗体,用来放小键盘,设置窗体BorderStyle为BsNone,AutoSize为True
  窗体设置为自动创建,不要每次按小键盘按钮的时候动态创建一个然后释放,因为这个窗体
  有可能需要经常显示。

2.自定义一个消息 WM_PASSWORDADDCHAR = WM_USER + 100;
  在主界面上处理此消息
  Delphi(Pascal) code
  procedure TMainForm.WMPASSWORDADDCHAR(var Message: TMessage);
  begin
    PasswordEdit.Text := PasswordEdit.Text + '●';
  end;
  

3.声明3个全局变量
  Delphi(Pascal) code
  TruePassword: string;//用来存储真正的密码
  PasswordSelStart: Integer;//密码框中光标所处位置
  MouseOnKeyPad: Boolean; //鼠标是否在小键盘按钮上
  


4.在小键盘的OnKeyPadClick事件中加入以下代码
  Delphi(Pascal) code  
  procedure TKeyPadForm.MyKeypadKeyPadClick(var aChar: Char);
  begin
    //密码长度超过16 则发出警告然后退出
    if Length(TruePassword) >= 16 then begin
      MessageBeep(MB_OK); 
      Exit; end;
    //发送消息使密码框增加一个●
    PostMessage(Application.MainForm.Handle, WM_PASSWORDADDCHAR, 0, 0);
    //修改密码 achar为鼠标点击小键盘的字符
    Insert(aChar, TruePassword, PasswordSelStart + 1);
    //光标向前进一位
    PasswordSelStart := PasswordSelStart + 1;
    //随机改变小键盘上按键的顺序
    MyKeypad.RandomKeyPad;
  end;
  

5.小键盘按钮点击事件
  Delphi(Pascal) code
  procedure TMainForm.KeyPadBtnClick(Sender: TObject);
  var
    BtnPoint: TPoint;
  begin
    //判断小键盘窗体有无显示
    if not KeyPadForm.Showing then
    begin
      //计算小键盘窗体在屏幕上显示的坐标
      BtnPoint.X := KeyPadBtn.Left - 4;
      BtnPoint.Y := KeyPadBtn.Top + 17;
      BtnPoint := ClientToScreen(BtnPoint);
      KeyPadForm.Top := BtnPoint.Y;
      KeyPadForm.Left := BtnPoint.X;
      KeyPadForm.Show;
      //初始化光标位置
      PasswordSelStart := PasswordEdit.SelStart;
     end else KeyPadForm.Hide;
  end;
  

6.主窗体被激活的时候需要隐藏小键盘
  Delphi(Pascal) code
  procedure TMainForm.FormActivate(Sender: TObject);
  begin
    //防止小键盘显示不正确 
    //因为有可能主窗体激活事件和小键盘按钮点击事件接连发生
    if MouseOnKeyPad then Exit;
    if KeyPadForm.Showing then KeyPadForm.Hide;
  end;

  procedure TMainForm.KeyPadBtnMouseEnter(Sender: TObject);
  begin
    MouseOnKeyPad := True;
  end;

  procedure TMainForm.KeyPadBtnMouseLeave(Sender: TObject);
  begin
    MouseOnKeyPad := False;
  end; 
  

7.现在小键盘可以使用了,但是密码框还是不行
  Delphi(Pascal) code
  procedure TMainForm.PasswordEditKeyPress(Sender: TObject; var Key: Char);
  begin
    case Ord(Key) of
      8: DeletePasswordStr;//是BackSpace键的话就删除选中的字符
      13: BtnClick;//是回车的话就点击按钮
    //如果字符被允许则增加
    else if IsAllowedPasswordChar(Key) then AddPasswordChar(Key);
    end;
    Key := Chr(0);
  end;

  procedure TMainForm.DeletePasswordStr;
  var
    SelStart: Integer;
    SelLength: Integer;
  begin
    SelStart := PasswordEdit.SelStart;
    SelLength := PasswordEdit.SelLength;
    //删除TruePassword对应字符串
    if SelLength <> 0 then
      Delete(TruePassword, SelStart + 1, SelLength)
    else if SelStart <> 0 then
    Delete(TruePassword, SelStart, 1) else MessageBeep(MB_OK);
    //同步TruePassword长度与密码框中●的个数
    PasswordEdit.Text := CreatePasswordStrByCount(Length(TruePassword));
    if SelLength <> 0 then PasswordEdit.SelStart := SelStart else
    PasswordEdit.SelStart := SelStart - 1;
  end;

  procedure TMainForm.AddPasswordChar(const aChar: Char);
  var
    SelStart: Integer;
    SelLength: Integer;
  begin
    SelStart := PasswordEdit.SelStart;
    SelLength := PasswordEdit.SelLength;
   
    if SelLength <> 0 then
      Delete(TruePassword, SelStart + 1, SelLength)
    else if Length(TruePassword) = 16 then begin
    MessageBeep(MB_OK); Exit; end;
    Insert(aChar, TruePassword, SelStart + 1);
    //同步TruePassword长度与密码框中●的个数
    PasswordEdit.Text := CreatePasswordStrByCount(Length(TruePassword)); ;
    PasswordEdit.SelStart := SelStart + 1;
  end;

  function CreatePasswordStrByCount(aPasswordCharCount: Integer): string;
  var
    i: Integer;
  begin
    Result := '';
    for I := 0 to aPasswordCharCount - 1 do
      Result := Result + '●';
  end;
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论6条 当前显示最后6条评论
wwwwwwwwww 2010/6/3 9:06:27
下来试试了
lovezyp 2010/6/4 18:20:44
非常感谢无私奉献
sox 2010/6/11 7:50:15
thx~
liugaohui 2010/6/13 22:06:03
谢谢,试试
ching125 2012/4/8 12:58:41
很不错   多谢分享
xgy9999 2012/5/24 23:17:00
下了运行不了呀。
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 1999-2012 V3.01 沪ICP备05001939号 更新RSS列表