全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1634
推到 Plurk!
推到 Facebook!

TNotifyEventVCL不太了解!物件是搞出來了,請求給予指引!

答題得分者是:pgdennis
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-30 02:11:16 IP:220.134.xxx.xxx 訂閱

TNotifyEventVCL不太了解!物件是搞出來了,請求給予指引!

程式碼的目的:
=======================
程式中我使用一個TEdit物件和TSpeedButton物件,想做出使用者在輸入時,若不知道要輸入的項目可以按下
跟在TEXTBOX旁的BUTTON可以帶出執行使用本物件的form的程式碼,然後開啟程式碼中所指定的form查詢視窗,目前我動作是可以做到,不過呢?我自己卻不
太了解TNotifyEvent這個物件或者說指標的概念!想求甚解,請各位前輩指導!

物件的類別設定:
=======================
我的問題是,當我執行複合物件中的OnButtonClick去觸發FButtonClick,而 FButtonClick中 if Assigned(FButtonClick) then FButtonClick(Sender);
FButtonClick(Sender),這個意思是觸發read FButtonClick write FButtonClicK,我一直搞不懂意思(雖然實際可以正確動作!)

我的問題是
=======================
一般我們設定vcl的property時,意思是property所指定的屬性有Get或SET時,我們會去執行vcl類別中property所read或write的欄位,
概念上在屬性時property我可以接受並了解,但是換成在指定vcl物件的Events時,我卻搞不清楚了,因為觸發的情況,事由Read 或Write所指定的
procedure property OnButtonClick: TNotifyEvent read FButtonClick write FButtonClick; 反過來執行OnButtonClick這一點,讓我很疑惑,
也不知道怎麼以概念上,物件的執行順序去說明,作是做出來了,但是實際上是亂Try出來的,讓自己很心虛,想求教各位前輩,不知道有無說明
TNotifyEvent這個概念的書籍或資料?


謝謝各位前輩!
unit YaoEdit_PAS;

interface
uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, DBCtrls, Dialogs,Buttons;

type
YaoEdit = class(TWinControl)
private
{ Private declarations }
FEdit: TEdit;
FButton: TSpeedButton;
FButtonClick: TNotifyEvent;
procedure FFButtonClick(Sender: TObject);

protected
{ Protected declarations }

public
{ Public declarations }
constructor Create(Aowner: TComponent); override;
destructor Destroy; override;

published
{ Published declarations }
property OnButtonClick: TNotifyEvent read FButtonClick write FButtonClick;
end;

procedure Register;

implementation

constructor YaoEdit.Create(AOwner: TComponent); // 建構子、建立物件初始狀態
begin
inherited Create(AOwner);
FEdit := TEdit.Create(Self);
FEdit.parent := Self;
FEdit.width := 80;
FEdit.Height := 20;

FButton := TSpeedButton.Create(Self);
FButton.parent := Self;
FButton.width := 20;
FButton.Height := FEdit.Height;
FButton.Left := FEdit.Left FEdit.width;
FButton.OnClick :=FFButtonClick;
end;

destructor YaoEdit.Destroy;
begin
FEdit.Free;
FButton.Free;
inherited Destroy;
end;

procedure Register;
begin
RegisterComponents('YAOS', [YaoEdit]);
end;

procedure YaoEdit.FFButtonClick(Sender: TObject);
begin
if Assigned(FButtonClick) then FButtonClick(Sender);
end;

end.

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-31 16:06:45 IP:218.163.xxx.xxx 未訂閱

程式碼裡面程序首先檢查使用者有否設定FbuttonClick去設定()對應下面的處理程序

procedure TForm1.Button1Click(Sender: TObject);

begin

何謂FButtonClick(Sender)為何?

OnButt FbuttTnotifyEvent=procedure(Sender: TObject) of object;

<!--[if !supportEmptyParas]--> <!--[endif]-->

,這個意思是觸發read FButtonClick write FButtonClicKFButtonClick(Sender)是指執行他所對應的函式

<!--[if !supportEmptyParas]--> <!--[endif]-->

的意思是propertyreadwritefieldfunctionprocedure
------
星期一,二...無窮迴圈@@
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-09-01 01:38:46 IP:61.229.xxx.xxx 未訂閱

你好,很久沒寫Delphi程式了,不過一直有用BCB我想應該可以提供一些想法給你。

