我發現Control.Parent可能指的是 a或者如果它在 a 中Form也可能是a 。過去,我只是簡單地抓住了父級,它是一個表單,即使對于選項卡上的控制元件也是如此。更讓我困惑的是,控制元件似乎有as ,但沒有其他控制元件有(注意,這可能并不總是如此,如@FunThomas 所示);但在我的 Access 版本中就是這種情況)。PageTabControlsubformForm.Parent

| 控制型別 | Control.Parent退貨 |
父型別 | 預期的父母 |
|---|---|---|---|
| TabCtl1 | TopForm | 形式 | TopForm |
| 標簽頁1 | TabCtl1 | 選項卡控制元件 | TabCtl1 |
| 標簽頁2 | TabCtl1 | 選項卡控制元件 | TabCtl1 |
| SubFormCtl | TopForm | 形式 | 標簽頁2 |
| 串列框控制元件 | 標簽頁1 | 標簽頁 | 標簽頁 1 |
| 文本框控制元件 | 標簽頁1 | 標簽頁 | 標簽頁 1 |
現在,問題是:我做錯了什么?我是否需要遍歷所有父母,直到獲得控制元件的父表單?
uj5u.com熱心網友回復:
控制元件“活”在其他控制元件中。您可以通過該屬性獲得他們居住的控制權Parent。
如果一個控制元件“內部”有一個或多個控制元件,您可以通過 property 獲取一個串列Controls,但請注意并非所有控制元件型別都可以有子控制元件,例如標簽不能有子控制元件并且沒有Controls-property。
這種父子關系可以是級聯的。你可以有一個帶有頁面的選項卡控制元件,一個頁面可以包含一組選項按鈕。你會有類似的東西
Form
TabControl
Page 1
Frame 2
Label 3
Check 4
您確定您的子表單在 Page 控制元件上嗎?如果是,它應該將 Page 控制元件作為父表單,而不是 Main 表單 - 至少在我測驗代碼的示例中是這種情況。
鏈接到控制元件的標簽,例如輸入欄位旁邊的標簽,將該控制元件作為父控制元件。根據經驗:如果您移動一個控制元件,而其他控制元件也隨之移動,那么這些控制元件是子控制元件,而您要移動的控制元件是父控制元件。
以下函式將回傳最頂層的父級,它應該是表單。
Function getForm(ctrl As Variant) As Variant
Dim Parent As Variant
On Error Resume Next
Set parent = ctrl.parent
On Error GoTo 0
If IsEmpty(parent) Then
Set getForm = ctrl
Else
Set getForm = getForm(parent)
End If
End Function
uj5u.com熱心網友回復:
經過大量的測驗和摸索,我發現解決方案比預期的要簡單得多。我使用了@Nathan_Sav's 和@FunThomas's 并最終將它們融合在一起,以確保我可以做我需要的事情。
我遵循@AlbertD.Kallal 建議的父表單(因此我可以選擇父表單和子表單,Form并在Control需要時恢復操作,或者簡單地記錄更改)。FrmInUse.ControlToActOn.WhateverINeedToDo我想要父表單,因為簡單地使用它而不是沿著樹向下走是最簡單和最一致的。此方法用于我最近發布的另一個答案:“訪問 VBA - 如何獲取父子表單的屬性,或者,獲取子表單的用戶給定名稱(不是物件參考名稱)”。這個問題試圖弄清楚為什么.Parent沒有始終如一地回傳。
我想,有可能將所有控制元件激活到我想要的那個(這將確保選項卡打開到所需的位置),但是,用戶表示沒有做他們期望的事情并且也會觸發事件(甚至雖然Microsoft 的 TabControl.Change 檔案說 VBA 不會觸發該事件,但我在實踐中發現這在我的 Access 版本中顯然不是真的)。
要以一種由回圈(或)一致決議的方式獲得Parenta并假設or具有父物件(在其他地方檢查),這得到了我正在尋找的東西。ControlForm.SfrmControl.Sfrm.CtrlIWantForm.CtrlIWantControlForm
If TypeOf ControlTarget Is Form Then
Set ParentForm = ControlTarget.Parent
Else
Set ParentForm = ControlTarget.Properties.Parent.Form
End If
然后像這樣使用代碼:(偽代碼在我們完善它并測驗邊緣情況時,我計劃稍后發布完全構建的類和組件)。
Public Sub GetAddress(ByRef FormOrControlTarget As Object) As String
Dim ParentForm As Access.Form
If TypeOf FormOrControlTarget Is Form Then
Set ParentForm = FormOrControlTarget.Parent
Else
Set ParentForm = FormOrControlTarget.Properties.Parent.Form
End If
If ParentForm Is Nothing Then
GetAddress = FormOrControlTarget.Name & FormOrControlTarget.Hwnd
ElseIf FormOrControlTarget Is Form Then
' Note: the below line won't work as-is, you'll need to search the parent form
' for it; I'll update this and the relevant code when it's ready to go.
GetAddress = ParentForm.Name & ParentForm.SfrmControl.Name & FormOrControlTarget.Name & FormOrControlTarget.Hwnd
Else
GetAddress = ParentForm.Name & ParentForm.Hwnd & FormOrControlTarget.Name
End if
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/437208.html
上一篇:MySql查詢到MSAccess
下一篇:打開新活動的影像按鈕
