Delphi 中的屬性property(適合初學delphi)

來源:互聯網
上載者:User
  Delphi  中的屬性property(適合初學delphi) Propery In Delphi

 

前言:

適合delphi初學者,有物件導向知識和java或者vc編程經驗人士閱讀。 一普通屬性

我們在delphi的類中常常能看到這樣的代碼:propert property 屬性名稱 類型名 read 字串1 write 字串2

這裡屬性的名字可能不同。都是這樣的格式:property 屬性名稱 read 字串1 write 字串2

我以property Left: Integer read FLeft write SetLeft;為例子,它是Tcontrol的屬性,你可以在controls檔案中找到。Left是一個Integer類型的屬性。Read申明了訪問該變數要訪問的變數或者方法,write申明了修改該變數時訪問的變數或者方法。注意:可以是變數,也可以是方法,我在後面告訴大家這是怎麼回事。這裡它是一個變數,名字叫做FLeft。出於封裝的目的,我們一般都會把這樣的變數放在private中間去,果然,在private中我們可以找到

FLeft: Integer這段代碼(出於命名的習慣,我們把這樣的變數取名為屬性名稱前面加一個大寫的F)。這樣當你read該屬性時,實際上你訪問的是Fleft的值。所以你可以寫些方法來修改fleft,間接修改了left的值。然後我們再看SetLeft,這裡它是一個方法(問我怎麼知道。還是看命名規則,通常用屬性名稱前面加上Set),通常也會放在private中去,我們來驗證一下,我們在private中看到申明:

procedure SetLeft(Value: Integer);

和如下代碼實現:

procedure TControl.SetLeft(Value: Integer);

begin

  SetBounds(Value, FTop, FWidth, FHeight);

  Include(FScalingFlags, sfLeft);

end;

如果你寫了如下代碼改變left:control1.left:=23,那麼程式調用了函數SetLeft(23),SetBounds是改變地區的函數,這裡你就明白了它封裝了的好處,每次你改變left時它就會根據新的left而改變地區的大小,這個函數同時也改變了Fleft的大小,請查閱SetBounds的原始碼。

procedure TControl.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);

begin

  if CheckNewSize(AWidth, AHeight) and

    ((ALeft <> FLeft) or (ATop <> FTop) or

    (AWidth <> FWidth) or (AHeight <> FHeight)) then

  begin

    InvalidateControl(Visible, False);

    FLeft := ALeft;

    FTop := ATop;

    FWidth := AWidth;

    FHeight := AHeight;

    UpdateAnchorRules;

    Invalidate;

    Perform(WM_WINDOWPOSCHANGED, 0, 0);

    RequestAlign;

    if not (csLoading in ComponentState) then Resize;

  end;

end;

這樣外部就看起來只是通過賦值運算來改變了該屬性的值。Read和write可以是變數,或者是函數,取決於你的設計。你當然可以這樣寫: propert property 屬性名稱 類型名 read 變數1 write 變數2。變數1和變數2可以是相同的。你也可以這樣propert property 屬性名稱 類型名 read 方法1 write 方法2。任你組合。但是有2點要注意:

1.         命名規則最好按習慣來,易於閱讀。

2.         如果是變數,那麼類型要和屬性的類型一致,如果是方法,那麼入口參數要和屬性的類型一致。

二事件屬性Tevent

我們常常使用組件的事件屬性,比方說click事件,可是我們很難從表面看出它是如何調用的呢,如何觸發的呢。下面我來給你解答。

我們在屬性管理員object inspector中看到event頁onclick右邊對應了一個方法的名字。我們其實可以這樣給一個組件的事件對應上一個出來方法。以一個form為例子Form1. OnMouseDown:=‘你的方法‘。注意方法的入口參數有講究,這裡是(Sender:TObject)

我們還是一tcontrol為例子,我們找到這段代碼:

property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;跟上面講的類似,不過這裡有個特殊的類型,TNOtifyEvent,是個事件類型,我們找到它的申明:

TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer) of object;

可以看到,它其實就是個函數,但是藍色部分把入口參數限定了。那麼我們通過賦值Form1. OnMouseDown:=‘你的方法‘,就對應了OnMouseDown的方法。然後我們只要寫了一段攔截滑鼠訊息的函數,在裡面直接或間接調用FonMouseDown,那麼就把訊息和處理函數對應上去了。這裡它間接調用的層數比較多,講起來比較費時間,涉及到Message類型,建議大家去看下李維的書。

以下附上間接調用過程,其實還要很多訊息發生時也間接調用了,就不一一舉出來了:(

 

procedure WMRButtonDblClk(var Message: TWMRButtonDblClk); message WM_RBUTTONDBLCLK;//攔截訊息的函數

procedure TControl.WMRButtonDblClk(var Message: TWMRButtonDblClk);

begin

  inherited;

  DoMouseDown(Message, mbRight, [ssDouble]);

end;

 

procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton;

Shift: TShiftState);

procedure TControl.DoMouseDown(var Message: TWMMouse; Button: TMouseButton;

  Shift: TShiftState);

begin

  if not (csNoStdEvents in ControlStyle) then

    with Message do

      if (Width > 32768) or (Height > 32768) then

        with CalcCursorPos do

          MouseDown(Button, KeysToShiftState(Keys) + Shift, X, Y)

      else

        MouseDown(Button, KeysToShiftState(Keys) + Shift, Message.XPos, Message.YPos);

end;

 

procedure MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); dynamic;

procedure TControl.MouseDown(Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

begin

  if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);

end;

 

好處:

如果你多寫自己的類,你會發現這樣做是多麼的方便,而不會像java要寫getleft,setleft,然後把text放在private中,訪問和修改時要調用不同的方法,而delphi你都只是調用contol1.text來訪問,control1.text:=’某字串’來修改它的值。

而在處理訊息方面,基類把onclick,onmousedown這樣的屬性申明為protected,如果你要使用,可以申明為published就可以出現在object inspector裡面,然後方便的寫處理方法,你也可以不公開,而在ctreate函數中給它賦值,而不用像java那樣,寫listener那麼複雜。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.