線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1492
推到 Plurk!
推到 Facebook!

當 Form 用繼承的寫法, 要在繼承關係加一層該如何處理?

答題得分者是:change.jian
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-08 10:29:08 IP:211.22.xxx.xxx 未訂閱
原本寫 Form 的繼承做法如下:
TFormBase = class(TForm)    TForm1 = class(TFormBase)
TForm2 = class(TFormBase)
.
.
.
TForm9 = class(TFormBase)
如今寫了很多發現還有大部份的 TForm 有很多共同的程式碼可以在拆一層變成:
TFormBase = class(TForm)
TFormLevel2 = class(TFormBase)    TForm1 = class(TFormBase)
TForm2 = class(TFormBase)
TForm3 = class(TFormLevel2)
.
TForm7 = class(TFormLevel2)
TForm8 = class(TFormLevel2)
TForm9 = class(TFormLevel2)
本來想說只需要將所有要改變的 Form 程式碼部份例如 TForm3 = class(TFormBase) 改為 TForm3 = class(TFormLevel2) 重新編譯即可但事與願違. 改完重新編譯依舊是繼承 TFormBase, 就算是把 Uses 的 TFormBase 拿掉手動加入 TFormLevel2, 編譯後 Delphi 還是會自動加入 TFormBase 來編譯. 造成全部都要重新一點一點的複製貼上的人工處理. 這樣就會增加程式碼出錯的機會. 不知道該如何處理才可以避免這種問題. 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-08 10:46:09 IP:61.222.xxx.xxx 未訂閱
除了修改 .PAS 中的定義外。 也要修改 .DFM 中的定義。這樣就可以改成您要繼承的來源。
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-08 11:07:14 IP:61.218.xxx.xxx 未訂閱
hi,bestlong: 原則上,如果你要修改繼承的物件,如原來由TFormBase繼承下來,改成由TFormLevel2繼承下來,那麼依你所述的改法在Object Pascal是完全正確的. 我自己試了一下,也完全可行.可否把你的code po上來看看
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-08 14:19:17 IP:211.22.xxx.xxx 未訂閱
結果 Delphi 關掉重開就可以了, 不過原來的第二層移轉繼承到第三層的Form, 就會自動加入 Uses 原來的第一層. 但是新建立的卻不會 我的建立程序如下: 1. 建立 TFormBase 繼承 TForm, 將 FormBase 設定成 Available Form 2. 建立 TForm1 繼承 TFormBase 執行, 此時 TForm1 的 Uses 會有 FormBase 3. 建立 TFormBaseLevel2 繼承 TFormBase 將 FormBaseLevel2 設定成 Available Form 4. 修改 TForm1 的程式 將 Uses 的 FormBase 拿掉, 然後改 TfmForm1 = class(TFormBase) 成為 TfmForm1 = class(TFormBaseLevel2) 執行, 此時 TForm1 的 Uses 會有 FormBaseLevel2, FormBase. 5. 建立 TForm2 繼承 TFormBaseLevel2 將 Form1 設定成 Available Form 執行, 此時 TForm2 的 Uses 只有 FormBaseLevel2 目前覺得奇怪的就是 TForm1 為何會一值自動補上原先繼承的 TFormBase. 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-08 14:42:12 IP:61.218.xxx.xxx 未訂閱
我猜應該是在.dpr裡的宣告順序.我試著將宣告順序對調,把後面的form調到前面,確實會有這樣的情形.但奇怪,將dpr整個關掉(不關掉Delphi),然後再重新叫出來後,這個情形就消失了.    我在猜,應該是Delphi的code inside的bug吧,因為你把原來的TForm3應該從TFormBase改成TFormLevel2繼承,所以導致IDE反應不過來,所以整個project關掉後重新就可以了.    
引言: 結果 Delphi 關掉重開就可以了, 不過原來的第二層移轉繼承到第三層的Form, 就會自動加入 Uses 原來的第一層. 但是新建立的卻不會 我的建立程序如下: 1. 建立 TFormBase 繼承 TForm, 將 FormBase 設定成 Available Form 2. 建立 TForm1 繼承 TFormBase 執行, 此時 TForm1 的 Uses 會有 FormBase 3. 建立 TFormBaseLevel2 繼承 TFormBase 將 FormBaseLevel2 設定成 Available Form 4. 修改 TForm1 的程式 將 Uses 的 FormBase 拿掉, 然後改 TfmForm1 = class(TFormBase) 成為 TfmForm1 = class(TFormBaseLevel2) 執行, 此時 TForm1 的 Uses 會有 FormBaseLevel2, FormBase. 5. 建立 TForm2 繼承 TFormBaseLevel2 將 Form1 設定成 Available Form 執行, 此時 TForm2 的 Uses 只有 FormBaseLevel2 目前覺得奇怪的就是 TForm1 為何會一值自動補上原先繼承的 TFormBase. 我是雪龍
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-09 16:32:00 IP:211.22.xxx.xxx 未訂閱
我是使用 Delphi6 現在碰到另一個奇怪的狀況, 第一層(FormStyle:=fsNormal)有 OnActivate 與 OnDeActivate 兩個 Method 然後在第二層(FormStyle:=fsMDIChild)與第三層都沒有撰寫相關的 Method , 不過第三層執行時切換不同MDIChild視窗卻不會執行到. 後來刻意在第二層做出空程式碼如下: procedure Tfm_Level02.FormActivate(Sender: TObject); begin inherited; // end; 再執行,才真的會執行到第一層的程式. 不過 DeActivate 還是一樣沒執行. 連作重新啟動 Delphi , 刪除所有 *.dcu 以及 Compile All Project 或 Build All Project 都沒有用. 就是一定要建立如上程式才會正常. 我也重新寫一次較簡單的程式就沒有這個問題. 所以也無法判定是哪裡出了問題. 不知道是否有人也碰過此種狀況. 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-09 16:38:44 IP:211.22.xxx.xxx 未訂閱
另一個現象
引言: procedure Tfm_Level02.FormActivate(Sender: TObject); begin inherited; // end;
加入這一段程式後, 一旦執行正常之後再移除掉. 程式也是一樣正常執行. 碰到這樣的經歷, 讓我有些不信任 Delphi 的編譯機制. 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-09 20:08:56 IP:61.59.xxx.xxx 未訂閱
引言: 加入這一段程式後, 一旦執行正常之後再移除掉. 程式也是一樣正常執行. 碰到這樣的經歷, 讓我有些不信任 Delphi 的編譯機制.
經過一番的努力與思考, 想到 Delphi 本身在 Project 的編譯方面有調整設定的功能, 因為在剛學 Delphi 的時候曾經發生有部份程式一直都不會執行到, 當時也是花了我一段很長的時間找原因, 原來是 Delphi 編譯最佳化的演算法所導致的問題, 或許應該稱為結果. 所以我就把功能表 Project > Options > Compiler > Code generation > Optimization 的選項關掉. 重新執行果然解決. 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-09 20:53:23 IP:61.31.xxx.xxx 未訂閱
inherited; 的定義為繼承使用父系的方法。 如果捨去 inherited 將導致父系若有寫一些程式碼,將會跳過不處理。 當然 Delphi 有時候,也會呆呆的凸搥。 通常我會將 Delphi 關閉後再重開後 Rebuild Project,確保安全。
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-09 22:06:33 IP:218.169.xxx.xxx 未訂閱
我知道Delphi在編譯時的Optimization功能,但導致繼承機會出問題我倒是第一次遇到    
引言:
引言: 加入這一段程式後, 一旦執行正常之後再移除掉. 程式也是一樣正常執行. 碰到這樣的經歷, 讓我有些不信任 Delphi 的編譯機制.
經過一番的努力與思考, 想到 Delphi 本身在 Project 的編譯方面有調整設定的功能, 因為在剛學 Delphi 的時候曾經發生有部份程式一直都不會執行到, 當時也是花了我一段很長的時間找原因, 原來是 Delphi 編譯最佳化的演算法所導致的問題, 或許應該稱為結果. 所以我就把功能表 Project > Options > Compiler > Code generation > Optimization 的選項關掉. 重新執行果然解決. 我是雪龍
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-09 22:52:12 IP:61.59.xxx.xxx 未訂閱
引言: inherited; 的定義為繼承使用父系的方法。 如果捨去 inherited 將導致父系若有寫一些程式碼,將會跳過不處理。 當然 Delphi 有時候,也會呆呆的凸搥。 通常我會將 Delphi 關閉後再重開後 Rebuild Project,確保安全。
您說的沒錯, 但是我的是中間層及使用者介面都沒有該 Method 程式碼都寫在最高父系, 所有繼承的子系連續好幾層都沒有再加寫, 所以就我對繼承的觀念上來說父系的一定會執行, 這是預設狀態, 除非我在任一層寫了同樣的 Method 並且拿掉 inheried 才會打斷關係. 我想可能是因為我所處理的程式碼本來是完全沒有採用繼承的方式撰寫(前人種錯樹)有百來支程式, 維護的困難度就不用說了所以只好改版, 初期整理時發現結構很亂所以只先加了一層父系然後陸續移轉程式, 到了一個規模後發現可以再加幾層並做好分類, 又再重新處理程式碼一次, 子系有一大堆程式碼, 然後視狀況調整父系結構, 造成 Delphi 在啟用最佳化功能做編譯時誤判成不需要(有點像拋棄繼承...). 造成新增在父系的程式碼有些部份怎麼寫都不會被執行到(有設中斷點). 現在我直接把 Delphi 預設啟用 Optimization 的功能取消以免再度發生此種狀況. 我是雪龍
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
系統時間:2024-07-02 12:51:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!