继承TCustomEdit制作一个密码输入框!可是遇到这样的难题(100分)

  • 主题发起人 主题发起人 魏启明
  • 开始时间 开始时间

魏启明

Unregistered / Unconfirmed
GUEST, unregistred user!
我做这个控件的目的是为了防止一些密码查看程序;
思路如下:
拦截键盘消息在(procedure KeyPress(var Key: Char); override;)中
将真正输入的内容存入一个字符串变量(password属性)中;
而后把键值赋为‘*’保存在text属性中,

现在难题是当输入退格键时,怎样也把password 的字符也做删除
考虑到字符插入点的处理,还要考虑(左,右方向键)
处理起来会相当复杂,
[red]但是text属性本身是如何实现这个功能的呢。[/red]
 
当输入退格时
Edit框有一个SelStart属性可以判断光标位置
SelLength可以判断选中字符数

在你存放实际密码的字符串中再作相应动作
 
对,sellength,selstart,但是处理起来相当麻烦
要考虑很多
 
这个问题其实我自己已经找到解决方法了,思路与你们(上面二位)的相同
但是,[red]我想:也许windows有一些系统方法可以调用吧,比如消息,api什么的
或者有自动实现这个功能的事件[/red]
(可能性很大,因为我在delphi源码中没找到
对键盘事件的详细处理)

我的处理方法如下:(请指正)
procedure TPassWordInput.KeyPress(var Key: Char);
var
MSelStart,MSelLength:integer;
begin
inherited KeyPress(Key);
MSelStart:=SelStart;
MSelLength:=SelLength;
if key=#8 then
begin
if MSelLength > 0 then
Delete(FPassWord,MSelStart+1,MSelLength)
else
Delete(FPassWord,MSelStart,1);
end
else
if (key>#31)and(key<#127) then
begin
if MSelLength > 0 then
Delete(FPassWord,MSelStart+1,MSelLength);
Insert(key, FPassWord, MSelStart+1);
Key:='?';
end;
end;

procedure TPassWordInput.KeyDown(var Key: Word; Shift: TShiftState);
var
MSelStart,MSelLength:integer;
begin
inherited KeyDown(Key, Shift);
MSelStart:=SelStart;
MSelLength:=SelLength;
if key=VK_DELETE then
begin
if MSelLength > 0 then
Delete(FPassWord,MSelStart+1,MSelLength)
else
Delete(FPassWord,MSelStart+1,1);
end;
end;

 
如果只是为了为了防止一些密码查看程序
处理wm_gettext消息就可以了呀
 
Edit本身使用操作系统自带的功能来实现的。
SendMessage(Edit1.Handle, EM_SETPASSWORDCHAR, Ord('*'), 0);
Edit1.SetTextBuf(PChar(Text));//通知Edit重画
 
sorry!
多日未上站。
我的意思是delphi怎样把键盘输入放进edit.text中的呢?
 
SKy2008兄说的简明洁了,其他都是废话,魏兄你的思路错啦!
 
呵呵,就自己做吧,一个小小的行编辑程序嘛,
用个特殊链表---栈。(不要想郭靖一样,有九阴真经缺不回用)。
 
对,自己写一个栈类.将用户的非系统键全部换成'*'.对几个系统键如ENTER,BACKSPACE则采用
系统DEFAULT处理.
 
接受答案了.
 
后退
顶部