|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
|||||||||||
Прицепить делегатов в классе формы13.11.2017, 14:55. Показов 4872. Ответов 113
Метки нет (Все метки)
Приветствую. Начал снова учить делегатов.
Хочу сделать следующее - есть форма и 2 текстовых бокса. При нажатии на кнопку в классе формы создаю 2 события на основании двух делегатов, в которые пойдут данные из текстбоксов. И делаю еще класс, который должен через делегатов принять эти значения. Т.е. чтобы форма не знала об этом классе хочу добиться. Но не могу понять, как обратиться из второго класса к моим событиям. Код в классе формы:
0
|
|||||||||||
| 13.11.2017, 14:55 | |
|
Ответы с готовыми решениями:
113
С формы прицепить файл PDF в поле OLE Перетаскиванием Image c формы прицепить его к узлу дерева Как обращаться к компонентам формы в классе, не прописывая везде имя формы |
|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
|
| 30.11.2017, 12:14 [ТС] | |
|
В классе-подписчике на событие. В блоке рекурсии. Вызывается new...вот этот момент я не понял совсем.
0
|
|
|
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,039
|
|
| 30.11.2017, 12:24 | |
|
PowerCat, и что вы не поняли? Вы создаёте объект-ссылку на метод, передаёте его в метод
Invoke(), а тот уже в нужный момент вызывает метод полученный по ссылке и выбрасывает ставший ненужным делегат.
0
|
|
|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
|
| 30.11.2017, 12:32 [ТС] | |
|
Ну вот это и непонятно - почему вызывается еще раз делегат? Если нет работы с инвоками, а просто подписка на событие, то никаких новых экземпляров же не создается...Подписался, указал метод обработки события - и все.
0
|
|
|
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,039
|
||
| 30.11.2017, 12:46 | ||
Invoke() вызывается каждый раз, когда условие if(progressBar1.InvokeRequired) верно.Добавлено через 30 секунд И каждый раз создаётся новый делегат.
0
|
||
|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
|
| 30.11.2017, 13:04 [ТС] | |
|
Если не использовать несколько thread:
1. В классе-издателе создаю делегат; 2. На его основе создаю событие; 3. В нужном месте ставлю это событие и передаю ему аргумент; 4. В классе-подписчике просто указываю метод обработки. При использовании нескольких thread: 1. В классе-издателе создаю делегат; 2. На его основе создаю событие; 3. В нужном месте ставлю это событие и передаю ему аргумент; 4. В классе-подписчике указываю метод обработки с проверкой синхронизации; 5. Проверяю синхронизацию; 6. При необходимости синхронизации делаю рекурсию. Вот. Я вот так понимаю работу. Не могу понять только, почему в первом случае не требуется вызывать делегат в методе-обработчике, а во втором требуется. Или же в первом случае он где-то неявно спрятан?
0
|
|
|
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,039
|
||||||
| 30.11.2017, 13:29 | ||||||
|
PowerCat, так, кажется я догнал, что вас смутило... Не эта ли запись:
0
|
||||||
|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
|
| 30.11.2017, 13:31 [ТС] | |
|
о!
А вот это уже интересно. Для меня именно это и было объявлением делегата. Так. Теперь надо все переосмыслить.
0
|
|
|
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,039
|
||
| 30.11.2017, 13:34 | ||
|
Тут вы просто описываете, что в природе есть делегат с именем DelegateName ничего не возвращающий (void) и принимающий одну строку (String). А создавать их экземпляры нужно явно (new), и можно это делать в любом количестве (больше одного одновременно).
0
|
||
|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
|
| 30.11.2017, 13:36 [ТС] | |
|
Ок. Когда нет нескольких thread - где там создается новый экземпляр делегата? Если с несколькими thread явно видно NEW, то в первом случае - нет.
0
|
|
|
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,039
|
|
| 30.11.2017, 13:47 | |
|
PowerCat, экземпляры делегатов создаются там, где вы их создаёте. Это или
new DelegateName(метод) или лямбды (агрументы) => тело или иная форма анонимной функции (delegate (аргументы) { тело }).Если вы ничего не делаете, то ничего и не происходит. Объявление чего-то - это только объявление, а не принуждение к действию.
0
|
|
|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
||||||
| 30.11.2017, 14:22 [ТС] | ||||||
|
Ок.
В этом примере где создается экземпляр делегата?
0
|
||||||
|
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,039
|
|
| 30.11.2017, 14:37 | |
|
PowerCat, в строке №9.
Добавлено через 2 минуты На самом деле, там даже два делегата создаётся: делегат указывающий на метод, и новый делегат как комбинация переданного и старого события (событие - делегат, вы же помните?).
0
|
|
|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
||||||
| 30.11.2017, 14:55 [ТС] | ||||||
|
Посмотрел справочник. По нему строка 9 должна быть написана так:
0
|
||||||
|
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,039
|
|
| 30.11.2017, 15:09 | |
|
PowerCat, она так и выглядит. Форма записи
frm.NameHasBeenShown+=ShowName; - лишь синтаксический сахар, чисто для сокращения записи. Компилятор корректный код генерирует.
0
|
|
|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
|
| 30.11.2017, 15:11 [ТС] | |
|
ааа...ну тогда другое дело
В обоих случаях происходит создание нового экземпляра делегата. Вот теперь все понятно. А то было там так, а тут эдак...
0
|
|
|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
|
| 21.12.2017, 17:36 [ТС] | |
|
и опять возвращаясь к делегатам...
Да, я применил их для установки связи между threads, передал информацию...но: 1. Сделал это втемную, не особо понимая; 2. Уверен, что это лишь их побочное применение. Нашел это обсуждение на этом же форуме. Собственно вопрос у меня полностью такой же - а зачем они собственно нужны? Почему нельзя просто сразу указать необходимый метод? К сожалению нет объяснения "на пальцах" ![]() Добавлено через 41 минуту Смотрел еще вот этот пример. Так и не понял, автор вначале говорит, что если дополнять свитч, то потребуется перекомпиляция. А если использоваться делегаты - не потребуется??? Вот чисто визуально крохотный свитч занимает минимум места, по сравнению с применением делегатов.
0
|
|
|
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,039
|
|
| 21.12.2017, 18:09 | |
|
PowerCat, не вижу смысла вам это объяснять. Я вам уже несколько страниц в вашей прошлой теме расписывал всё на пальцах. Если всё ещё непонятно, то значит не судьба.
0
|
|
|
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
|
|
| 21.12.2017, 18:38 [ТС] | |
|
На пальцах была техническая часть, мне же непонятна практическая... Я более чем уверен, что абсолютно ВСЕ задавали этот вопрос. Т. е. зачем применять делегат, если можно явно указать метод
0
|
|
|
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,039
|
|
| 21.12.2017, 18:47 | |
|
PowerCat, я вам тоже этот момент объяснял: для вынесения части логики в виде настраеваемого аспекта. Мощь подхода в том, что вы не знаете, какой именно (и чей) метод вы вызываете. И сколько их вообще будет (делегат может ссылаться сразу на кучу разных методов, которые вызовет по очереди).
Array.Sort<T> - самый наглядный пример. В методе реализована только логика перебора элементов массива, но логика их сравнения вынесена из алгоритма и задаётся произвольно.
0
|
|
| 21.12.2017, 18:47 | |
|
Обработка событий формы в классе Вызов объектов формы в классе Расположение переменных в классе формы Функция класса не работает в классе формы Использование компонента формы в своем классе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|