Delphi关于函数后边跟上(Sender:TObject)的用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi关于函数后边跟上(Sender:TObject)的用法相关的知识,希望对你有一定的参考价值。
procedure TForm_QueTail.DBGridEh1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumnEh;
State: TGridDrawState);
begin
if not (Sender as TDBGridEh).DataSource.DataSet.Active then Exit;
//隔行改变网格背景色:
if not Odd((Sender as TDBGridEh).DataSource.DataSet.RecNo) then begin
(Sender as TDBGridEh).Canvas.Font.Color := clBlack;
(Sender as TDBGridEh).Canvas.Brush.Color := RGB(249, 244, 245); //背景颜色1
end else begin
(Sender as TDBGridEh).Canvas.Font.Color := clBlack;
(Sender as TDBGridEh).Canvas.Brush.Color := clWhite; //背景颜色2
end;
if (Sender as TDBGridEh).SelectedRows.CurrentRowSelected then begin
(Sender as TDBGridEh).Canvas.Font.Color := clBlack;
(Sender as TDBGridEh).Canvas.Brush.Color := RGB(209, 234, 249); //选中背景色
end;
if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then begin
(Sender as TDBGridEh).Canvas.Font.Color := clWhite;
(Sender as TDBGridEh).Canvas.Brush.Color := $00E25A76;
end;
if ((Sender as TDBGridEh).DataSource.DataSet.FieldByName('reversal').Asinteger = 1) or
((Sender as TDBGridEh).DataSource.DataSet.FieldByName('rejcode').AsString <> '00') then
begin
(Sender as TDBGridEh).Canvas.Font.Color := clRed;
end
else
begin
if (Sender as TDBGridEh).DataSource.DataSet.FieldByName('voided').Asinteger = 1 then
begin
(Sender as TDBGridEh).Canvas.Font.Color := clBlue;
end
else
begin
(Sender as TDBGridEh).Canvas.Font.Color := clBlack;
end;
end;
// //状态不正常的商户红色显示
// if (Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('SUBMERSTATE').AsString),1,1)<>'1') and
// (Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('SUBMERSTATE').AsString),1,1)<>'2') and
// (Copy(Trim((Sender as TDBGridEh).DataSource.DataSet.FieldByName('SUBMERSTATE').AsString),1,1)<>'6')
// then
// (Sender as TDBGridEh).Canvas.Font.Color := clRed;
(Sender as TDBGridEh).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
比如上述代码中出现了很多Sender的地方,不知道怎么用,望高手指教!
Sender是一个TObject类型的参数,它告诉Delphi哪个控件接收这个事件并调用相应的处理过程。你可以编写一个单一的事件处理句柄,通过Sender参数和IF…THEN…语句或者CASE语句配合,来处理多个构件。发生事件的构件或控件的值已经赋给了Sender参数,该参数的用途之一就在于:可以使用保留字IS来测试Sender,以便找到调用这个事件处理句柄的构件或控件的类型。例如,将表单中编辑框和标签的Click事件的处理句柄都指向表单的xxx过程,编辑框和标签对Click事件有不同的反应:
procedure TForm1 xxx(Sender:TObject);
begin
if(sender is Tedit) then
showmessage(′this is a editbox′);
if(sender is Tlabel) then
showmessage(′this is a label′);
end;
Sender参数的第二个用途是结合AS操作符进行类型转换,将若干个派生于某一父类的子类强制转换成该父类。例如表单中有一个TEdit类控件和一个TMemo控件,它们实际上都派生于TcustomEdit类,如果你要为二者的某一事件提供同样处理,可以将二者事件句柄都指向自定义的过程yyy:
Procedure TForm1.yyy(Sender:TObject);
begin
(sender as TcustomEdit).text:=′This is some demo text′;
end;
在过程中,AS操作符将TEdit类和TMemo类均强制转换成TcustomEdit类,再对TcustomEdit类的属性赋值。注意这种转换必须符合Delphi中类的层次关系。
使用Sender参数可以通过单一过程段处理多类控件,真正体现了Delphi面向对象的重用性。 参考技术A sender指的是触发此事件的对象 参考技术B 1.Sender的定义:
每一个事件处理里面至少都有一个Sender参数。比如:
procedure TForm1.Button1Click(Sender:TObject);
begin
...
end;
Sender的含义就是代表调用TForm1.Button1Click这个过程的控件. 由于Sender是TObject,所以任何object都可以赋给Sender.
当你点击BUTTON1时,会产生一个Button1Click事件,系统会把Button1传递给Button1Click过程作为参数,也就是所说的Sender.
2.Sender的用法:
<1>.由于Sender代表了调用所在过程的控件,那么你就可以直接把它拿来当那个控件用,不过如果要用属性的话,最好写成(Sender as 控件名).控件属性:=... 例如:
procedure TForm1.Edit1Click(Sender: TObject);
begin
with Sender as TEdit do
begin
text:=’hello’;
end;
end;
<2>.如果在两个事件中处理同样的事情,那么可以利用Sender来省去重写同样的过程。例如:
Procedure TForm1.Button1Click(Sender:TObject);
begin
do same sth.....;
if Sender=Button1 then
do sth....;
if Sender=Button2 then
do other sth....;
end;
procedure TForm1.Button2Click(Sender:TOBJect);
begin
Button1Click(Button2);
end; 参考技术C 这个要从VCL的架构说起。控件的每个事件(event)基本都有一个指针来指向自身,方便注册这个事件的调用者访问自己。拿最常用的TButton的OnClick来说。 OnClick是继承自TControl里 FOnClick: TNotifyEvent; 来的。再看下TNotifyEvent的定义。
TNotifyEvent = procedure(Sender: TObject) of object;
再看看Click方法的代码:
procedure TControl.Click;
begin
Call OnClick if assigned and not equal to associated action's OnExecute.
If associated action's OnExecute assigned then call it, otherwise, call
OnClick.
if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
FOnClick(Self)
else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
ActionLink.Execute(Self)
else if Assigned(FOnClick) then
FOnClick(Self);
end;
从 FOnClick(Self); 可以知道实际的sender就是指控件自己了。知道这个你就可以在Button的点击事件这样来写:
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage((Sender as TButton).Name);
end;
你可以知道Sender as TButton就是Button1自己。
其他控件事件里的Sender都是同一道理,一般都是指向自己。至少所有标准的DELPHI是这样,第三方控件如果没重载过的那个事件方法的话应该也不会指向其他。因为这是DELPHI约定俗成的。
以上是关于Delphi关于函数后边跟上(Sender:TObject)的用法的主要内容,如果未能解决你的问题,请参考以下文章