Страница 1 из 2

Run-Time Shortcut Menu (User)

Добавлено: 26 ноя 2019, 23:54
Юрий
Для контрола создал своё Run-Time Shortcut Menu. А можно ли программно выудить из него список тегов?

Re: Run-Time Shortcut Menu (User)

Добавлено: 27 ноя 2019, 00:27
Kosist
Это можно сделать в Event Structure, в событиях связанных с работой с контекстным меню контрола.
Menu Tags.png
Важная деталь: "время жизни" ссылки на контекстное меню контрола ограниченное Event Structure. Т.е. все манипуляции с этой ссылкой можно делать лишь внутри событийной структуры. Если ссылку, например, передать в другой цикл (как при Producer-Consumer), она моментально будет невалидная. В подприбор можно все оформить, но опять же, вызывать подприбор который манипулирует с ссылкой на контекстное меню можно лишь внутри событийной структуры.

Re: Run-Time Shortcut Menu (User)

Добавлено: 27 ноя 2019, 01:14
Юрий
Kosist, спасибо. Значит список тегов получить можно. Но для этого надо щёлкнуть по контролу правой клавишей. Но как обойтись без этого. Я создал этот список вручную, присвоил его контролу. А теперь хотелось бы в самом начале работы программы его получить и уже не связываться ни с какими ссылками. А так получается, что при каждом вызове субменю надо ещё и обрабатывать событие Shortcut Menu Activation. Хотя, по большому счёту, это и не так страшно.

Re: Run-Time Shortcut Menu (User)

Добавлено: 27 ноя 2019, 01:20
Юрий
В догонку. А может можно как то программно активизировать это событие (Shortcut Menu Activation?) в начале программы?

Re: Run-Time Shortcut Menu (User)

Добавлено: 27 ноя 2019, 09:51
Kosist
Не уверен что можно вызвыть это событие программно. А зачем Вам нужен список тегов вначале программы? Т.е. какую логику Вы желаете имплементировать?
В общем случае, последовательность такая:
- пользователь кликает правой кнопкой мышки - генерится событие Shorcut Menu Activation?;
- в этом событии есть возможность одфильтровать событие (используя терминал Discard?); или программно изменить контекстное меню. Например, у Вас есть таблица, и на каждую колонку свое меню. В таком случае меню нужно генерить программно, и это можно сделать в обработчике этого события;
- затем, когда пользователь выбрал пункт меню, активируется событие Shorctu Menu Selection (User). И там уже у Вас имеется выбранный тег, и можно выбирать конкретное действие.
Т.е. вопрос в том, нужно ли Вам вообще вначале программы читать теги меню; если обработка события делается такой последовательностью.

Re: Run-Time Shortcut Menu (User)

Добавлено: 27 ноя 2019, 21:30
Юрий
Kosist, всё это понятно. У меня задача попроще. Меню жёсткое и по каждому тегу ведётся своя обработка. А чтобы выбрать вариант обработки надо сравнить выбранный вариант со списком. Всё это банально. Вопрос как получить этот список.
1. Создать массивчик тегов, вручную переписав наименование тегов. Плохой вариант на случай, если что то надо изменить.
2. В эвент структуре иметь два события, как у Вас, это Shorcut Menu Activation? и Shorctu Menu Selection (User). И каждый раз проходить через оба эти события благо, что для получения тега пользователю не надо специально что то делать для вхождения в Shorcut Menu Activation? - всё получается естественным образом и последовательность возникновения событий жёсткая и нужная. А список тегов формировать в событии Shorcut Menu Activation? При чём это можно сделать всего один раз при первом вхождении или при каждом. Для пользователя это всё безразлично, а для программиста здесь есть некая избыточность.
3. Если есть возможность формировать контекстное меню без генерации каких либо событий (этот вариант ещё не прорабатывал), то можно создавать свой массив тегов. Затем в начале программы его подписывать в контрол, а в программе использовать только событие Shorctu Menu Selection (User).

Re: Run-Time Shortcut Menu (User)

Добавлено: 27 ноя 2019, 21:50
Kosist
Юрий, а зачем Вам полный массив тегов? В событии Shorctu Menu Selection (User) Вы получите конкретный выбранный тег. А там используйте Case Structure, где селектор будет строка (выбранный тег) - и все, каждая страница Case Structure на основе имени тега будет иметь свой обработчик.
А обработка события Shorcut Menu Activation? - опциональная; она более полезная если нужно отменить правый клик, или сгенерить конкретное меню. Например, работа с таблицей - удаление строк. Если пользователь кликнул на края таблицы, или на пустую строку - меню отбражать не нужно; значит в событии Shorcut Menu Activation? правый клик можно "отменить". Или опять же, если пользователь кликнул на ячейку колонки 1 - должно быть одно меню, а если на ячейку колонки 2 - другое; то его (это меню) можно сгенерить в этом событии. Если Вам такой функционал не нужен, то используйте только Shorctu Menu Selection (User).

Re: Run-Time Shortcut Menu (User)

Добавлено: 28 ноя 2019, 00:37
Юрий
Kosist,
В событии Shorctu Menu Selection (User) Вы получите конкретный выбранный тег. А там используйте Case Structure, где селектор будет строка (выбранный тег)
Изначально я так и хотел сделать, но в Case Structure нужно же прописать все названия тегов. Это ж надо их запомнить или куда то записать, а потом вписать в Case. Автоматом не получается или где то я туплю.

Re: Run-Time Shortcut Menu (User)

