Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
MU-GK
28 / 25 / 1
Регистрация: 06.01.2017
Сообщений: 282
1

Как сделать единый обработчик клика на разные кнопки , и как послать сообщение?

31.01.2017, 09:32. Просмотров 291. Ответов 9
Метки нет (Все метки)

Чувствую, что можно сократить код посылкой сообщение туда, где обработка происходит а как - не знаю.

Вопрос примерно такой:
1. Открываю некий документ Эксел. Там страница Config, в которой прописаны полные имена вспомогательных документов Эксел.
Программа должна открыть эти файлы и дальше с ними работать.
2. Предположим, имена прописаны неправильно и вспомогательные файлы не открываются.
3. Сейчас программа просто показывает сей факт и предлагает закрыться, исправить ошибку в основном Модуле, т.е. прописать имена вспомогательных модулей и запуститься снова.
4. Хочу добавить возможность загрузки вспомогательных модулей нажатием кнопки. Сделать это нетрудно, но возникают вопросы:
А. Как сделать единый обработчик на все модули, а не создавать для каждого, это CheckBoxA, CheckBoxB и т.д..
Т.е. стандартно это chbA_Click, chbB_Click, chbC_Click и т.д., а пусть будет общий Кликер. Как это сделать?
В. И после этого хочется послать сообщение в обработчик клика на загрузку основного модуля, пусть программа думает, что основной модуль, который сейчас висит в памяти, загрузился вновь с уже правильными именами вспомогательных модулей
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2017, 09:32
Ответы с готовыми решениями:

Как послать системное сообщение?
Как послать системное сообщение по локальной сети на другую машину?

Как из VBA послать сообщение на определённый IP посредством net send?
Подскажите как из VBA послать сообщение на определённый IP посредством net send?

Обработчик клика по кнопке!
Всем доброго времени суток!!! Помогите пожалуйста!!!!!!!! Существует отчет в...

Морской бой - Как сделать единый обработчик нажатий на кнопки
Сам что-то не придумал...

Как проверить, если ли у кнопки обработчик клика, и как его вызвать?
С добрым днём! Подскажите, пожалуйста, как, во-первых, определить назначен...

9
Kubuntovod
933 / 111 / 24
Регистрация: 14.01.2013
Сообщений: 524
31.01.2017, 17:19 2
Цитата Сообщение от MU-GK Посмотреть сообщение
Т.е. стандартно это chbA_Click, chbB_Click, chbC_Click и т.д., а пусть будет общий Кликер. Как это сделать?
Курите сабклассинг. Создаёте свой класс, прописываете в нём кликер, а затем, на основе этого класса создаёте свои чекбоксы.

Цитата Сообщение от MU-GK Посмотреть сообщение
И после этого хочется послать сообщение в обработчик клика на загрузку основного модуля, пусть программа думает, что основной модуль, который сейчас висит в памяти, загрузился вновь с уже правильными именами вспомогательных модулей
Ничего не понял из этой фразы.
0
MU-GK
28 / 25 / 1
Регистрация: 06.01.2017
Сообщений: 282
31.01.2017, 18:25  [ТС] 3
Ну, сейчас выглядит так: при нажатии кнопки загрузки основного модуля о крывается диспетчер файлов, выбираю файл Основного Модуля, жму ОК.
Дальше в идеале происходит так - программа открывает Основной Модуль, со страницы Config считывает полные именя вспомогательныхх модулей и открывает их. Далее происходит проверка полноты данных - есть ли первичные данные, есть ли вторичные данные, правильна ли структура первичных и вторичных данных.
Потом юзер сам выбирает, создавать ли вторичные данные заново, или работать с уже существующими.

Как видим, здесь ничего не сказано о наличии вспомогательных Модулей, описанных в Config основного Модуля.
Сейчас, если какой-либо модуль отсутствует, то Программа предлагает записать в Config правильные имена файлов и закрывается.
Я же хочу дать юзеру возможность загрузить вспомогательные модули прямо из программы. Это сделать нетрудно, но тогда надо будет снова указывать основной Модуль, а хочется, чтобы это сработало автоматически.
Впрочем, теперь понятно, что это невозможно, поскольку обработчик кнопки загрузки основного Модуля включает диспетчер файлов.
Ладно, Бог с ним.

