Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / хочу избавиться от циклов / 9 сообщений из 9, страница 1 из 1
18.07.2012, 20:19
    #37884475
Горан
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу избавиться от циклов
Здравствуйте. такой вопрос. Есть сторонняя программа. Пытаюсь расширить ее функционал. При выборе в комбобоксе выскакивает моя форма. Проблема в том, у большинства контролов отсутствуют имена, поэтому приходится искать перебором хендлов. Более того на форме есть кнопки при которых меняется содержание одних и тех же контролов, поэтому поиск нужного идет по изменившемуся содержанию.


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
' Module
Option Explicit
Public cmbHandle as Long
' перебираем контролы на родительской форме
Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim h2 As Long
     sClass = Space$(mconMAXLEN)
      h2 = iGetClassName(hwnd, sClass, mconMAXLEN)
    sClass = Left$(sClass, h2)
    If sClass = "ThunderRT6ComboBox" Then start(hwnd)
    EnumChildProc = 1
 
Function start(cmbH As Long)' смотрим содержит ли этот комбобокс нужную нам строку
    Dim strFind As String
    strFind = "<Tag>"
    res = SendMessage(cmbH, CB_FINDSTRING, 0, ByVal strFind)
    If res >= 0 Then cmbHandle = cmbH
End Function

'Form1

'ищем нужный хендл
Dim handl as Long ' хендл родительского окна
 Dim index As Long, textin As Long
 Dim st As String
Do While cmbHandle = 0
        Sleep (100)
        EnumChildWindows handl, AddressOf EnumChildProc, ByVal 0&
    Loop

akk:
        index = SendMessage(cmbHandle, CB_GETCURSEL, 0, 0)
          Select Case index

           Case 0     ' Поле Tag находится на первой позиции
                  'Form1.Visible = True
            Case Else
                GoTo akk
        End Select



Все работает, но жрет дофига памяти и грузит проц. Нет ли какого-нибудь способа избежать перебора (например аналог эвентс из С++)?
...
Рейтинг: 0 / 0
19.07.2012, 11:01
    #37884972
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу избавиться от циклов
> Автор: Горан
> Здравствуйте. такой вопрос.

А если попробовать сделать следующий финт ушами:
При старте формы, пробежатся один раз по всем котролам родительской формы и получить их хендлы и сохранить в какой-то
структура для быстрого доступа к ним. И потом не перебирать каждый раз, а использовать уже полученую информацию.

Ы?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.07.2012, 14:04
    #37885340
Горан
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу избавиться от циклов
Спассбо за ответ, но на форме есть несколько кнопок, по которым в окне появляются новые контролы и исчезают старые. Тот который нужен мне появляется только после нажатия одной из этих кнопок. В, принципе, можно пробежаться по форме, получить хендл кнопки, по нажатию которой появляется необходимы мне комбобокс и только после этого пробегаться и сохранять в структуру. но как отловить нажатие на кнопку?
...
Рейтинг: 0 / 0
19.07.2012, 14:12
    #37885355
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу избавиться от циклов
> Автор: Горан
> но как отловить нажатие на кнопку?

Сабкласить нужную кнопку. При отлове события Click, выполнить "родной обработчик, потом найти добавленые контролы и
сохранить их для дальнейшего использования

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.07.2012, 14:34
    #37885411
хочу избавиться от циклов
Игорь Горбонос,

сабклассинг окна не системного класса возможен при исполнении кода в процессе-владельце дескриптора окна. То есть для применения сабкласинга придётся делать DLL injection. При том, что VB не делает "из коробки" простых DLL.

Горан,
посмотрите хуки , может, надётся что полезное.
...
Рейтинг: 0 / 0
19.07.2012, 15:08
    #37885508
QValD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу избавиться от циклов
Горан, так это на твоей форме контролы без имени, к которым нужно обращаться, или на чужеродной?
...
Рейтинг: 0 / 0
19.07.2012, 15:24
    #37885551
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу избавиться от циклов
QValDГоран, так это на твоей форме контролы без имени, к которым нужно обращаться, или на чужеродной?ГоранЕсть сторонняя программа.
...
Рейтинг: 0 / 0
19.07.2012, 15:36
    #37885584
QValD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу избавиться от циклов
AntonariyQValDГоран, так это на твоей форме контролы без имени, к которым нужно обращаться, или на чужеродной?ГоранЕсть сторонняя программа.
Горан При выборе в комбобоксе выскакивает моя форма .
...
Рейтинг: 0 / 0
19.07.2012, 15:42
    #37885601
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу избавиться от циклов
и чо? десять раз в секунду проверяет комбобокс на наличие определенного значения
на кой этот гемор в своей программе?
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / хочу избавиться от циклов / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]