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

BCB6產生MDI Project的疑問(關於ActionList)

答題得分者是:daldal
hipig
高階會員


發表:31
回覆:75
積分:111
註冊:2007-01-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-05-19 17:20:24 IP:140.126.xxx.xxx 未訂閱
BCB6中產生MDI介面最簡單的方式是直接new projects選MDI程式介面
而程式會建立一個簡單MDI範例
我有一個疑問
在MDI中子視窗排列方式有Tile(),Cascade(),ArrangeIcons()三種方式
但由BCB所產生的範例中發現他利用ActionList來作按鍵是否enter處理
可是我卻完全不懂他是如何做到的
以往我都是利用一堆程式碼來做到判斷使是否已可以讓這功能使用
但BCB6的MDI Project範例卻找不他是如何判斷視窗開啟了??
我甚至也找不到他程式中使用Tile(),Cascade(),ArrangeIcons()這三種方式的地方
那他是寫在哪呢???
還是我疏忽了
另外
請問有何書籍或範例文件詳細講解ActionList元件的使用方式
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-05-20 13:26:46 IP:220.130.xxx.xxx 未訂閱
ActionList的程式碼是實作在元件之中的(可以從Source\vcl\stdactns.pas查到)
當你把ActionList與元件的Action動作相關聯時,他內部就會去呼叫已經寫好的動作
以Tile為例,他實際上會去呼叫DoTile()的函式,DoTile再去呼叫WINAPI去讓所有MDI視窗排序
如下所示:
[code cpp]
if (Form.FormStyle = fsMDIForm) and (Form.ClientHandle <> 0) then
SendMessage(Form.ClientHandle, WM_MDITILE, TileParams[TileMode], 0);
[/code]

同理,你也可以把一個功能鍵的OnClick事件寫成如下,也會有相同的作用
[code cpp]
if (MainForm->FormStyle==fsMDIForm && MainForm->ClientHandle != NULL)
SendMessage(MainForm->ClientHandle, WM_MDITILE, TileMode, 0);
[/code]

差別只是在於,ActionList程式碼已經預先寫好包裝起來,你使用的時候只需要做關聯
而OnClick需要你自己實作

至於學習的話可以多看看Source裡面的程式碼
裡面可以發現當年開發Borland的人員所留下的一些精華所在喔
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-05-20 14:23:19 IP:203.75.xxx.xxx 未訂閱
亂入+1!

不好意思,再請問一下,原本的範例我並沒有看到WindowCascade1這個物件做了什麼動作的設定…
難不成全都包在stdactns.pas內嗎?

===================引 用 daldal 文 章===================
ActionList的程式碼是實作在元件之中的(可以從Source\vcl\stdactns.pas查到)
當你把ActionList與元件的Action動作相關聯時,他內部就會去呼叫已經寫好的動作
以Tile為例,他實際上會去呼叫DoTile()的函式,DoTile再去呼叫WINAPI去讓所有MDI視窗排序
如下所示:
[code cpp]
if (Form.FormStyle = fsMDIForm) and (Form.ClientHandle <> 0) then
SendMessage(Form.ClientHandle, WM_MDITILE, TileParams[TileMode], 0);
[/code]

同理,你也可以把一個功能鍵的OnClick事件寫成如下,也會有相同的作用
[code cpp]
if (MainForm->FormStyle==fsMDIForm && MainForm->ClientHandle != NULL)
SendMessage(MainForm->ClientHandle, WM_MDITILE, TileMode, 0);
[/code]

差別只是在於,ActionList程式碼已經預先寫好包裝起來,你使用的時候只需要做關聯
而OnClick需要你自己實作

至於學習的話可以多看看Source裡面的程式碼
裡面可以發現當年開發Borland的人員所留下的一些精華所在喔
hipig
高階會員


發表:31
回覆:75
積分:111
註冊:2007-01-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-05-20 15:58:46 IP:140.126.xxx.xxx 未訂閱
+1
我最主要的問題也是這個
因為MDI範例產生的程式碼非常簡易好懂
但我卻完全找不到他各功能連動所寫的程式碼在哪

這種問題我以前有遇過一次類似的
就是在一個按鈕內寫了功能
後來把這按鈕砍了程式碼也砍了
之後又新增一個按鈕...明明沒寫程式碼但卻有之前寫的功能
不信邪obj和tds都砍掉重編還是一樣
===================引 用 GrandRURU 文 章===================
亂入 1!

不好意思,再請問一下,原本的範例我並沒有看到WindowCascade1這個物件做了什麼動作的設定…
難不成全都包在stdactns.pas內嗎?
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-05-20 17:51:55 IP:220.130.xxx.xxx 未訂閱
一樣,也是在同一個檔案stdactns.pas
[code cpp]
{ TWindowCascade }

procedure TWindowCascade.ExecuteTarget(Target: TObject);
begin
GetForm(Target).Cascade;
end;

[/code]

等同於
[code cpp]
MainForm->Cascade();
[/code]
編輯記錄
daldal 重新編輯於 2008-05-20 17:52:16, 註解 無‧
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-05-20 18:01:47 IP:220.130.xxx.xxx 未訂閱

1
我最主要的問題也是這個
因為MDI範例產生的程式碼非常簡易好懂
但我卻完全找不到他各功能連動所寫的程式碼在哪
其實這個狀況你每天都在碰到,只是有些時候習以為常不覺得奇怪而已
例如你放Button的時候,你並不需要使用Canvas畫出Button本身
那是因為元件內部已經幫你畫好了,
所以你才可以很簡單的拖拉、改變Caption、屬性
元件內部會幫你完成這些工作

ActionList也是相同的道理,只是他不用你去設定
只要你選對BORLAND預先寫好的功能就好囉

但是缺點也是明顯的,你如果有特殊需求的話
例如Tile排列,但是下面要留空100Pixels
那就得自己動手做了

這種問題我以前有遇過一次類似的
就是在一個按鈕內寫了功能
後來把這按鈕砍了程式碼也砍了
之後又新增一個按鈕...明明沒寫程式碼但卻有之前寫的功能
不信邪obj和tds都砍掉重編還是一樣
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-05-20 18:04:28 IP:220.130.xxx.xxx 未訂閱

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

1
我最主要的問題也是這個
因為MDI範例產生的程式碼非常簡易好懂
但我卻完全找不到他各功能連動所寫的程式碼在哪
其實這個狀況你每天都在碰到,只是有些時候習以為常不覺得奇怪而已
例如你放Button的時候,你並不需要使用Canvas畫出Button本身
那是因為元件內部已經幫你畫好了,(早期要建立出一個漂亮的按鈕,要打的程式碼可是不少的)
所以你才可以很簡單的拖拉、改變Caption、屬性
元件內部會幫你完成這些工作

ActionList也是相同的道理,只是他不用你去設定
只要你選對BORLAND預先寫好的功能就好囉

但是缺點也是明顯的,你如果有特殊需求的話
例如Tile排列,但是下面要留空100Pixels
那就得自己動手做了

這種問題我以前有遇過一次類似的
就是在一個按鈕內寫了功能
後來把這按鈕砍了程式碼也砍了
之後又新增一個按鈕...明明沒寫程式碼但卻有之前寫的功能
不信邪obj和tds都砍掉重編還是一樣
系統時間:2024-03-29 0:28:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!