————————
А не дадите кусочек кода с классами? Честно, не владею я этим пока, но хочу овладеть.
0
Kubuntovod
933 / 111 / 24
Регистрация: 14.01.2013
Сообщений: 524
31.01.2017, 19:28 4
Цитата Сообщение от MU-GK Посмотреть сообщение
Я же хочу дать юзеру возможность загрузить вспомогательные модули прямо из программы. Это сделать нетрудно, но тогда надо будет снова указывать основной Модуль, а хочется, чтобы это сработало автоматически.
А указать основной модуль автоматически, после того, как юзер выполнил свою работу, нельзя?

Цитата Сообщение от MU-GK Посмотреть сообщение
А не дадите кусочек кода с классами? Честно, не владею я этим пока, но хочу овладеть.
Набросал на коленке. Обратите внимание, что чекбоксы создаются в рантайме.
0
Вложения
Тип файла: xls Книга1.xls (53.0 Кб, 4 просмотров)
MU-GK
28 / 25 / 1
Регистрация: 06.01.2017
Сообщений: 282
31.01.2017, 23:47  [ТС] 5
Ага, что-то проясняется, правда, не до конца.
А пока вставлю кусочек из Help@а.

ProgID values for individual controls are:
CheckBox Forms.CheckBox.1
ComboBox Forms.ComboBox.1
CommandButton Forms.CommandButton.1
Frame Forms.Frame.1
Image Forms.Image.1
Label Forms.Label.1
ListBox Forms.ListBox.1
MultiPage Forms.MultiPage.1
OptionButton Forms.OptionButton.1
ScrollBar Forms.ScrollBar.1
SpinButton Forms.SpinButton.1
TabStrip Forms.TabStrip.1
TextBox Forms.TextBox.1
ToggleButton Forms.ToggleButton.1

Добавлено через 50 минут
Указать основной Модуль?
Да указывать его не надо, он и так указан, его имя известно, и он (а Модуль, на самом деле, это файл Excel) даже открыт.


Что-то написал я, и думаю - а зачем вообще-что делать, если сделано уже - недостающие Модули указываются вручную юзером, загружаются = файлы Excel открываются. Кстати, имена вновь открытых модулей тут же пропечатываются в Config"е основного Модуля.

Зачем мне надо было обрабатывать снова - даже не пойму сейчас )
Да, забыл сказать - незагруженные ("ошибочные") модули красим в жёлтый цвет, чтобы сразу было видно.
=========
В общем, задача описана вот здесь: Изменение свойства Parent
0
Kubuntovod
933 / 111 / 24
Регистрация: 14.01.2013
Сообщений: 524
01.02.2017, 07:23 6
Цитата Сообщение от MU-GK Посмотреть сообщение
Ага, что-то проясняется, правда, не до конца.
Спрашивайте, чтобы достичь полного просветления.

Цитата Сообщение от MU-GK Посмотреть сообщение
Зачем мне надо было обрабатывать снова - даже не пойму сейчас )
Бывает через год читаешь свой же код и думаешь "Нифига себе я тут наколбасил, можно же проще". Видимо, опыт сказывается.

Цитата Сообщение от MU-GK Посмотреть сообщение
В общем, задача описана вот здесь: Изменение свойства Parent
Ага! Помню я эту тему. Но и там я до конца не проникся задачей. Не могу уловить саму суть проблемы. Если при чтении конфига возникают какие-то проблемы, то почему нельзя заставить пользователя решить эти вопросы и перечитать конфиг заново, а потом уже продолжать работу? Т.е. сначала проверка на существование, затем, если есть вопросы, решаем их (и goto шаг 1), если нет, то продолжаем работу. Зачем тут нужен Parent, ума не приложу.
0
MU-GK
28 / 25 / 1
Регистрация: 06.01.2017
Сообщений: 282
01.02.2017, 09:07  [ТС] 7
Вы подзабыли, наверное, теперь и не нужен, я перестроил структуру, теперь она вот такая:

Исходная ситуация:
-UserForm
--MultiPage
----Page1
-------TextBox
------- CommandButton
----Page2
------- CommandButton
----Page3
------- CommandButton
--Frame ' теперь это один уровень с MultiPage


--Frame
---CheckBoxA
---CheckBoxB
---CheckBoxC
---CheckBoxD
---CheckBoxE
========================

