为何从TCustomEdit继承后,重新定义 Text属性后,读取不到text的值了?(200)

  • 主题发起人 主题发起人 delhpi
  • 开始时间 开始时间
D

delhpi

Unregistered / Unconfirmed
GUEST, unregistred user!
unit SafeEdit;interfaceuses { SysUtils,} Classes,{Controls,} StdCtrls,Messages;type TSafeEdit = class(TCustomEdit) private { Private declarations } FRealText: string; procedure SetText(const value: string); protected { Protected declarations } public { Public declarations } procedure WMGETTEXT(var message: TWMGetText); message WM_GETTEXT; published { Published declarations } property Text: string read FRealText write SetText; property PassWordChar; property OnKeyDown; property TabOrder; end;procedure Register;implementationprocedure Register;begin RegisterComponents('Samples', [TSafeEdit]);end;{ TSafeEdit }procedure TSafeEdit.SetText(const value: string);begin if FRealText <> Value then SetTextBuf(PChar(Value));end;procedure TSafeEdit.WMGETTEXT(var message: TWMGetText);begin inherited; FRealText := message.Text; message.Text := ''; message.TextMax := 1; message.Result := 0;end;end.===========procedure TForm1.Button1Click(Sender: TObject);begin showmessage(SafeEdit1.Text);end;
 
property Text: string read FRealText write SetText;[red]override;[/red]
 
procedure TSafeEdit.WMGETTEXT(var message: TWMGetText); 感觉没用~!
 
property Text: string read FRealText write SetText ; override ;[Pascal Error] SafeEdit.pas(25): E2169 Field definition not allowed after methods or properties
 
procedure TSafeEdit.WMGETTEXT(var message: TWMGetText); 感觉没用~! 这个是想禁止 发消息来获得TEXT的内容,因为这个是密码输入EDIT。
 
不好意思搞错了,属性不可以override;感觉你重新定义text,不如你覆盖SetSelText方法~~
 
属性覆盖的形式 就是直接 写完整的同名的属性定义,不要那个override的。过程和函数需要override。SetSelText这个好像是私有的方法,怎么覆盖? procedure SetSelText(const Value: string);
 
重载WM_SETTEXT不会啊
 
public procedure SetSelText(const Value: string);
 
重载WM_SETTEXT WM_GETTEXT两个消息,祝你好运啊:我写一下吧:),这中方法也不是安全的,替换消息过程等等方法来获取:)use ..,Windows, SysUtils private { Private declarations } insidedo: Boolean; protected { Protected declarations } function ReadTxt(): string; procedure writeTxt(value: string); public { Public declarations } procedure WMGETTEXT(var message: TMessage); message WM_GETTEXT; procedure WMSETTEXT(var message: TMessage); message WM_SETTEXT; published property Text: string read ReadTxt write writeTxt;//--------------------------------------------------------function TSafeEdit.ReadTxt: string;var buf: PChar;begin insidedo := True; buf := GetMemory(256); SendMessage(self.Handle, WM_GETTEXT, 256, Integer(buf)); Result := buf; FreeMemory(buf); insidedo := False;end;procedure TSafeEdit.WMGETTEXT(var message: TMessage);begin if not insidedo then begin //TODO end else begin inherited; end;end;procedure TSafeEdit.WMSETTEXT(var message: TMessage);begin if not insidedo then begin //TODO end else begin inherited; end;end;procedure TSafeEdit.writeTxt(value: string);var buf: PChar;begin insidedo := True; buf := GetMemory(256); StrPCopy(buf, value); SendMessage(self.Handle, WM_SETTEXT, 0, Integer(buf)); FreeMemory(buf); insidedo := False;end;//-----------------------------------------------------------procedure TForm1.Button1Click(Sender: TObject);begin ShowMessage(SafeEdit1.Text);end;procedure TForm1.Button2Click(Sender: TObject);begin SafeEdit1.Text := 'ahaha';end;
 
