edit星号密码防止查看器查看的问题(50)

  • 主题发起人 主题发起人 tungh
  • 开始时间 开始时间
T

tungh

Unregistered / Unconfirmed
GUEST, unregistred user!
请教。。unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Label2: TLabel; edt1: TEdit; Edit2: TEdit; Button2: TButton; procedure FormShow(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; aEdit: TEdit;implementation{$R *.dfm} Tmyedit= class(TEdit) public procedure wmGettext(var mes: TMessage);message wm_gettext; end;procedure TForm1.FormCreate(Sender: TObject);//var //aEdit: TEdit;begin aEdit:= Tmyedit.Create(Self); with aEdit do begin PasswordChar:= '*'; Left:= 60; //宽 top:= 100; //高 Name:= 'myedit'; Parent:= self; Visible:= true; end;end;{ Tmyedit }procedure Tmyedit.wmGettext(var mes: TMessage);begin //inherited; //加上这句就能获得密码了 //ShowMessage('想偷密码?想其他办法吧!');end;procedure TForm1.FormShow(Sender: TObject);begin aEdit.Text := (XML1.PassWord);//用这个的话,写入XML的时候就不正确 例如明明输入的是123456789 但是XML里却显示!? //edt1.Text := (XML1.PassWord);//只要用这个就正常,end;procedure TForm1.Button2Click(Sender: TObject);begin if not XML1.SetParameter('PassWord',aEdit.Text) then MessageDlg('修改配置文件错误!',mtCustom,[mbOk],0);end;end.或者其他什么方式能处理这个星号查看的问题,有例子更好
 
<delphi深度历险>这本书中好像有这方面的代码!
 
看看delphi是如何处理edit.text的,跟踪发现是在tcontrol中处理的,function TControl.GetText: TCaption;var Len: Integer;begin Len := GetTextLen; SetString(Result, PChar(nil), Len); if Len <> 0 then GetTextBuf(Pointer(Result), Len + 1);end;function TControl.GetTextBuf(Buffer: PChar; BufSize: Integer): Integer;begin Result := Perform(WM_GETTEXT, BufSize, Longint(Buffer));end;你把WM_GETTEXT消息给屏蔽掉了,这里就会导致不能正确返回数值了。
 
单纯的设置属性只能使显示的内容变成*号,但是别人像你的EDIT发送一个WM_GETTEXT消息就可以知道你这个EDIT里的真实值了,要做到安全,还必须重载WM_GETTEXT消息处理函数unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;type PassEdit=Class(Tedit) private Display:Boolean; procedure WMGetText(var Message: TMessage); message WM_GETTEXT; end;implementation{$R *.dfm}varEditTest:PassEdit;{ myedit }procedure PassEdit.WMGetText(var Message: TMessage);begin if Display then inherited;end;procedure TForm1.Button1Click(Sender: TObject);begin EditTest:=PassEdit.Create(nil); EditTest.Parent:=self; EditTest.PasswordChar:='*';end;procedure TForm1.Button2Click(Sender: TObject);Var GetText:Array[0..255] of Char;begin if EditTest = nil then Exit; GetText:='';// Setlength(GetText,16); {向我们的PassEdit发送消息看是否能取得PassEdit中的值} SendMessage(EditTest.Handle,WM_GETTEXT,255,Integer(@GetText)); ShowMessage(String(GetText)); ShowMessage(EditTest.Text); //测试能否直接取得text值 {第一次测试结束 由以上测试,可以知道,现在我们自己也无法得到Text值了 为了处理上面的问题,所以我们给我们的PassEdit加入了一个新参数Display 下面的方法就可以取得PassEdit中的值了} EditTest.Display:=True; SendMessage(EditTest.Handle,WM_GETTEXT,255,Integer(@GetText)); //通过发送消息取值 ShowMessage(String(GetText)); ShowMessage(EditTest.Text); //测试能否直接取得text值 EditTest.Display:=False;end;end.
 
好方法!另有位高人教我,通过下面方式,不必动态创建edit。type TEdit= class(StdCtrls.TEdit) public FDisplay:Boolean; procedure WMGetText(var Message: TMessage); message WM_GETTEXT; end; TForm1 = class(TForm) Button1: TButton; DBGrid1: TDBGrid; SaveDialog1: TSaveDialog; Table1: TTable; DataSource1: TDataSource; Edit1: TEdit; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;这样界面上的Edit就变成了你的tedit类了。
 
Vsun的方法可行。但是还是一样写入XML的数据会变成!? <Config Name="PassWord" Parameter="?@"/>edit里输入的是123456点确定保存后XML里就变成这个了,在不用上面的方法的时候却正常的。
 
自己用别的变量去记住 输入的字符, 等你要写入到 xml 时, 就写入那个变量的值~~`不明白你要干嘛?~~, 界面上搞的这么复杂, 却又用 xml 保存起来~~~~
 
接受答案
 
后退
顶部