我能不能监控各种的OnChange事件?详情请进!(100分)

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

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
我要在一些控件的OnChange事件中加入一个函数,但我不想在每一个控件的OnChange中写入。
我想程序自动判断是不是在OnChange事件中。如何办到,我想可能要用到消息判断,无奈
对之不太熟悉。
我想要实现的功能:
1.监控到OnChange事件,并针对不同的控件是否需要运行那个函数。(70分)
2.函数中要将当前控件的值改变,但该控件可能是TEdit,TComboBox,TDBEdit,TDBComboBox等
等,我怎么来改变这个值,我不想用Sender is TEdit then TEdit(Sender).Text的方法,我
想直接判断属性而直接修改,因为上在四个都有Text属性,只写一个即可。(30分)+100分
我还有100分在另一个类似问题中。
谢谢高手解答!
 
关注此问题,誰有好办法,请解答。
因为TEDIT和Tcombobox不属于同一个基类,即
TEdit的向上的基类为TCustomEdit
TCombobox的向上基类为TCustomCombobox
所以,可能只用判断了。
if (sender is TCustomEdit) then caption:='edit';
if (Sender is TCustomComboBox) then caption:='box';
 
//使用RTTI设对象Text属性:
procedure SetCtlText(o:TObject; t:String);
var
p: PPropInfo;
begin
if not assigned(o) then exit;
p := GetPropInfo(o.ClassInfo,'Text');
if p=nil then
p := GetPropInfo(o.ClassInfo,'Caption');
if p<>nil then
if p^.PropType^.Kind = tkLString then
SetStrProp(o,p,t);
end;

使用时须uses TypInfo;
 
axcom,谢谢你的回答,但你的方法对DBEdit和DBComboBox无效,你能回答这是怎么回事吗?
对Edit和ComboBox是没有问题的。但我不愿用(Sender is TDBEdit)这个方法来,我想知道
为什么GetPropInfo取不到DBEdit的Text属性。
 
可能DBEdit中的Text非静态的原因吧。
 
查了一下DBComboBox1的类,就会发现
DBComboBox1的text属性是public类型,而Tedit的text属性是属于published的,
这就是为什么GetPropInfo无法获得的原因。
不找不到解决方法,继续关注。。。

 
o, 如果想改控件的text属性那应当比较简单的。
只要强制转换控件为TWinControl类然后给它的handle发wm_settext消息即可
 
Pearl.,问题是我要知道这个控件是否有Text属性呀。
 
没有RTTI信息没戏,你不可能知道这个对象到底有没有TEXT属性.
 
procedure SetCtlText(o:TObject; t:String);
begin
try
TWinControl(o).perform(wm_SETText,0,integer(@t[1]));
except
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SetCtlText(dbedit1,'999999');
SetCtlText(edit1,'999999');
end;
 
后退
顶部