其实我就是想 把TEDIT修改一下,因为直接作为密码框的话,不安全,只要发个消息就能看到实际的值了,虽然表面上都是*。根据WINAPI,获得一个窗口的Text属性是使用GetWindowText()函数,而GetWindowText()函数又是通过向目标窗口句柄发送WM_GETTEXT消息而获得Text属性的。所以想继承了,重新修改一下。实现自己代码能正常读写Text的值,但是通过发消息的方法不能显示text的值。
 
Dstorm的代码,似乎可以实现自己代码能正常读写Text的值,但是通过发消息的方法不能显示text的值。
 
动一下脑筋啊,变一下,自定一个消息来获取啊!~要想安全,建议你自己画~
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=403703一开始看到的是这个帖子,复制了代码,做成了组件,修改了程序,结果发现没法读取text值。现在仔细想了一下,TEdit的Text属性不是一般的属性,虽然他的类型是简单的string,但他实际并不对应一个私有的字段。不能声明一个私有的字段FRealtext,并直接作为text的读方法。那个帖子里的写方法似乎也不对。procedure TSafeEdit.SetText(const value: string);begin if FRealText <> Value then SetTextBuf(PChar(Value));//这样并没有把新的值写入到FRealText中。end;==========Dstorm说的自定义消息和自画能否再指教一下,我再开一200分贴感谢。我现在只能看懂别人的代码,想尽量学习一下。
 
参考Dstorm的代码,和TControl的GetText和SetText代码,我修改成如下,组件安装后测试,好像实现了我需要的效果 。你的思路很简单,虽然没有用到什么高深的技巧。增加一个变量,就可以区分自己和外部的情况了。unit SafeEdit;interfaceuses { SysUtils,} Classes,{Controls,} StdCtrls,Messages;type TSafeEdit = class(TCustomEdit) private { Private declarations } InsideDo: Boolean; procedure SetText(const value: string); function GetText():String; protected { Protected declarations } public { Public declarations } procedure WMGETTEXT(var message: TWMGetText); message WM_GETTEXT; procedure WM_SETTEXT(var message: TWMSetText); message WM_SETTEXT; published { Published declarations } property Text: string read GetText write SetText; property PassWordChar; property OnKeyDown; property TabOrder; end;procedure Register;implementationprocedure Register;begin RegisterComponents('Samples', [TSafeEdit]);end;{ TSafeEdit }function TSafeEdit.GetText: String;var Len: Integer;begin InsideDo := True; Len := GetTextLen; SetString(Result, PChar(nil), Len); if Len <> 0 then GetTextBuf(Pointer(Result), Len + 1); InsideDo := False;end;procedure TSafeEdit.SetText(const value: string);begin InsideDo := True; if GetText <> Value then SetTextBuf(PChar(Value)); InsideDo := False;end;procedure TSafeEdit.WMGETTEXT(var message: TWMGetText);begin if InsideDo then inherited;end;procedure TSafeEdit.WM_SETTEXT(var message: TWMSetText);begin if InsideDo then inherited;end;end.
 
这样是不安全的,人家知道消息值,照样获取~!const WM_SAFEGETTEXT = WM_USER + 1001;procedure WM_SAFEGETTEXT(var message: TMessage); message WM_SAFEGETTEXT;procedure TSafeEdit.WM_SAFEGETTEXT(var message: TMessage);var str: string;begin str := GetText(); CopyMemory(Pointer(message.lparam), Pchar(str), message.wparam);end;好的安全的解决方案,一种是directUI,你取查查资料吧!祝你好运!
 
谢谢,自画就算了,难度太高。
 

Similar threads

I
回复
0
查看
633
import
I
I
回复
0
查看
527
import
I
I
回复
0
查看
504
import
I
I
回复
0
查看
728
import
I
I
回复
0
查看
759
import
I
后退
顶部