国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

delphi的屬性property和消息處理特點(diǎn)事件屬性

2019-11-18 18:07:37
字體:
供稿:網(wǎng)友
 

Delphi  中的屬性PRoperty(適合初學(xué)delphi

Propery In Delphi

 

前言:

適合delphi初學(xué)者,有面向?qū)ο笾R(shí)和java或者vc編程經(jīng)驗(yàn)人士閱讀。

一普通屬性

我們?cè)?/SPAN>delphi的類中常常能看到這樣的代碼:propert property 屬性名 類型名 read 字符串1 write 字符串2

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

我以property Left: Integer read FLeft write SetLeft;為例子,它是Tcontrol的屬性,你可以在controls文件中找到。Left是一個(gè)Integer類型的屬性。Read申明了訪問該變量要訪問的變量或者方法,write申明了修改該變量時(shí)訪問的變量或者方法。注意:可以是變量,也可以是方法,我在后面告訴大家這是怎么回事。這里它是一個(gè)變量,名字叫做FLeft。出于封裝的目的,我們一般都會(huì)把這樣的變量放在private中間去,果然,在private中我們可以找到

FLeft: Integer這段代碼(出于命名的習(xí)慣,我們把這樣的變量取名為屬性名前面加一個(gè)大寫的F)。這樣當(dāng)你read該屬性時(shí),實(shí)際上你訪問的是Fleft的值。所以你可以寫些方法來修改fleft,間接修改了left的值。然后我們?cè)倏?/SPAN>SetLeft,這里它是一個(gè)方法(問我怎么知道?還是看命名規(guī)則,通常用屬性名前面加上Set),通常也會(huì)放在private中去,我們來驗(yàn)證一下,我們?cè)?/SPAN>private中看到申明:

procedure SetLeft(Value: Integer);

和如下代碼實(shí)現(xiàn):

procedure TControl.SetLeft(Value: Integer);

begin

  SetBounds(Value, FTop, FWidth, FHeight);

  Include(FScalingFlags, sfLeft);

end;

如果你寫了如下代碼改變leftcontrol1.left:=23,那么程序調(diào)用了函數(shù)SetLeft(23),SetBounds是改變區(qū)域的函數(shù),這里你就明白了它封裝了的好處,每次你改變left時(shí)它就會(huì)根據(jù)新的left而改變區(qū)域的大小,這個(gè)函數(shù)同時(shí)也改變了Fleft的大小,請(qǐng)查閱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;

這樣外部就看起來只是通過賦值運(yùn)算來改變了該屬性的值。Readwrite可以是變量,或者是函數(shù),取決于你的設(shè)計(jì)。你當(dāng)然可以這樣寫: propert property 屬性名 類型名 read 變量1 write 變量2變量1和變量2可以是相同的。你也可以這樣propert property 屬性名 類型名 read 方法1 write 方法2任你組合。但是有2點(diǎn)要注意:

1.         命名規(guī)則最好按習(xí)慣來,易于閱讀。

2.         如果是變量,那么類型要和屬性的類型一致,如果是方法,那么入口參數(shù)要和屬性的類型一致。

二事件屬性Tevent

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

我們?cè)趯傩怨芾砥?/SPAN>object inspector中看到eventonclick右邊對(duì)應(yīng)了一個(gè)方法的名字。我們其實(shí)可以這樣給一個(gè)組件的事件對(duì)應(yīng)上一個(gè)出來方法。以一個(gè)form為例子Form1. OnMouseDown:=‘你的方法‘。注意方法的入口參數(shù)有講究,這里是(SenderTObject

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

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

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

可以看到,它其實(shí)就是個(gè)函數(shù),但是藍(lán)色部分把入口參數(shù)限定了。那么我們通過賦值Form1. OnMouseDown:=‘你的方法‘,就對(duì)應(yīng)了OnMouseDown的方法。然后我們只要寫了一段攔截鼠標(biāo)消息的函數(shù),在里面直接或間接調(diào)用FonMouseDown,那么就把消息和處理函數(shù)對(duì)應(yīng)上去了。這里它間接調(diào)用的層數(shù)比較多,講起來比較費(fèi)時(shí)間,涉及到Message類型,建議大家去看下李維的書。

以下附上間接調(diào)用過程,其實(shí)還要很多消息發(fā)生時(shí)也間接調(diào)用了,就不一一舉出來了:(

 

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

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;

 

好處:

如果你多寫自己的類,你會(huì)發(fā)現(xiàn)這樣做是多么的方便,而不會(huì)像java要寫getleftsetleft,然后把text放在private中,訪問和修改時(shí)要調(diào)用不同的方法,而delphi你都只是調(diào)用contol1.text來訪問,control1.text:=’某字符串來修改它的值。

而在處理消息方面,基類把onclickonmousedown這樣的屬性申明為protected,如果你要使用,可以申明為published就可以出現(xiàn)在object inspector里面,然后方便的寫處理方法,你也可以不公開,而在ctreate函數(shù)中給它賦值,而不用像java那樣,寫listener那么復(fù)雜。

我的研究也不深,有什么不妥請(qǐng)指正:)。歡迎來信wenjunwu430@163.com


上一篇:DELPHI高精度計(jì)時(shí)方法

下一篇:Delphi程序設(shè)計(jì)綜合訓(xùn)練任務(wù)書

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 凌海市| 郸城县| 新宁县| 鄄城县| 上栗县| 夏河县| 绍兴县| 巴彦淖尔市| 柯坪县| 芷江| 沐川县| 海阳市| 改则县| 四子王旗| 砚山县| 隆子县| 布拖县| 息烽县| 开平市| 东山县| 九江县| 玛沁县| 太谷县| 吉林市| 贵州省| 高平市| 神木县| 彰武县| 广饶县| 金阳县| 溧阳市| 黑山县| 军事| 屏山县| 峨边| 凤翔县| 武功县| 邢台市| 资溪县| 于田县| 巴林左旗|