|
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
|
|||||||||||
Как программно вызвать событие Windows.Forms ?15.04.2020, 15:05. Показов 3310. Ответов 16
Метки нет (Все метки)
Прошу помощи.
На форме есть ползунок trackBar1 с предустановленными значениями (в Unit1.Form1.inc):
Нужно при загрузке формы (Form1.Form1_Load) передавать в COM значения нескольких её элементов: полей ввода, ползунка и т.д. - их значения пересчитываются в процедурах событий, отдельные процедуры очень бы не хотелось писать, теряется читаемость кода.
0
|
|||||||||||
| 15.04.2020, 15:05 | |
|
Ответы с готовыми решениями:
16
Как в Windows Forms вызвать свое событие? Как программно вызвать событие Click? Как программно вызвать событие формы Paint? |
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
||||||||||||||
| 15.04.2020, 16:06 | ||||||||||||||
.Value может быть отрицательным "из-за особенностей элемента управления" - ожидается что вы это значение как то по-особому обработаете, а не тупо заткнёте ошибку.Concat, или форматную строку:
Теперь к главному вопросу:
Scroll должно вызываться только при прокрутке мышки и только для определённого элемента управления.Иначе вы будете плодить у себя баги + код, в котором их сложно отлавливать. Ну и, раз речь идёт про пересчёт каких то значений - вам ничего не мешает написать свои события.
1
|
||||||||||||||
|
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
|
|||||||||
| 15.04.2020, 16:35 [ТС] | |||||||||
|
Мог конечно преобразовать 0 в 1 и 1 в 0, но раз с -1 работает, то почему бы не использовать. Про то, что trackBar1 не может принимать отрицательные значения, никогда не слышал - спасибо, учту. Теперь к главному: Я несомненно приму к сведению ваш совет по поводу возможной нестабильной работы, но все же мне как минимум для общего развития, очень бы хотелось увидеть Паскалевский аналог Си-шного:
И потом, для кнопок же вполне себе существует .Click - и сроду не глючило...
0
|
|||||||||
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
|||||||||||||||||||||
| 16.04.2020, 01:52 | |||||||||||||||||||||
-Value а не Abs(Value), нет?.OnScroll? Это должно использоваться только ради расширения функционала, когда нет доступа к коду, описывающему подпрограмму-обработчик события.
Вот только вам это всё не надо, потому что редактор сам генерирует строчку с self.trackBar1.Scroll +=.Посмотрите на последнюю строчку самого первого кода что вы сами скинули. Добавлено через 3 минуты Вызов это вызов, в случае событий - вызов всех подпрограмм-обработчиков. А добавление обработчика это, в крайнем случае, вызов аддера события (или только System.Delegate.Combine если аддера нет).
0
|
|||||||||||||||||||||
|
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
|
|||||
| 16.04.2020, 15:50 [ТС] | |||||
|
Мне показалось, что про "костыль" вы именно в ключе "так не положено и может привести к глюками" говорили, сори, не понял вашу мысль, уже разобрался. Так же не совсем понятно, что это за параметры (o,e) и когда требуется использовать self. ? В хелпе слишком кратко, а в форумах очень не внятно и примеры не пойми о чем. ======================================== ===== И всё же вернувшись к основному вопросу =) Есть ли возможность в Паскале именно программно вызывать событие trackBar1.Scroll по аналогии с простейшим и часто употребляемым в коде (даже в официальных примерах используется) button1.Click ? Ведь по сути, событие это обычная процедура, по семантике отличающаяся только требованием указать в параметрах специфические данные. Вернувшись к button1.Click - это же просто вызов события как процедуры? Или именно .Click описан в объектной модели и библиотеках как то иначе, чем другие события и позволяет себя вызывать программно без указания параметров? Очень жду ответ именно на этот вопрос!!! Уж прошу прощения за настойчивость. ======================================== ===== Добавлено через 6 минут
0
|
|||||
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
|||||||||||||||||||||
| 17.04.2020, 06:09 | |||||||||||||||||||||
self.trackBar1.Scroll(...) (только вам не даст так вызвать, потому что это неправильно), так же как с любой подпрограммой. += это по определению добавление чего то. Вообще этот оператор изначально для чисел придуман:
2. C,C++ и C# - совершенно разные языки, не путайте. C++ это оч продвинутая надстройка над C. А C# вообще из другой семьи. Он больше на джаву похоже чем на C/C++. Правда есть ещё гомункул C++CLI, который сразу и C++ и C#. Хотя он конечно очень полезен в своей области применения. Ну, его я упомянул потому, что если будете путать C и C# - в итоге ещё больше запутаетесь наткнувшись на примеры C++CLI вместо C#. http://pascalabc.net Там есть кнопочка презентации. -> это знак лямбд (лямбда-выражений). Вот презентация с ними вам в первую очередь нужна.Но вообще все презентации коротенькие и рассказывают много интересного, так что лучше прочитайте все на досуге.
А когда вам надо вызвать обработчик события "не по делу" - у вас неправильная архитектура кода. Если есть какое то общее действие, какое то обновление которое должно происходить и в обработчике, и в другой части кода - надо писать подпрограмму. Так же как в любом другом случае, когда в 2 частях программы нужен одинаковый участок кода. GraphABC, они не настоящие события, потому что слово event не даёт применить глобальным переменным.
1
|
|||||||||||||||||||||
|
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
|
||
| 17.04.2020, 12:31 [ТС] | ||
|
Прежде всего я уже оформил всё в виде функций, т.е. сделал "как положено" =) Что касается "неправильной архитектуры кода" : и чего я так прицепился к программному вызову Событий Хочу внести некоторую ясность почему я так настойчив в поисках удобства, а не оптимизации кода. Как я понимаю, вы привыкли писать код по ТЗ, т.е. для вас возможно выглядит странным вся эта моя "вошкатня" с удобством доступа, Визуал-редактором, читаемостью кода, которые будут описаны чуть ниже. Но у меня идет разработка "с нуля" по сопряжению компьютера, с внешним Контроллером (очень капризным и не имеющим нормального описания, к слову) и самодельным координатным станком, в который тоже постоянно вносятся чисто механические изменения. Сделать ТЗ в сколь-либо законченном виде не представляется возможным по сути. К слову, станок уже работает и даже делает то, что задумано - сейчас идет оптимизация его работы, подбор оптимальных параметров. Что делает станок вы можете посмотреть вот тут: https://www.facebook.com/denis... 7560959858 Настройки приходится по 10 раз в час менять на лету, постоянно менять параметры, вводить новые и т.д. - а значит работать с полями формы и их "базовыми" событиями. Тут сейчас важна именно простота доступа к нужному событию кнопки прямо с формы. В общем это скорее творческий инженерный процесс, чем программирование =) Возможно это объяснит, почему на этом этапе для меня так важны именно удобство доступа, а не "правильность" и оптимальность кода - на этом этапе важно приладить вентилятор к Карлсону, как безопасно приземляться придумаем позже =)) Добавлено через 13 минут Работа по отладке происходит примерно так: Открыл код, Поменял значения поля или добавил новое поле, При необходимости поменял обработку передачи в COM в процедуре события (например изменил способ формирования префикса именно для этого поля), Запустил программу из оболочка Паскаля, Внес изменения в код программы контроллера, Перезагрузил внешний Контроллер, Установил соединение по COM, Отюстировал станок, Сделал пробный прогон, Выяснил, что что то работает не оптимально (заранее не угадаешь) Перенастроил механику станка, ... пошел по второму кругу. Как видите, тут не до вдумчивого поиска процедур в тексте кода и даже не до оптимизации - нужно как можно скорее и проще подобрать параметры, а уже потом оптимизировать код управляющей программы. В общем, тут я сейчас выступаю скорее как "инженер", чем как программист. И я конечно же не пишу код "от души", без комментов и соблюдения структуры и на сплошных костылях - просто сейчас мне действительно очень важен разумный компромисс между удобством и рациональностью. Надеюсь на ваше понимание! ПО СУТИ ТЕМЫ. Так вот, я работаю с помощью встроенного в оболочку Pascal ABC "драг анд дроп редактора" 1. Создал Form1, 2. На нее положил с десяток разнородных элементов: trackBar, numericUpDown, radioButton, button(с изменяющейся программно иконкой)... ну и т.д. ВАЖНО, что начальные значения я задавал им не в коде, а через Редактор, в таблице свойств. И хочу и далее пользоваться именно встроенным Редактором, а не "описывать элементы ручками". Т.е. стиль работы именно через встроенный Редактор форм! 3. Каждый элемент формы содержит предустановленное через таблицу Редактора значение и ограничения, по "основному" Событию для этого элемента (для кнопки это .Click, для trackBar Scroll) я передаю в COM порт текущие значения этого элемента (иногда перед передачей происходит дополнительная проверка, нормирование значений, формирование префикса для правильного распознавания на другой стороне COM) - в общем много разнородных и уникальных для каждого элемента формы действий. Выносить это в отдельную процедуру для каждого элемента управления, а потом тупо вызывать эти процедуры через События, видится предельно странным. Что мешает сразу написать весь нужный код именно в процедуре самого события? Так и быстро перейти к коду очень просто - клик в редакторе на нужный элемент, и читаемость кода предельно простая - в процедуре События элемента сразу описывается что оно делает При первом запуске формы, мне нужно передать в COM порт значения из некоторых этих полей (напомню, что их много, они постоянно меняются, ТЗ нет и быть не может, т.к. происходит отладка станка). Мне видится, что в такой ситуации проще всего, в событии Load формы просто вызвать "базовые" события для всех нужных полей формы - .Click .Scroll и т.д. Постоянно искать в коде нужные "дополнительные" процедуры и менять код в них - очень не удобно, я их иногда в корне меняю несколько раз за 15 минут. + В коде более 1000 строк и Редактор Pascal ABC просто иногда подвисает при скроллинге текста, а то и просто "вылетает" (слабоват компьютер, если честно) Спасибо за ваше долготерпение и всё же надеюсь на толковый совет по поводу вызова событий элементов при загрузке Формы.
0
|
||
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
||||||||||||
| 17.04.2020, 16:11 | ||||||||||||
|
То есть, к примеру, можно писать код вообще без подпрограмм. Всё в begin-end., с кучей дублей кода.А массивы заменять 100500 переменными. Но когда такого кода наберётся 500-1000 строк, поддерживать его и исправлять баги станет нереально. Так же и при вызове событий откуда попало. --- Ну и насчёт "привыкли писать код по ТЗ" - вообще большинство проектов над которыми я работаю - это игры и для себя. На этом форуме я обычно провожу где то по 30 минут в день с простенькими задачками, типа зарядка. Ну, от необычных случаев, вроде вашего, я тоже не откажусь. Проблема только в том, что вы не пытались. Ну, сказав этого - я, собственно, и не думал ни в один момент что ТЗ не хватает. Иначе я бы так и написал. Наверное, не помешало бы, но объяснять как используются события - мне в любом случае пришлось бы. 1. Архитектура кода - это каркас. Общая структура кода, которую вы придумываете перед тем как вообще что то делать. Если вы сначала взяли говно и палки и закрыли дырки смолой чтоб получился дом - вы можете потом покрыть смолу чем то на что смотреть будет на сколько то приятно, но говно и палки вы уже не замените, без полного сноса. 2. Оптимальность кода это отдельная вещь. Вы можете сортировать целый массив чтоб найти 1 максимальный элемент. Это потом можно исправить. Но как показывает практика - у вас вряд ли дойдут руки до того, чтоб нормально разобраться. Оптимизация это скорее как добавление всяких мелочей в фильм. Любой понимает, что фильм с вниманием к мелочам - это уже на сколько то хороший фильм. Так вот сувать эти мелочи когда весь фильм снят - не очень то продуктивное занятие. Этим надо заниматься когда думаешь о сцене которую снимаешь, когда голова заполнена всеми данными о том что сейчас происходит. Обычно оптимизация кода - это как раз такие мелочи. Та же сортировка ради 1 элемента - это как первый вариант что приходит в голову. Но не надо и секунды чтоб задуматься, а ведь сортировка сверяет друг с другом сразу все элементы. Если нужно достать 1 - должен быть отдельный метод. И таки есть, .Max и .Min . И, главное, искать его придётся только 1 раз. В следующий раз вы сразу правильно напишете.Я понимаю что у вас уже успел сформироваться образ мышления "лучше сначала хоть как то сделать", но на практике это не сделает вашу работу быстрее. Вы ещё дольше будете разбираться с тем что сразу недопоняли, и исправлять то что вначале накодили. А думать над написанием кода - надо не минутами, но и не пол секунды. ===== Обработчики событий надо не в 1 кучу сувать, как редактор их создаёт, а перемещать так, чтоб вам было удобней и логичнее, при этом группирую регионами. А Ctrl+тык на имена своих подпрограмм пробовали использовать? А Shift+F2, F2 и Alt+F2? Да и вообще, зайдите в настройки и включите панель навигации. Для удобств всегда есть куча инструментов, было бы желание найти их, а не работать по-старинке, только средствами, которыми уже умеете пользоваться. А как вызывать код из событий - я вам уже прямо успел сказал, но скажу ещё более прямо: Вы сейчас пытаетесь сделать фигню вроде этой:
Вызов событий на самом деле возможно устроить, но для этого надо куча нечитабельных костылей. Как я и сказал выше - методы вызова событий это только для расширений кода, который вам не принадлежит. Точнее для тех, которые эмулируют нажатий клавиш и т.п. Всё равно не для тех, которые просто пытаются вызвать конкретный функционал конкретного обработчика. Когда надо вызвать конкретный функционал - его всегда надо вызывать именно отдельно. Отдельно от события и его параметров, как номера кнопки мышки, которой тыкнули кнопку, и т.п. Если вы будете писать такое расширение - лучшим вариантом будет скопировать тот кусок кода, содержащий нужный вам функционал, если не получается вызвать отдельно от того, что вам не надо.
1
|
||||||||||||
|
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
|
||||||
| 17.04.2020, 19:24 [ТС] | ||||||
|
Все же я надеюсь, что есть какой то более рациональный способ, чем из процедуры в процедуру скакать по меткам.
Я, если честно, думал, что вы шутите... вы же даже точку возвата не проставили - как вернуться обратно то? =))) Про клавиши навигации по коду знаю, и конечно же пользуюсь "закладками" и Панелью навигации, но это в десятки раз медленнее перехода по клику на элемент из Редактора форм. Что касается умения структурировать код, то проще один раз показать. Да, он не идеальный, но и написан меньше чем за неделю, параллельно с работой над станком. Это одна из трех составляющих, Интерфейс такой:
0
|
||||||
|
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
|
|
| 17.04.2020, 19:32 [ТС] | |
|
UPD не нашел как удалить...
0
|
|
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
||||||||
| 17.04.2020, 20:37 | ||||||||
|
Прочитайте внимательно что я сразу после этого примера сказал. И таки используйте короткие процедуры:
В остальном - регионов действительно не хватает. Но чего вам прямо так сложно ориентироваться - не понимаю.
0
|
||||||||
|
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
|
|||||||
| 18.04.2020, 03:31 [ТС] | |||||||
|
1. Это писалось шаблоном 2. Если вдуматься, то вызов этой строки по объёму откомпилированного кода примерно такой же как вызов процедуры в которую я засунул бы эту строку. Ну а если уж говорить о "правильности" нужно было сделать так, это как бы стандарт в таких случаях и реально правильно со всех сторон: по компактности кода, по скорости обработки и по читаемости.
0
|
|||||||
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
|
| 18.04.2020, 08:24 | |
|
Ну вот вы снова говорите что после отладки уже замените. Но при этом вы же говорили что ориентироваться в таком объёме кода - сложно.
Если сейчас взять все обработчики с одинаковым кодом в 1 кучу в конце файла, обернуть в регион и свернуть - это уже как минимум минус половина кода. Вы же вряд ли будете менять код в этих обработчиках. А значит и держать так же где всё остальное - нет смысла. Вот такую сортировку кода я имел в виду.
0
|
|
|
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
|
|
| 18.04.2020, 14:11 [ТС] | |
|
Так я сейчас именно с ними и работаю.
Именно эти самые обработчики кода (События) я и хотел бы вызывать программно, топик собственно об этом =)) А что значит "Опять потом..."? - Несомненно потом, потому, что сейчас рано. Кроме того эти строки мне наоборот помогают ориентироваться в коде, собственно это основная причина, почему я их до сих пор не переделал точнее почему пользуюсь этим шаблоном. Эти строки визуально отличный "разделитель" групп обработчиков . И конечно же нет никакого смысла делать уже сейчас пусть даже коротенькую функцию по обработке строки подсказок и приаттачить это к форме (чтобы убрать эти одинаковые строки) - а вдруг я решу сделать на форме вкладки или разделю ее на блоки? Что же тогда переписывать код заново просто потому, что "из принципа" сделал это раньше времени? =)) ИМХО, важно только, чтобы код на этапе разработки был правильно структурирован и такие "хвосты" были заметны и поддавались автоматической чистке по "Найти/Заменить". У меня за плечами несколько довольно серьезных коммерческих и гос проектов с работой в группе из 10-20 коллег (интерфейсы и математические алгоритмы), на этапе разработки такие вот "хвосты", если уметь с ними работать, только помогают. Мне кажется, что вы иногда перегибаете палку в нравоучениях о чистоте кода и правильности его оформления. При всем этом я вам искренне признателен за помощь и объяснения в неизведанных для меня уголках объектной модели Pascal ABC, толковее вас мало кто мне здесь что либо объяснял. Ну и да, я несомненно отстал от последних веяний и не знаю новейшего синтаксиса - просто занимался несколько другими вещами, где это было совершенно не нужно.
0
|
|
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
|||||
| 18.04.2020, 15:45 | |||||
|
Модульность кода значит что если вы решите что то менять - вам надо будет менять не 100 строк а 10. Я сразу прочитал что это текучий код и не начинал про красоту кода. Всё это время я говорил только про то, что практично. Вещи которые кривые но быстро исправляются - есть и в моих проектах, во время разработки. Но выглядит это совершенно по-другому. По крайней мере у меня всегда всё оказывается разложено по порядку в несколько вложенных регионах, как только код занимает >200/300 строк. И разделители у меня состоят не из того что так уж получилось что уже лежит там, а из комментариев или пустых строк (но обычно сворачивания регионов хватает). Хотя когда то я тоже мог сказать что то такое про свой код --- Ну впрочем как раз эта последняя цитата - явно переход в защиту. Вы ведь просто использовали что оказалось под рукой не задумавшись, а теперь доказываете что это удобно и специально. Так что об этом бесполезно продолжать говорить. Просто попробуйте несколько других способов организации кода, только тогда увидите в чём я прав, что я сам не знал, а что для вас не работает. Если не пробовать новое - можно так и остаться в каменном веке.
0
|
|||||
|
7 / 7 / 0
Регистрация: 03.10.2014
Сообщений: 313
|
|||||
| 18.04.2020, 21:57 [ТС] | |||||
|
Если решу заменить на label10.Text := MSG; то простая Замена. Я же говорю - у всех свои "фишки" в работе и все строят код под себя... а вы упорно настаиваете - делай как я... Может нужно где то галочку поставить, не подскажите?
0
|
|||||
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
||
| 19.04.2020, 04:18 | ||
|
0
|
||
| 19.04.2020, 04:18 | |
|
Помогаю со студенческими работами здесь
17
Программно вызвать последнее событие Программно вызвать событие ссылки Как вызвать диалоговое окно Windows Forms с веб-страницы? Можно ли программно вызвать событие в Lotus? Нужно вызвать событие в программно созданном SocketServer Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|