關於 Delphi 中的Sender和易混淆的概念(轉)

///////////////////////////////////////////////////////

Delphi 中Sender對象的定義
/////////////////////////////////////////////////////
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; 函數

sender什麼做用?測試

大多數DELPHI 書都回避對sender的詳細解釋,即便有說明也簡單一帶而過。sender什麼做用?真的很神祕嗎?

我認爲潭浩強寫的計算機語言書最通俗易懂。
如今計算機書氾濫成災,通俗易懂的精品不多。書是語言的文字,既然是
語言就要通俗易懂!尤爲是計算機方面的書,先進技術概念和詞彙多來自西方,因爲文化不一樣咱們認爲很難理解的詞在西方國家可能就很通俗。
可咱們不少編譯者根本沒有西方語言環境基礎,對一些新概念、名詞很茫然或者乾脆直譯,形成一本本晦澀詞語滿篇的「新書」,讓讀者費了好多時間仍是滿頭「霧水」。你沒有西方語言環境基礎也不怕,你經過消化理解、實驗、總結後用你的母語(中國話)來寫書呀!幹嗎整那麼多晦澀的詞呀?好比:使能、本徵等等。。。
   新名詞直譯也能夠,就看成一個符號,關鍵是先用漢語解釋清楚呀。世界上歷來就沒有什麼高難的概念和詞語,只有語言表達是否簡明易懂。this

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面向對象的重用性。 設計

就表示發送的那個對像,能夠對發送對象和函數操做的 orm

Sender--意義:指本對象。Sender在什麼對象相關代碼裏,那麼Sender就是什麼。對象

Self--意義:指本類,也就是Self被引用的類。好比若在類TMyClass內引用了Self,那麼Self=TMyClass.繼承

Owner--意義:哪一個對象釋放個人內存啊?事件

如:Pan:=TPanel.Create(Self);其中Create的參數是:AOwner:TComponent。Owner釋放Pan的內存。由於窗口釋放Pan的內存,但窗口類的對象是Self.通常給Owner傳Self就能夠。內存

好比:

代碼段一:

pan:=TPanel.Create(Self);

with Pan do begin

try

Left:=20;

Top:=20;

parent:=Self; //Parent:=Form1也能夠。

Visible:=true;

ShowMessage('Created');

finally

Pan.free;

end;

end;

-----------------------------------------------------

Parent--意義:此對象包括在哪一個對象裏那?

說明:若組件不是從TControl繼承來的,那麼在建立組件後沒必要聲明此屬性。

////////////////////////////////////////////////////////////////////////////

 

Delphi中易混淆的概念
////////////////////////////////////////////////////////////////////////////
  1、Owner和Parent的區別:
  Parent屬性是指構件的包容器,構件只能在此範圍內顯示和移動。舉例子以下:
  (1)在Form1的窗體上,放一個Panel1,並將Panel1拉大,
  (2)在Panel1上放一Button1;
  (3)在Form1上放一Button2。
  如今若是移動Panel1,則Button1隨着Panel1移動,這是由於Button1的Parent是Panel1。如今將Button2移到Panel1上,再次移動Panel1,Button2並不跟着移動,這是由於Button2的Parent是Form1。除在窗體設計中,應注意構件的Parent是誰外,在動態建立構件時,也應指出構件的Parent,如在上例中繼續操做:
  1)Procedure Tform1.Button2click(Sender:Tobjet);
  2)Var
  3) Button:Tbutton;
  4) Begin
  5) Button:Tbutton.cerate(self);
  6) Button.parent=panel1;
  7) Button.lleft=0;
  8) Button.top=0;
  9) Button.caption:='OK';
  10) End;
  當按Button2時,將在Panel1上建立一個Button,而若是把第6句改成Button.parent:=self;按Button2時,將在Form1上建立一個Button了。若是將第6句刪除,按Button2時,什麼都不會發生,這是由於建立方法沒法知道應在哪裏顯示構件。
  Owner屬性是指構件的全部者,它負責構件的建立和釋放。如在上例中,系統默認窗體上全部構件的全部者是窗體,而窗體的全部者是Application。順便指出,create方法應帶有表示構件全部者的參數,如在上例中,構件全部者是窗體,即self。
  Parent屬性和Owner屬性是運行階段的屬性,只能在運行階段,經過代碼設置。  

2、Self和Sender的區別:

      一個能被共用的事件處理過程,經過Sender 參數的指向, 來肯定這個過程屬於那個組件。

  在事件處理程序參數表中,至少含有一個參數Sender,它表明觸發事件處理程序的構件,如在上例中,Sender就指Button2,有了Sender參數,可使多個構件共用相同的事件處理程序,以下例:
  Procedure Tform1.Buttonclick(Sender:Tobject);
  Begin
  If sender=button1 then
  Label1.caption:=′看庭前花開花落
′   Else Label2.caption:=′望天上雲捲雲舒′
  End;
 在此例中,Button1,Button2共用了Buttonclick事件處理程序。

       一個事件處理過程可被多個組件的不一樣事件共同響應,能夠經過事件處理過程的Sender參數來肯定消息來源。       舉例:       Button1和Button2的Onclike事件能夠都指向Button1Click,則能夠有如下用法:       procedure     TForm1.Button1Click(Sender:TObject)       begin           if     (Sender=Button1)     then                   ............           if     (Sender=Button2)     then                   ............       end;     Self是指所編的程序範圍是在哪個類中,Delphi中大都在窗體範圍內編程,所以,self即指窗體,若是在編寫一個類或是一個組件,則self指該類或組件。咱們在函數或過程的聲明中可看出self是表明哪一個組件,即self表明‘.’號以前的組件,如在第一個例子中,self表明Tform1。另外應注意,self只能用在類方法中,而不能用在過程或函數中,以下例用法是錯的:Function a1(B:Integer):Integer;  Begin  ……  Button:=tbutton.create(self);……  End;  3、Clientheight和Height,Clientwidth和Width的區別:  對於通常的構件而言,Height就是Clientheight,Width就是Clientwidth,而對於窗體而言,Height是包括標題條在內的高度,而Clientheight是指窗體工做區的高度。同理,Clientwidth是指定窗體工做區的寬度。  從上面陳述可知,理解Ower和Parent,Self和Sender,Clientheight和Height,Clientwidth和Width區別,對於Delphi中正確編程是重要的。

相關文章
相關標籤/搜索