|
185 / 36 / 3
Регистрация: 28.05.2015
Сообщений: 149
|
|||||||||||
Работа с контейнером01.07.2017, 04:50. Показов 4103. Ответов 24
Метки нет (Все метки)
Первый вопрос.
Вот пример перечисления элементов формы с проверкой типа элемента совместно с его тэгом:
Второй вопрос. В контейнере есть контролы, находящиеся в массиве, а так же и отдельные элементы без массивов. Например, мне нужно, чтобы при MouseMove для каждого элемента(массива элементов) происходило одно и тоже действие - допустим Beep. Можно ли их как-то логически объединить, чтобы для каждого элемента не нагромождать свой "событийный" код, а в целях компактности - для всех сразу? Третий вопрос. Создаём контролы в контейнере и пытаемся задать событие:
0
|
|||||||||||
| 01.07.2017, 04:50 | |
|
Ответы с готовыми решениями:
24
Работа с контейнером multimap
|
|
oh my god
|
|||||||||||||
| 01.07.2017, 07:08 | |||||||||||||
через LostFocus например в программе калькулятор:
2
|
|||||||||||||
|
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
|
|||||||
| 01.07.2017, 22:53 | |||||||
|
Была такая же проблема.Решил так.Но я создавал массив элементов управления на форме.Но форма тоже контейнер.Код должен работать и в другом контейнере.На Image работает,проверял.
1
|
|||||||
|
|
|||||||||||||||||||
| 01.07.2017, 23:27 | |||||||||||||||||||
Сообщение было отмечено CharlyChaplin как решение
Решение
fever brain, у тебя же в коде нет обработки событий массива динамически созданных контролов.
txb и cbx - это по одному контролу, а but - не работает, ну т.е. и не должен, т.к. не присвоена ссылка.
Выйти из этой проблемной ситуации можно либо сабклассингом, либо превратив массив контролов в динамически создаваемые контролы. Другие варианты мне неизвестны. Для динамически созданных контролов ты можешь поступить как описано в этом примере. Т.е. для каждого контрола создать экземпляр класса, который будет держать ссылку на этот контрол и на общую процедуру в коде формы, которую класс будет вызывать, как только он поймает событие контрола. Форма:
2
|
|||||||||||||||||||
|
Модератор
|
|||
| 03.07.2017, 19:54 | |||
|
Добавлено через 14 секунд
0
|
|||
|
|
|
| 03.07.2017, 20:05 | |
|
The trick, спасибо за помощь на vbforums.
Действительно очень круто у тебя получилось. Любопытно, как ты нашел, что именно такой прототип должен быть у события. Первый - индекс, за ним - оригинальные параметры. И ещё, идентификатор интерфейса ведь может быть любой лишь бы уникальный?
0
|
|
|
Модератор
|
|||
| 03.07.2017, 20:44 | |||
|
К примеру открываем VB6.OLB в просмотрщике OLE; нас интересует к примеру лейбл, смотрим его outgoing-интерфейс событий - LabelEvents, смотрим его IID = 33AD4EDA-6699-11CF-B70C-00AA0060D393, чтобы получить такой интерфейс для массива контролов прибавляем 1 к IID.Data1, получается 33AD4EDB-6699-11CF-B70C-00AA0060D393.
1
|
|||
|
|
||
| 03.07.2017, 21:41 | ||
|
подключить нужный массив, затем: IConnectionPointContainer::EnumConnectio nPoints + IConnectionPoint::GetConnectionInterface и оттуда извлечь GUID. Добавлено через 3 минуты только среда почему то ругается на EnumConnectionPoints, "метод не найден", хотя IntelliSense и отображает его.
0
|
||
|
Модератор
|
|
| 03.07.2017, 21:48 | |
|
Dragokas, так не получится. Насколько я понял интерфейс реализует VB6, а не ActiveX контрол, а он не реализует метод EnumConnectionPoints. Нужно реверсить и смотреть каким образом формируется IID для юзерконтролов и сторонних контролов. Пока не могу, позже.
1
|
|
|
Модератор
|
|
| 05.07.2017, 23:37 | |
|
Сделал другой вариант, попроще с использованием WithEvents, но он не так гибок как в первом примере. В первом примере можно к примеру абсолютно все массивы контролов одного типа "пропустить" через общий обработчик.
1
|
|
|
Модератор
|
||||||
| 08.07.2017, 11:17 | ||||||
|
Про ActiveX контролы. Как известно VB6 при подключении библиотеки ActiveX контролов через компоненты, создает OCA файл с именем как у оригинального EXE. При исследовании интерфейса массива контролов было выяснено что описание интерфейса находится в соответствующем OCA файле, VB6 просто добавляет интерфейсы для массивов контролов, а также еще какие-то интерфейсы, вероятно врапперы. Причем при каждом создании такой библиотеки (если она была удалена) все UUID'ы генерируются случайно. Для массива контролов создается интерфейс с именем _\x01EventXXX, где XXX номер. Однако, если попытаться создать TLB с коклассом имплементирующим этот интерфейс в качестве дефолтного для событий, то ничего не выйдет. Конечно же, никакого сообщения об ошибке не будет т.к. IID интерфейса корректный, но события будут сдвинуты. Дальнейшее исследование показало что VB6 по неизвестной пока причине сдвигает первый метод события на 0x30 байт. Просмотр vTable полученного интерфейса показал что там содержатся нули, т.е. методы не реализованы. Может быть это используется к примеру для DataBinding'а и т.п. Теперь для создания TLB нам нужно определить базовый интерфейс для обеспечения сдвига на 0x30 байт и сделать его ограниченным. В итоге код для моей версии OCA получился таким:
1
|
||||||
|
Модератор
|
|||||||||||
| 08.07.2017, 11:28 | |||||||||||
|
Про общий интерфейс массива контролов. Для массива контролов VB6 реализует общий недокументированный интерфейс. Небольшой реверс показал что этот интерфейс имеет IID = E93AD7C1-C347-11D1-A3E2-00A0C90AEA82. При дальнейшем реверсе я пришел к выводу что интерфейс имеет следующую структуру (уже в TLB):
Я сделал небольшой пример использования этого интерфейса для получения информации минуя позднее связывание:
0
|
|||||||||||
|
185 / 36 / 3
Регистрация: 28.05.2015
Сообщений: 149
|
|
| 08.07.2017, 20:54 [ТС] | |
|
Может у себя в блоге добавишь запись? А то в тему не каждый заглядывает. Вдруг ещё кому полезным будет.
Не в тему будет сказано. Но мне почему-то подумалось про стамеску и бревно: что даже такой простой вещью из бревна можно сделать скульптуру, если есть мозги и руки. Мне преподаватель как-то сказал: `Не нужно сбрасывать со счетов устаревшие языки. Многие считают их неэффективными, маскируя тем самым неэффективность собственных мозгов и неумении применить "старый" инструмент.`
0
|
|
|
oh my god
|
|
| 09.07.2017, 19:49 | |
|
Ребята конечно перестарались, отвечая на простенький вопрос, если честно из последних постов я сам с трудом понимаю о чем беседа, а вы то хоть поняли CharlyChaplin, ?
0
|
|
|
|
|
| 09.07.2017, 19:54 | |
|
fever brain, так ты спрашивай, коль чего не понятно.
Если тебе кажется, что на этот простенький вопрос есть простенький ответ, не стесняйся, пиши своё решение. Добавлено через 2 минуты The trick сделал огромную работу, реализовав то, что с десяток лет не могли сделать даже на vbforums и для чего нет в нативной реализации от разработчиков VB6.
0
|
|
|
Модератор
|
|
| 09.07.2017, 20:35 | |
|
fever brain, говорил тебе - учи COM. Сколько уже лет прошло? Один из подпунктов вопроса был - как сделать переменную WithEvents и обработать ей событие от массива контролов. Знаешь путь?
Просто так интересно совпало что на двух тематических форумах был задан интересный вопрос об обработке событий массива контролов.
0
|
|
|
185 / 36 / 3
Регистрация: 28.05.2015
Сообщений: 149
|
|
| 11.07.2017, 03:24 [ТС] | |
|
The trick, скинь материалы по COM плиз.
0
|
|
|
Модератор
|
|
| 11.07.2017, 11:53 | |
|
1
|
|
| 11.07.2017, 11:53 | |
|
Помогаю со студенческими работами здесь
20
Работа с контейнером библиотеки STL Работа с контейнером map, запрос на выборку Работа с контейнером map: найти и вывести те тройки чисел, где последние числа равны Проблемы с контейнером задача с контейнером Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|