Добавлено: 28 ноя 2019, 01:11
Kosist
Юрий писал(а):Изначально я так и хотел сделать, но в Case Structure нужно же прописать все названия тегов. Это ж надо их запомнить или куда то записать, а потом вписать в Case.
Иного пути нет :wink: . Если Вам это нужно для разового использования, то проблемы вообще нет. Создайте виайку, которая будет иметь тот контрол, евент структуру, и вычитайте все теги в индикатор массива строк. Сделайте из него константу, и перепишите в Case Structure. Делов-то на пару минут.
А если в будущем меню будет правиться - то изменения нужно делать вручную, это да. Но этих изменений будет мало.
А иначе автоматизировать процесс не имеет смысла - стейт-машину Вы ведь не генерите динамически, а создаете под каждый стейт отдельную страницу Case Structure; так же и здесь.

Re: Run-Time Shortcut Menu (User)

Добавлено: 28 ноя 2019, 12:28
Artem.spb
Что-то я не понимаю сути проблемы :)
Если вы при запуске программы получите список тэгов, то как он перекочуют в case?
Кейсы формируются при создании программы, ещё до исполнения. Да, надо бы помнить, что было сделано в меню. Как иначе-то?

Re: Run-Time Shortcut Menu (User)

Добавлено: 28 ноя 2019, 19:28
Юрий
Вот уж действительно. Проблема, казалось бы, самая тривиальная, а сколько создал писанины для себя и других. В общем остановился на втором варианте из моего поста, см. выше (жалко, что посты не нумеруются). Фиг с ней с избыточностью.
Artem.spb,
Если вы при запуске программы получите список тэгов, то как он перекочуют в case?
В кейс структуру он (список) и не будет перекачёвывать. Просто он участвует в поиске номера актуального тега из списка. А, вот, уж номер будет подключён к кейс структуре. В сложившейся ситуации такой вариант для меня более приемлем. Поскольку список всегда могу посмотреть не залезая в недра контрола, выведя его на индикатор - возможных ошибок меньше.

Re: Run-Time Shortcut Menu (User)

Добавлено: 28 ноя 2019, 21:37
Kosist
Использовать номер (число), если есть соотвествующее текстовое представление (т.е. имя тега) - не очень удачное решение. Вы понижаете читаемость кода. Представьте кейс структуру из 20 страницами, в которой селектор - число. Чтобы понять, какому тегу соотвествует индекс нужно "подсматривать" в список тегов. Неудобно.
А если селектор - имя тега, то код легко читаемый.
Маленькая деталь, но именно из деталей и состоит красота кода. Ведь код должен быть не только функционален, но и масштабируемый, читаемый, и поддерживаемый.

Re: Run-Time Shortcut Menu (User)

Добавлено: 28 ноя 2019, 21:54
Artem.spb
Юрий писал(а):В кейс структуру он (список) и не будет перекачёвывать. Просто он участвует в поиске номера актуального тега из списка.
неразумный вариант, вот почему
case.png

Re: Run-Time Shortcut Menu (User)

Добавлено: 28 ноя 2019, 23:19
Юрий
Kosist, Artem.spb, я с вами полностью согласен. Конечно, лучше быть здоровым, но богатым, чем бедным, но больным. А есть ещё одно НО. У меня таких однотипных контролов со своим набором тегов не два и не три. И обрабатываю их комплексно. Т. е. есть массив ссылок на них и события формируются на основе этих массивов. Вероятность какой то ошибки или путаницы при ручном вбивании тегов в кейс структуру значительно увеличивается. А, ведь, ещё надо что то добавлять или исключать поскольку ещё не ясно что же будет окончательно. А что бы было понятно и читаемо я в кейс структурах использую sbdiagram Lebel. И там не обязательно абсолютно точно воспроизводить тег, а можно дать и какие ни будь пояснения. Получается, что или точно вбивай наименование тега больше ни чем не заморачиваясь кроме дополнительной нагрузки на внимание и копанием в недрах контролов. Или произвольно обозначай действие в sbdiagram Lebel с использованием избыточного события Shorcut Menu Activation?. Вы уж меня извините, но в данном случае "красота кода, масштабируемость" и т.д. для меня стоит не на первом месте. Вся жизнь наша состоит из компромиссов.

Re: Run-Time Shortcut Menu (User)

Добавлено: 28 ноя 2019, 23:54
Kosist
Юрий писал(а):Вы уж меня извините, но в данном случае "красота кода, масштабируемость" и т.д. для меня стоит не на первом месте. Вся жизнь наша состоит из компромиссов.
Все так говорят, а потом когда возвращаются к своему коду через два года, ругаются долго и громко. А еще хуже, если с кодом будет разбираться вообще другой программист.
Вот смотрите. Subdiagram label - отличная штука, но туда нужно писать текст вручную. Если селектор - число, есть вероятность что порядок тегов поменяется (удалите какой-то, поменяете местами, и т.д.), измените обработчик в кейс-структуре, а subdiagram label не переименуете. Бывает, все мы люди; но результат - путаница. И что Вы выиграете? Вам что так, что так нужно "копаться в недрах контрола". Только в одном случае Вы будете искать имена тегов, а во втором - считать их индексы.
Я никогда не поверю - так как сам разработчик - что сделать обработку событий по их индексу проще и быстрее, чем забивать имена тегов в кейс структуру. Это не так, и это отнимает одинаковое количество времени, ведь суть-то одна. Только в одному случае у Вас читаемый код, а во втором - индексы, для которых еще нужно опять "копаться", чтобы обнаружить какой тег они обрабатывают.