史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   VB中的MDIForm的問題 (http://forum.slime.com.tw/thread165331.html)

劍痞憶秋年 2006-01-08 02:26 AM

VB中的MDIForm的問題
 
<1>不知道為什麼在有 PopMenu的 MDIChild 表單一出現...
MDIForm上的Menu就會不見!!有沒有可能讓兩者並存!!

<2>功能表編輯如下
A
...A1
...A2
B
...B1
...B2

有沒有辦法得知 A1 是 屬於 A 階層下,而 B2 是屬於 B 階層下??
(PS:最好是不要以名稱來判斷,目前雖然是採取這樣的命名方式,
  但若是以後也要這樣命名是有點小麻煩的事)

mini 2006-01-08 10:32 AM

首先1 裡提到的 PopMenu 不知是用什麼方式做出來的

至於2 不知什麼情況下有必要知道
"A1 是 屬於 A 階層下"
每一個選項都是獨立功能,不解為何須知道 "A1 是否來至於 A下階層"
原本的命名方式本身就是良好的方式

mnuFile
....mnuFileNew
....mnuFileOpen
mnuEdit
....mnuEditCut
....mnuEditPaste

當 mnuEditPaste 程式碼出現時很容易了解是出至於 mnuEdit
先按了 mnuEdit 再選 mnuEditPaste

劍痞憶秋年 2006-01-08 11:08 AM

引用:

作者: mini
首先1 裡提到的 PopMenu 不知是用什麼方式做出來的

至於2 不知什麼情況下有必要知道
"A1 是 屬於 A 階層下"
每一個選項都是獨立功能,不解為何須知道 "A1 是否來至於 A下階層"
原本的命名方式本身就是良好的方式

謝謝 mini 版主的回覆!!
一、第一個問題
小弟的 PopMenu 是由 MDIChild(子表單)中 按滑鼠右鍵 功能表編輯器
程式碼則是 PopupMenu xxxxx(xxxxx 是要顯示的 功能表的名稱)
這樣做出來的下列 <1>及<2>兩種方式,結果均會出現同樣的問題!
<1>
mnu_PopUp ===> 不顯示
...mnu_A ==> 顯示
......mnu_A_1 ==> 顯示
......mnu_A_2 ==> 顯示
...mnu_B ==> 顯示
......mnu_B_1 ==> 顯示
......mnu_B_2 ==> 顯示

<2>
...mnu_A ===> 不顯示
......mnu_A_1 ==> 顯示
......mnu_A_2 ==> 顯示
...mnu_B ===> 不顯示
......mnu_B_1 ==> 顯示
......mnu_B_2 ==> 顯示

二、第二個問題
小弟是因為要(依登入的使用者)控制功能表的變換顯示
才想要知道的,因為若是 A 階層下有顯示,那附屬在 A 功能表的子功能就不能全部不顯示,因為 MDI 不允許顯示中的功能表沒有子功能表,所以小弟就在每個 階層中 增加一個
Empty,當 A 顯示中,且下層的功能表都不顯示時,則 顯示 Empty
A
...A1
...A2
...Empty

mini 2006-01-09 01:46 PM

想模擬寫出您的程式
但真慚愧 沒什麼MDIForm經驗...

如可以的話貼出完整的程式碼
大家一起來看看有何好方式

劍痞憶秋年 2006-01-09 11:53 PM

引用:

作者: mini
想模擬寫出您的程式
但真慚愧 沒什麼MDIForm經驗...

如可以的話貼出完整的程式碼
大家一起來看看有何好方式

唉呀呀,不要這麼說囉,版主客氣了!!有勞 版主 及 各位高手幫忙了!!

劣者現在剩下這個問題,而第二個問題就依 mini 版主所回答的命名方式處理!!
<1>不知道為什麼在有 PopMenu 的 MDIChild 表單一出現...
MDIForm上的Menu就會不見!!有沒有可能讓兩者並存!!
(拍寫之前寫錯了,
把”有 PopMenu 的 MDIChild 表單”(正確)
寫成 ”MDIChild 的 PopMenu ”(錯誤)

劣者把它分成四篇把完整程式碼貼出(其實也不是真正的,是 Sample 而己,真正的程式碼太多了,太亂了!)

<1> MDIForm

第2 ∼ 4篇則是 MDIChild Form
<2>Form1 ==> 沒有內含 功能表(PopupMenu) ==> 執行結果正常
<3>Form2 ==> 有 內含 功能表(PopupMenu) ==> 執行結果異常
<4>Form3 ==> 有 內含 功能表(PopupMenu) ==> 執行結果異常

<2>
只對屬性做了二個設定
MdiFormChild = True
WindowState = 2

<3><4>都同 <2> ,只是比 <2>多了 功能表
(<3>,<4>的功能表 有點小差異,差異則是如下)

Form2

快選功能表
...刪除
......刪除單筆
......刪除全部

Form3

刪除
...刪除單筆
...刪除全部


<<MDIForm.frm>>

VERSION 5.00
Begin VB.MDIForm MDIForm1
BackColor = &H8000000C&
Caption = "MDIForm1"
ClientHeight = 3195
ClientLeft = 165
ClientTop = 735
ClientWidth = 4680
LinkTopic = "MDIForm1"
StartUpPosition = 3 '系統預設值
WindowState = 2 '最大化
Begin VB.Menu mnu_X_1
Caption = "[ 權限管理 ]"
Begin VB.Menu mnu_1_1
Caption = "沒有Popupmenu"
End
Begin VB.Menu mnu_1_2
Caption = "Popupmenu1"
End
Begin VB.Menu mnu_1_3
Caption = "Popupmenu2"
End
Begin VB.Menu mnu_Project_Manage_UserDataCreate
Caption = "使用者 基本資料建立"
Visible = 0 'False
End
Begin VB.Menu mnu_Project_Manage_GroupDataCreate
Caption = "群組 基本資料建立"
Visible = 0 'False
End
End
End
Attribute VB_Name = "MDIForm1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Sub mnu_1_1_Click()
Form1.Show
End Sub

Private Sub mnu_1_2_Click()
Form2.Show
End Sub

Private Sub mnu_1_3_Click()
Form3.Show
End Sub

劍痞憶秋年 2006-01-09 11:56 PM

<<Form1>>

VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 3195
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
LinkTopic = "Form1"
MDIChild = -1 'True
ScaleHeight = 3195
ScaleWidth = 4680
WindowState = 2 '最大化
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

劍痞憶秋年 2006-01-10 12:03 AM

<<Form2>>

VERSION 5.00
Begin VB.Form Form2
Caption = "Form2"
ClientHeight = 3195
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
LinkTopic = "Form2"
MDIChild = -1 'True
ScaleHeight = 3195
ScaleWidth = 4680
WindowState = 2 '最大化
Begin VB.Menu mnu_PopUp
Caption = "快選功能表"
Visible = 0 'False
Begin VB.Menu mnu_Delete
Caption = "刪除"
Begin VB.Menu mnu_Delete_1
Caption = "刪除單筆"
End
Begin VB.Menu mnu_Delete_All
Caption = "刪除全部"
End
End
End
End
Attribute VB_Name = "Form2"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
PopupMenu mnu_Delete
End Sub

劍痞憶秋年 2006-01-10 12:07 AM

<<Form3>>

VERSION 5.00
Begin VB.Form Form3
Caption = "Form3"
ClientHeight = 3195
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
LinkTopic = "Form2"
MDIChild = -1 'True
ScaleHeight = 3195
ScaleWidth = 4680
WindowState = 2 '最大化
Begin VB.Menu mnu_Delete
Caption = "刪除"
Visible = 0 'False
Begin VB.Menu mnu_Delete_1
Caption = "刪除單筆"
End
Begin VB.Menu mnu_Delete_All
Caption = "刪除全部"
End
End
End
Attribute VB_Name = "Form3"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
PopupMenu mnu_Delete
End Sub

mini 2006-01-10 11:12 AM

試了一下
http://d.turboupload.com/d/267905/MDIForm_test.rar.html

也就是將表單統一編輯在 MDIForm1 裡 (其他的Form2及Form3裡的選單請刪除)
並將底層屬性改成 "不顯示"
就可以
PopupMenu MDIForm1.xxx 'xxx是該 "不顯示"的選單底層名稱
方式在各 Form裡使用

是否有更好的方法,有空再看看google可否找到... :ddrf567h:

劍痞憶秋年 2006-01-10 06:25 PM

引用:

作者: mini
試了一下
http://d.turboupload.com/d/267905/MDIForm_test.rar.html

也就是將表單統一編輯在 MDIForm1 裡 (其他的Form2及Form3裡的選單請刪除)
並將底層屬性改成 "不顯示"
就可以
PopupMenu MDIForm1.xxx 'xxx是該 "不顯示"的選單底層名稱
方式在各 Form裡使用

是否有更好的方法,有空再看看google可否找到... :ddrf567h:

劣者收到!版主您真的是太強了,佩服佩服!!

您提到的那個問題(直接 Popup 第二階Menu),小弟先前也有發現,後來好像用了個人試出來的偏方(

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbRightButton Then
' ◎這裡不知道算不算是 VB 的 Bug
' 在其它地方,被引用過 子功能表(PopupMenu mnu_Order),且被顯示過一次
' 這裡的 就會減少了 那個 子功能表 的顯示 (也就是 子功能表.Visible = False)
mnu_Order.Visible = True
mnu_Find.Visible = True
PopupMenu mnu_PopUp
End If
End Sub

)把它重新顯示處理

應該是小弟一開始的使用的方式就錯誤了,Trace 比較了好久才發現是 Popupmenu 造成的問題,但還是不知道原因,現在卻已經可以順利獲得解決,感謝 mini 版主!!

若還有好方式,還請版主 or 各位高手不吝賜教! 
劣者若是找到好方式,也會把它 回在此篇!!

mini 2006-01-10 07:59 PM

引用:

作者: 劍痞憶秋年
劣者收到!版主您真的是太強了,佩服佩服!!

您提到的那個問題(直接 Popup 第二階Menu),小弟先前也有發現,後來好像用了個人試出來的偏方(

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbRightButton Then
' ◎這裡不知道算不算是 VB 的 Bug
' 在其它地方,被引用過 子功能表(PopupMenu mnu_Order),且被顯示過一次
' 這裡的 就會減少了 那個 子功能表 的顯示 (也就是 子功能表.Visible = False)
mnu_Order.Visible = True
mnu_Find.Visible = True
PopupMenu mnu_PopUp
End If
End Sub

)把它重新顯示處理

哦~
感謝
原來只要把第二層以後的子選單
都 .Visible = True 一次
就可解決了

個人除錯追蹤一上午都找不出方法呢 ? ^^||
(還心想有mnu_PopUp 是否有 反事件 方法可用呢...哈)

劍痞憶秋年 2006-01-12 12:31 PM

後來劣者翻了一下書(王國榮的實戰講座)

書上有寫

MDIForm的特性
4.有關功能表部分,在設計階段,MDI 表單及子表單可以各自設計自己的功能表,
 但進入執行階段時,則不管是 MDI 表單或是子表單的功能表,一律顯示在 MDI 表單上面。
 當 MDI 表單之中沒有子表單被開啟時,MDI 表單所顯示的是 MDI 表單的功能表,
 但如果 MDI 表單之中已有子表單被開啟,則顯示的是「使用中」子表單的功能表。

劣者用版主教的方式(功能表統一編在 MDIForm),修改在實際的案例上,
又遇到新的問題了,就是Popupmenu MDIForm1.A時,嘿嘿,只給偶出現 A2
Popupmenu MDIForm1.B 時,也只給偶出現 B2,試了所有的Popupmenu ,都出現最後一個 子功能,真是見鬼了!! :decfghi6:

不過實際的MDIForm的表單組成太複雜了,等劣者釐清問題 or 找到答案再來 post

mini 2006-01-12 02:53 PM

不太了解您的新問題

至於

"原來只要把第二層以後的子選單 都 .Visible = True 一次 就可解決了"

發現其實
不用每個子選單
都 .Visible = True 一次
只要針對第一個子選單做一次就可以了
而且只需針對 使用最上層選單之情況才要這麼做

如圖
http://www.uploadtemple.com/view.php/1137048678.jpg

劍痞憶秋年 2006-01-13 02:39 PM

mini 版主 拍寫喔,失禮!!

那個新問題,是偶自己豬頭造成的問題,
因為劣者有一個Module 依登入者來 控制MDIForm 功能表的顯示
又依版主的建議把 原MDIChild 表單的快選功能表 放到 MDIForm 了
但沒注意到這樣它(原先的快選功能表)也一併被 上述 module 控制顯示與否!!
(因為一下子也無法釐清問題的所在,也花了一點時間在找問題點,讓版主費神真過意不去)

再次感謝版主的熱心解答!!

(版主真是太用心了,您提供那個範例真是不簡單!!把後續衍生的問題都一併處理掉了,佩服,佩服!!)


所有時間均為台北時間。現在的時間是 01:08 AM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1