|
|
|
| На основной форме несколько контролов субформа.
SourceObject у всех одна и та же подчиненная форма.
Требуется определить из экземпляра подчиненой формы, в каком контроле субформа она является источником.
Идеи имеются? | |
|
| |
|
|
|
| а данные в них разные что-ли?
как в них данные отбираются глаынми и подичненными полями или еще как? | |
|
| |
|
|
|
| перебором элементов в главной | |
|
| |
|
|
|
| Для osmor Данные разные. Необходимо прочитать свойство Tag контрола субформа, что бы, например, составить фильтр, или источник.
Для Explorer
Это да, я то же от перебора не смог отвертеться, вопрос как определить, что там именно тот экземпляр формы, который и шерстит контролы на основной форме.
Пока решил с помощью свойства HWND
В подчиненной на событие, например, OPEN
Dim objCtl As Control
On Error Resume Next
For Each objCtl In Me.parent.Controls
If objCtl.ControlType = 112 Then
If objCtl.Form.hWnd = Me.hWnd Then Debug.Print "hWnd sub - " & objCtl.Form.hWnd; Tab; "hWnd form - " & Me.hWnd; Tab; objCtl.Tag
End If
Next
|
| |
|
| |
|
|
|
| Вариант от Karfaqen (слегка мною переработанный)
On Error Resume Next
Dim v
For Each v In Me.parent.Controls
If v.ControlType = acSubform Then If v.Form Is Me Then Debug.Print "hWnd sub - " & v.Form.hWnd; Tab; "hWnd form - " & Me.hWnd; Tab; v.Tag; Tab; v.Name
Next
|
| |
|
| |
|
|
|
| по хэндлу окна довольно любопытно ИМХО - специфично... можно и в Мемериз - мало ли когда сгодится... | |
|
| |
|
|
|
| Да уж, по изгаляться пришлось.
И этот код перестал работать корректно, когда добавил еще один контрол субформа.
А причина то в другом месте окопалась.
Оказывается, если использовать инструкцию On Error Resume Next, то если в условии инструкции If происходит ошибка, то она, по сути, интерпретируется как выполнение условие (True), так как код выполняется в прямом смысле со "следующей строки"
Вот на эти вилы то я и напоролся.
Вот два примера. (Forms("h").Controls("h") не существует)
On Error Resume Next
If Forms("h").Controls("h") <> 0 Then
MsgBox "True"
Else
MsgBox "False"
End If
| Зедсь выведет True
On Error Resume Next
If Forms("h").Controls("h") <> 0 Then
Else
MsgBox "False"
End If
| А здесь ни чего не выведет
Так что, после такого If’а обязательно надо ловить ошибку. | |
|
| |
|
|
|
| For Each frm In Forms
If TypeOf frm.ActiveControl Is sUBFORM Then
Dim Subforma As Form
Set Subforma = frm.ActiveControl.Form
...............
end if
Next
У меня это примерно так | |
|
| |
|
|
|
| А где шла речь об активном контроле?
Да и формы все зачем перебирать? | |
|
| |
|
|
|
| К сожалению, при открытии формы, когда она еще не загружена, ActiveControl'ов еще нет. | |
|
| |