Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нетривиальная задачка по определению контрола субформы из самой подчиненной формы.
 
 автор: АлексейЕ   (12.02.2007 в 12:54)   личное сообщение
 
 

На основной форме несколько контролов субформа.
SourceObject у всех одна и та же подчиненная форма.
Требуется определить из экземпляра подчиненой формы, в каком контроле субформа она является источником.

Идеи имеются?

  Ответить  
 
 автор: osmor   (12.02.2007 в 13:56)   личное сообщение
 
 

а данные в них разные что-ли?
как в них данные отбираются глаынми и подичненными полями или еще как?

  Ответить  
 
 автор: Explorer   (12.02.2007 в 14:03)   личное сообщение
 
 

перебором элементов в главной

  Ответить  
 
 автор: АлексейЕ   (12.02.2007 в 15:00)   личное сообщение
 
 

Для 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

  Ответить  
 
 автор: АлексейЕ   (12.02.2007 в 15:24)   личное сообщение
 
 

Вариант от 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

  Ответить  
 
 автор: Explorer   (12.02.2007 в 17:06)   личное сообщение
 
 

по хэндлу окна довольно любопытно ИМХО - специфично... можно и в Мемериз - мало ли когда сгодится...

  Ответить  
 
 автор: АлексейЕ   (12.02.2007 в 17:59)   личное сообщение
 
 

Да уж, по изгаляться пришлось.

И этот код перестал работать корректно, когда добавил еще один контрол субформа.
А причина то в другом месте окопалась.
Оказывается, если использовать инструкцию 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’а обязательно надо ловить ошибку.

  Ответить  
 
 автор: fylhtqrf   (13.02.2007 в 06:46)   личное сообщение
 
 

For Each frm In Forms
If TypeOf frm.ActiveControl Is sUBFORM Then
Dim Subforma As Form
Set Subforma = frm.ActiveControl.Form
...............
end if
Next

У меня это примерно так

  Ответить  
 
 автор: Bellerofont   (13.02.2007 в 09:57)   личное сообщение
 
 

А где шла речь об активном контроле?
Да и формы все зачем перебирать?

  Ответить  
 
 автор: АлексейЕ   (13.02.2007 в 10:00)   личное сообщение
 
 

К сожалению, при открытии формы, когда она еще не загружена, ActiveControl'ов еще нет.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList