Как получить список управлений, имеющих дескриптор hWnd?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

Как получить список управлений, имеющих дескриптор hWnd?

Сообщение ФАНТОМНЫЙ ЮЗЕР » 07.10.2004 (Чт) 17:46

Подскажите, пожалуйста, как в следующей процедуре учесть только те элементы, которые имеют дескриптор hWnd ???

Код: Выделить всё
Friend Property Get BuddyControls() As Collection
' Возвращает коллекцию, которая содержит список элементов контроля
' на родительской форме. Список содержит все контроли, кроме этого
Dim c As Control
Dim sTmp As String
Dim sMyName As String

sMyName = Ambient.DisplayName
Set BuddyControls = New Collection
For Each c In UserControl.Parent.Controls
If (TypeName(UserControl.Parent.Controls(c.Name)) = "Object") Then
sTmp = c.Name & "(" & c.Index & ")"
Else
sTmp = c.Name
End If
If sTmp <> sMyName Then
BuddyControls.Add sTmp
End If
Next c
End Property


Спасибо.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 07.10.2004 (Чт) 18:01

Код: Выделить всё
function Havehwnd(byval nRef as object) as boolean
on error resume next
dim nLng as long
nlng=nref.hwnd
HaveHtml=cbool(err.number=0)
end function
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Как получить список управлений, имеющих дескриптор hWnd?

Сообщение tyomitch » 07.10.2004 (Чт) 19:54

oal писал(а):
Код: Выделить всё
Friend Property Get BuddyControls() As Collection
' Возвращает коллекцию, которая содержит список элементов контроля
' на родительской форме. Список содержит все контроли, кроме этого
Dim c As Control
Dim sTmp As String
Dim sMyName As String

sMyName = Ambient.DisplayName
Set BuddyControls = New Collection
For Each c In UserControl.Parent.Controls
If (TypeName(UserControl.Parent.Controls(c.Name)) = "Object") Then
sTmp = c.Name & "(" & c.Index & ")"
Else
sTmp = c.Name
End If
If sTmp <> sMyName Then
BuddyControls.Add sTmp
End If
Next c
End Property

Какой ужас... А почему бы не так?
Код: Выделить всё
Friend Property Get BuddyControls() As Collection
' Возвращает коллекцию, которая содержит список элементов контроля
' на родительской форме. Список содержит все контроли, кроме этого
Dim c As Control

Set BuddyControls = New Collection
For Each c In UserControl.Parent.Controls
If TypeOf c Is MyControlName Then
If c.Object Is Me Then
Else
BuddyControls.Add c
Else
BuddyControls.Add c
End If
Next c
End Property
Или не так (в стиле "спагетти"):
Код: Выделить всё
Friend Property Get BuddyControls() As Collection
Dim c As Control

Set BuddyControls = New Collection
For Each c In UserControl.Parent.Controls
On Error GoTo Add
If c.Object Is Me Then GoTo Skip
Add: BuddyControls.Add c
Skip: On Error GoTo -1
Next c
End Property
И в последний легко встраивается код ANDLL:
Код: Выделить всё
Friend Property Get BuddyControls() As Collection
Dim c As Control, sink As Long

Set BuddyControls = New Collection
For Each c In UserControl.Parent.Controls
On Error GoTo Add
If c.Object Is Me Then GoTo Skip
Add: On Error GoTo Skip
sink = c.hWnd
BuddyControls.Add c
Skip: On Error GoTo -1
Next c
End Property
Изображение

ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

Сообщение ФАНТОМНЫЙ ЮЗЕР » 08.10.2004 (Пт) 1:00

Большое спасибо за ответ.
Последний пример на строке
Код: Выделить всё
sink = c.hWnd

вызывает ошибку 438: Object doesn't support this property or method.

Как обойти?

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 08.10.2004 (Пт) 8:43

Просто обработай ошибку
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

Как получить список управлений, имеющих дескриптор hWnd?

Сообщение ФАНТОМНЫЙ ЮЗЕР » 08.10.2004 (Пт) 14:19

Обработка ошибки следующего вида не работает:

Код: Выделить всё
    On Error GoTo Skip ' Обработать ошибку
    sink = c.hWnd        ' Ошибка не обрабатывается; а программа приостанавливается.
    ...
Skip:
    Err.Clear
    On Error GoTo 0 ' Отмена ошибок
    next с               '  Перейти к следующему элементу
end property         ' Выйти из процедуры


Как же надо поступить?
Спасибо.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.10.2004 (Пт) 14:23

Если реализовать вызов через CallByName(obj, "hWnd",...), то может начнёт ловиться?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

Сообщение ФАНТОМНЫЙ ЮЗЕР » 08.10.2004 (Пт) 14:34

А что это за функция CallByName(obj, "hWnd",...) ????, как ее реализовать.
Чьё это было сообщение?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 08.10.2004 (Пт) 14:42

Она уже реализована. Вызывает функцию по имени. IDispatch::Invoke(...)
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

Сообщение ФАНТОМНЫЙ ЮЗЕР » 08.10.2004 (Пт) 15:00

То есть вместо
Код: Выделить всё
sink = c.hWnd

подставляю
Код: Выделить всё
sink = CallByName(c, "hWnd",...)


Так что ли??? :?:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.10.2004 (Пт) 15:34

oal, просто перед "sink = c.hWnd" напиши "On Error GoTo -1", и ошибка начнёт ловиться :-)
Изображение

ФАНТОМНЫЙ ЮЗЕР
Обычный пользователь
Обычный пользователь
 
Сообщения: 50
Зарегистрирован: 27.12.2007 (Чт) 20:08
Откуда: phpbb_users

Сообщение ФАНТОМНЫЙ ЮЗЕР » 08.10.2004 (Пт) 15:47

А как же быть с зацикливанием алгоритма на следующих строках:
Код: Выделить всё
On Error GoTo -1
        sink = c.hWnd


Алгоритм зациклился не выходит из процедуры.
Чьё это было сообщение?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 08.10.2004 (Пт) 16:25

Не должно быть там зацикливания... :-?
Ещё раз, целиком:
Код: Выделить всё
Friend Property Get BuddyControls() As Collection
Dim c As Control, sink As Long

Set BuddyControls = New Collection
For Each c In UserControl.Parent.Controls
On Error GoTo Add
If c.Object Is Me Then GoTo Skip
Add: On Error GoTo -1: On Error GoTo Skip
sink = c.hWnd
BuddyControls.Add c
Skip: On Error GoTo -1
Next c
End Property
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 08.10.2004 (Пт) 16:42

Я бы твою функцию так переделал (оно проще, согласись):

Код: Выделить всё
Friend Property Get BuddyControls() As Collection
    Dim c As Control, i As Long

    Set BuddyControls = New Collection
    On Error Resume Next
    For Each c In UserControl.Parent.Controls
        i = 0: i = c.hWnd
        If i Then BuddyControls.Add c
    Next c
End Property
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 08.10.2004 (Пт) 16:48

Да, проверку c.Object Is Me, конечно, надо оставить - будет:

Friend Property Get BuddyControls() As Collection
Dim c As Control, i As Long

Set BuddyControls = New Collection
On Error Resume Next
For Each c In UserControl.Parent.Controls
If Not c.Object Is Me Then
i = 0: i = c.hWnd
If i Then BuddyControls.Add c
End If
Next c
End Property
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 2

    TopList