沒錯,問題在於你不了解指標,其次是有些些不了解property的意義。
對於你說「但是實際上是亂Try出來的,讓自己很心虛」這話,我感到很不錯,有這樣的想法就有很大的進步空間。加油!接下來講主題了…

指標的問題一時無法講的很透徹,若你在看完後還有問題,就請在post上來,或是email讓我知道。
指標這種變數放的是記憶體的位址,與其他變數放的是整數、字元等有些不同。
函式指標變數,這是你這個問題的重點。所謂函式指標變數就是一個存放著某函式的位址的變數。因為這個變數它記載著某個函式的位址,那稍後就可以利用這個變數來呼叫所記的函式。簡單的想就是把「函式指標」當成是一種特別的變數,裡面放的是某函式的位址。
TNotifyEvent 就是函式指標的型別。所以你你宣告
FButtonClick: TNotifyEvent; //這句話就是說…FButtonClick這個變數裡面將放著某函式的位址
我用個簡單的例子說明一下用途:
fn_var: TNotifyEvent; // 宣告 fn_var 這變數是一種放函式位址的變數 (函式指標)
procedure abc //這是個abc程序
begin
.....
abc = 123;
end
fn_var := abc //將abc這個程序的位址設定給fn_var
接下來當我們寫
i := abc // i的結果是123
i := fn_var // i 還是123 ,怪怪的? 怎麼變數指給變數,這就是函式指標的用途了。它相當於某函式的別名。
所以,接下來你要呼叫abc的地方,全可以用fn_var來代替!

property foo: type read Fbar write Fbar 這句話的意思是,當我們使用foo這個屬性時,當要設值給foo時,就觸發把值設定給Fbar (即把值write進Fbar裡); 相反的若是你用foo這個屬性來讀資料時,就會觸發去把Fbar的值取出來(即去read FBar的值出來用),那麼…
property OnButtonClick: TNotifyEvent read FButtonClick write FButtonClick;
//上面的意思是,當使用者用了OnButtonClick這個屬性來設定值時,就會把值設定給FButtonClick這個「函式指標」;
所以,當我們用
YaoEdit .OnButtonClick = abc // 把abc這個程序的位址設給FButtonClick,這時候FButtonClick就是abc的別名函式了
j := FButtonClick //這行就變得很有意思了,就是指執行abc,所以 j = 123
這回應你的這行程式碼:
if Assigned(FButtonClick) then FButtonClick(Sender); //如果FButtonClick是有值的(有放某函式的位址),那麼就請執行它(執行誰? 看FButtonClick放誰的位址就執行誰啊…比如說放的是abc的位址,就是執行abc)

同樣的,你的程式中迂迴的再使用同樣的觀念…
FButton.OnClick :=FFButtonClick; //這是說把FFButtonClick這個程序的位址放入OnClick這個屬性裡…於是當有click事件來的時候,就會依你指定的這個程序來跑…
procedure YaoEdit.FFButtonClick(Sender: TObject);
begin
if Assigned(FButtonClick) then FButtonClick(Sender);
end;
間接的又問FButtonClick是否有被使用者設定了,若是有,就請執行它指定的那程序來跑…

寫完,也寫了不少吧…希望對你有幫助。還有,有個小請求…最近站內的人在得到別人的答覆後,都沒有回應,這是很不好的,所以希望你無論是否有幫助,都請回應一下,謝謝喔!

蕭沖
qs.xiao@gmail.com
http://aftcast.blogspot.com/

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-09-01 04:19:58 IP:220.134.xxx.xxx 訂閱

自己寫程式很久了,用Delphi也一段時間,但是都用剪下、貼上,最近使用vcl元件的開發方式,才領悟到物件開發的好處,感覺自己原來做的都是剪下、貼上的苦力工作,也有一段時間,到處try新的開發工具,但現在才知道,到處聽哪個工具好與不好,其實對自己的幫助是很少的,停下腳步來看看自己手上的工具到底了解多少,才能知道哪個工具適合你,現在Delphi書籍越來越少,而且Delphi書籍越舊的書籍,好像講的叫為深入,自己現在正努力的前進。

謝謝兩位前輩給予指引,我會try後,再請教前輩。

真是太感謝了!Delphi.ktop討論區真是人情味很濃厚的地方。

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-09-01 11:28:00 IP:218.163.xxx.xxx 未訂閱
=..=看你帳號..恩..你是逢X研究所畢業的?



我也是..嘿嘿
------
星期一,二...無窮迴圈@@
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-09-01 18:16:16 IP:61.229.xxx.xxx 未訂閱

謝謝你的回應! 沒錯,真的是愈舊的書愈深入,我家中的Delphi2程式發展手冊(1)與(2),寫的超詳細深入的!
以前是松格出版的,應該是絕了吧…我當年是從delphi2版開始使用的。
它其實是翻譯書。

真的覺得國內的資訊書寫的很差,不是國外月亮圓,而是真的夠差的。都是在講最基本的,好像除了基本的別的都不會講(或是根本不會講,還是留一手?)。

又像我過去學BCB,真是辛苦啊,書更是少。大概是非主流吧。不過我超喜歡它的,因為真的開發很有效率,而且c的資源很多。要學BCB的人本身要對C/C 熟,又要對Delphi有一定程度的了解,最好也是熟。這樣才可以把這個混血兒搞定,發揮它C的特長,加上VCL帶來的效能。

嘿~~一講又離主題了。對了,我建議你若是英文不錯,看英文的書比較能深入。有二本ebook我一直收藏著。
SAMS Boldand Delphi 6 Developers Guide (這應該是我上面說的delphi2同系列的書)
Sybex - Mastering Delphi 7

看完應該功力增長幾倍吧?!

===================引 用 文 章===================

而且Delphi書籍越舊的書籍,好像講的叫為深入,自己現在正努力的前進。

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-09-02 03:38:51 IP:220.134.xxx.xxx 訂閱

pgdennis前輩,我是雲科大畢業的,不過很高興能跟您認識,也感謝您的回應!

aftcast 前輩,我逛過你的http://aftcast.blogspot.com/網頁,依我初淺分析,aftcast 前輩
一定是bcb的高手,據我所之,bcb很多撰寫低階程式的程式設計師,都會使用,而我雖然學過
tc/broland C 都是專科的時候,學校所用的,實務上得應用很少,感覺aftcast前輩您,在網頁上
寫了不少重要的參考資料,希望我自己也有能力,來作這樣的事情!與您看齊!

最近我一直在ktop上詢問,vcl撰寫的問題,其實是想寫一個複合的元件,關於資料庫表單的,雖然
可能別人已經作過,不過自己動手,那種感覺真的差異很大,以前總是習慣,拿別人的程式碼來改,
看到自己撰寫的vcl元件,在元件配置盤上那種感動真是跟吸毒一樣,每天都想看看有無可以改進的地方,
我夢想著自己的元件,能簡化以前用vb和Delphi剪下貼上撰寫法,現在完成完成度越來越高,希望自己對
Delphi的了解也越來越多。

而 Delphi2程式發展手冊(1)我剛好也有買一本,記得n年前,自己就想學好Delphi但是一直看不懂,
現在回首,真是一回首又過n年後,不過自己總覺得,晚知道總比不知道好,看著發黃書籍的範例,自己才知道
,原來寶貝都在自己身旁(不過也忘記那時候為啥會買這一本書籍了),這幾天也在拍賣網站上找相關的書籍,
看是否可以買到,不過我想到一個更棒的方法,準備找一些認識的朋友到台大和交大的圖書館,借出有用的技術手冊
,然後作一份備份吧! 說實在Delphi7我有買原版,原文書籍有附上幾本,不講的案例比較少自己也開始詳細的看了
裡面,好書難找,我只是一直想一個問題Borland 一直想推自己的開發工具,為啥不贊助Ktop還有一些書籍,現在
書局書櫃上,滿滿一堆VS的入門手冊,我都在想,找以前的舊書,改幾個案例,講詳細深入和不同角度去說明,
我都願意去買,像最近 想買的就是李維 的Inside VCL - VCL 架構剖析,我覺得現在的書籍,講了太多的語法,
與太多的top-down應用面的範例,而以物件導向和分析觀點去開發程式的書籍相對的少,我覺得真是太可惜了,
Borland真是太不會行銷與使用族群的培養了! 真的覺得可惜!


不過好在有ktop平台,可以互動的討論,真是讓人內心感覺到無比的人情味!Ktop我幾乎每天都會上來逛逛,
除了回答一些基礎的問題,也問一些自己不懂的問題,或許這就是將心比心吧!
感謝別人的回答,也期待別人的協助,因為這種持續的感動,也讓ktop存在著驚人的寶藏!

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
系統時間:2024-05-11 17:15:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!