Итак, на каждой странице свой набор кнопок:
1. Загрузка основного Модуля, чтение Config, загрузка вспомогательных модулей, проверка наличия модулей
2. Создание вторичных данных, проверка наличия первичных данных во вспомогательных модулях, проверка полноты первичных данных
3. Обработка вторичных данных, генерация отчетов, проверка наличия вторичных данных, их полноты
4. Работа с отчетами - управление зависимостями внутри отчета.


При этом в стр.1 загрузка основного модуля происходит вручную через диспетчер файлов, соответственно при принудительном возврате на стр.1 и имитации нажатия кнопки на сьр.1 программа войдёт в диспетчер айлов.
Он может и правильно, типа, юзер поменял вспомогательные модули, так что и основной модуль надо загрузить заново..
А можно в обработчике кнопки стр.1 предусмотреть обход открытия основного Модуля через диспетчер
0
Kubuntovod
933 / 111 / 24
Регистрация: 14.01.2013
Сообщений: 524
01.02.2017, 09:15 8
Цитата Сообщение от MU-GK Посмотреть сообщение
1. Загрузка основного Модуля, чтение Config, загрузка вспомогательных модулей, проверка наличия модулей
А поменять местами "загрузка вспомогательных модулей" и "проверка наличия модулей" разве нельзя? Читаете конфиг, проверяете, если есть проблемы исправляете, переписываете конфиг, опять читаете. Как-то так ...

Цитата Сообщение от MU-GK Посмотреть сообщение
А можно в обработчике кнопки стр.1 предусмотреть обход открытия основного Модуля через диспетчер
Сорри, но я не понимаю, что такое "диспечер" в данном контексте.
0
MU-GK
28 / 25 / 1
Регистрация: 06.01.2017
Сообщений: 282
01.02.2017, 10:46  [ТС] 9
Да у меня сейчас так и построено - программа говорит «исправьте иммена вспомогательных модулей» и закрывается, или, в варианте Modeless, просто предлагает исправить имена и ждет повторной загрузки.

А диспетчер файлов это такая штука, которая, например, открывается при нажатии «Сохранить как»

Добавлено через 3 минуты
Так я и проверяю наличе модулей открывая их. Если не открывается, то трактую это так, что в нужном месте их нет. А разве есть другой вариант?
0
Kubuntovod
933 / 111 / 24
Регистрация: 14.01.2013
Сообщений: 524
01.02.2017, 14:09 10
Цитата Сообщение от MU-GK Посмотреть сообщение
Так я и проверяю наличе модулей открывая их. Если не открывается, то трактую это так, что в нужном месте их нет. А разве есть другой вариант?
Функция Dir
Dir [(PathName[, Attributes])]

Функция Dir служит для проверки существования каталога или файла, отвечающих заданному образцу. Функция поддерживает использование подстановочных знаков для нескольких символов(*) и одиночного символа(?) для указания нескольких файлов. Функция возвращает первое имя файла, имя которого соответствует аргументу PathName. Для получения остальных файлов, имена которых соответствуют PathName, следует повторно вызвать функцию Dir без аргументов. Последовательные вызовы функции без аргументов возможны до тех пор, пока имеются файлы или папки, соответствующие образцу первого вызова(с аргументами)
Примечание: Рекурсивные вызовы функции Dir запрещены
Возвращаемое значение

Функция возвращает данные типа String, структурно представляющего имя файла или папки, которые удовлетворяют указанному шаблону имени файла, набору атрибутов файла или метке тома на диске. Если аргумент PathName не найден, то функция Dir возвращает пустую строку(" ")
Примечание: Если после возврата функцией пустой строки, снова вызвать функцию без аргументов, то возникает ошибка времени исполнения Invalid procedure call or argument
0
01.02.2017, 14:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.02.2017, 14:09

Как проверить, если ли у кнопки обработчик клика, и как его вызвать?
С добрым днём! Подскажите, пожалуйста, как, во-первых, определить назначен...

Как на разные кнопки назначить один и тот же обработчик событий?
PyQt Доброго времени суток, господа Как можно на разные кнопки назначить...

Единый обработчик для Button и по нажатию с клавиатуры определённой кнопки
Здравствуйте, у меня такой вопрос. В приложении есть кнопка Button1, и я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru