Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/20: Рейтинг темы: голосов - 20, средняя оценка - 4.80
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464

Прицепить делегатов в классе формы

13.11.2017, 14:55. Показов 4876. Ответов 113
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую. Начал снова учить делегатов.
Хочу сделать следующее - есть форма и 2 текстовых бокса.
При нажатии на кнопку в классе формы создаю 2 события на основании двух делегатов, в которые пойдут данные из текстбоксов.
И делаю еще класс, который должен через делегатов принять эти значения. Т.е. чтобы форма не знала об этом классе хочу добиться.
Но не могу понять, как обратиться из второго класса к моим событиям.

Код в классе формы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
namespace _1.Test_1
{
     public partial class frm_Main : Form
     {
          public delegate void DelegateName(string someString);
          public delegate void DelegateAge(double someDouble);
 
          public event DelegateAge GotAge;
          public event DelegateName GotName;
 
 
          public frm_Main()
          {
               InitializeComponent();
          }
 
          private void button1_Click(object sender, EventArgs e)
          {
               string name=txt_Age.Text;
               double age=Convert.ToDouble(txt_Age.Text);
 
               GotName(name);
               GotAge(age);
 
          }
     }
}
Код в классе-перехватчике:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
namespace _1.Test_1
{
     class Controller
     {
          public void Main()
          {
               frm_Main:Form frm=new frm_Main();//Это вряд ли правильно
 
               //Тут надо подписаться на события (если я правильно это называю)
 
          }
 
          private void ShowAge(double age)
          {
               MessageBox.Show("Возраст "+age);
          }
          
          private void ShowName(string name)
          {
               MessageBox.Show("Имя "+name);
          }
 
     }
}
Миниатюры
Прицепить делегатов в классе формы  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.11.2017, 14:55
Ответы с готовыми решениями:

С формы прицепить файл PDF в поле OLE
Подскажите, гуру access. Нужно пристегнуть файл PDF в таблицу в поле OLE. Перед этим файл с компьютера пользователя копируется...

Перетаскиванием Image c формы прицепить его к узлу дерева
Привет. Борюсь уже некоторое время с постигшей меня бедой. Никак не могу увязать Image и сабж. Нужно перетаскиванием Image c формы...

Как обращаться к компонентам формы в классе, не прописывая везде имя формы
Добрый вечер. Имеем одну форму (Class Form2), ну или две как у меня, было принято решение раскидать часть ее кода в четыре новых модуля. ...

113
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
28.11.2017, 11:17  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Usaga Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
          private static void SetProgressBar(int counter)
          {
               if(pBar.InvokeRequired)
               {
                    pBar.Invoke(new Action(() => SetProgressBar(counter));
               }
               else
               {
                    pBar.Value=counter*10;
               }
          }
Приветствую. Написал личное сообщение.
Еще подскажите плз - может где-то есть советы по написанию не говнокода? Ну вот как ваш совет по хранению переменных в отдельном классе...может есть небольшой перечень подобных советов?
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
28.11.2017, 11:34  [ТС]
Благодарю
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
28.11.2017, 15:30  [ТС]
Не задалось опять. Вроде все правильно :
C#
1
2
3
4
5
6
7
8
9
10
11
          public void Start(Variables variables)
          {
               Thread thread=new Thread(new ParameterizedThreadStart(LongProcess));//Здесь ругается 
               thread.Start(variables);
          }
 
 
          private void LongProcess(Variables variables)
          {
 
          }
Миниатюры
Прицепить делегатов в классе формы  
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
28.11.2017, 16:40
PowerCat, посмотрите внимательно на сигнатуру этого делегата, а потом на сигнатуру метода LongProcess.
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
28.11.2017, 16:54  [ТС]
ну вроде все как в примере отсюда

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 Thread myThread = new Thread(new ParameterizedThreadStart(Count));
        myThread.Start(number); 
 
        for (int i = 1; i < 9; i++)
        {
            Console.WriteLine("Главный поток:");
            Console.WriteLine(i * i);
            Thread.Sleep(300);
        }
 
        Console.ReadLine();
    }
 
    public static void Count(object x)
    {
        for (int i = 1; i < 9; i++)
        {
            int n = (int)x;
 
            Console.WriteLine("Второй поток:");
            Console.WriteLine(i*n);
            Thread.Sleep(400);
        }
    }
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
28.11.2017, 18:06
PowerCat, это корретный пример. А ваш код - нет. ParameterizedThreadStart ждёт метод принимающий object. Пример выше это условие выполняет, а ваш код - нет.
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
28.11.2017, 19:54  [ТС]
Так, тогда я что-то потерялся...Я делал обычно отдельный thread без аргументов, и без делегата в явном виде, просто писал new Thread (ссылка).Start() и все работало в десятках прог...
А тут откуда взялся объджект? Или оно, если с аргументами, всегда объджект будет хотеть? Конкретный аргумент не примет?
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
28.11.2017, 20:25
Цитата Сообщение от PowerCat Посмотреть сообщение
Конкретный аргумент не примет?
"Оно" примет только то, что указано в сигнатуре делегата:
Миниатюры
Прицепить делегатов в классе формы  
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
28.11.2017, 20:26
Надеюсь так понятно? Или нужно ещё десять раз объяснить про сигнатуру и что она имеет значение и что на неё нужно посмотреть, чтобы понять что и куда?)
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
29.11.2017, 09:27  [ТС]
о, ну дык это ж надо было бы смотреть справку по этому делегату, а я смотрел пример...
с сигнатурой все понятно, когда делегат сам делаешь, вопросов нет...а тут нечто нечтовое )
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
29.11.2017, 09:59
Цитата Сообщение от PowerCat Посмотреть сообщение
о, ну дык это ж надо было бы смотреть справку по этому делегату
Да блин, я уже раза три сказал, что сигнатуру делегата (как и любого метода) можно прямо в студии посмотреть просто установив курсор ввода на нужном методе\делегате и нажав F12. Неужели это что-то адово сложное?
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
29.11.2017, 14:56  [ТС]
Ого, круто!
Не знал об этом )

Добавлено через 4 часа 52 минуты
Программа работает как задумывал. Всех оказавших помощь благодарю, особенно Юсагу.
Однако так до конца разобраться с делегатами не смог, а именно с кросс нитями. Вот в этом примере не понимаю:
1. Почему вызывается новый экземпляр делегата в классе-подписчике. Ведь аргумент передается в готовый экземпляр событие Progress
2. Почему сам делегат в классе-издателе описывается "выше" класса...и если его описать в классе, то не получается потом из класса-подписчика вызвать его через new класс-подписчик.делегат

Конструкция рекурсии вопросов не вызывает.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public delegate void ProgressHandler (int progress);
 
    public class FileProcessor
    {
        public event ProgressHandler Progress;
 
        public void DoWork()
        {
            for (int i = 1; i <= 100; ++i)
            {
                Thread.Sleep(100);
                if (Progress != null)
                    Progress(i);
            }
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private void btnStart_Click(object sender, EventArgs e)
        {
            var processor = new FileProcessor();
            processor.Progress += ProcessorProgress;
 
            var thread = new Thread(processor.DoWork);
            thread.Start();
        }
 
        void ProcessorProgress(int progress)
        {
            if(progressBar1.InvokeRequired)
            {
                progressBar1.Invoke(new ProgressHandler(ProcessorProgress), progress);
            }
            else
            {
                progressBar1.Value = progress;                
            }
        }
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
29.11.2017, 17:28
Цитата Сообщение от PowerCat Посмотреть сообщение
1. Почему вызывается новый экземпляр делегата в классе-подписчике. Ведь аргумент передается в готовый экземпляр событие Progress
Если честно, то я не распарсил эти два предложения. Поэтому ответ - 42.

Цитата Сообщение от PowerCat Посмотреть сообщение
2. Почему сам делегат в классе-издателе описывается "выше" класса...и если его описать в классе, то не получается потом из класса-подписчика вызвать его через new класс-подписчик.делегат
Делегат не обязан описываться "выше". Его можно и описать "ниже" и в самом классе.
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
29.11.2017, 17:42  [ТС]
Да это все из-за того, что я не понял полностью работу с делегатами...буду еще другую литературу смотреть, не только Троелсена.
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
29.11.2017, 19:27
PowerCat, делегат - ссылка на метод. Что в этом такого сложного для понимания?
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
30.11.2017, 09:02  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
PowerCat, делегат - ссылка на метод. Что в этом такого сложного для понимания?
Это понятно, когда применяется именно в этом ключе.

А когда идет обмен данными между разными thread через делегатов, то тут все становится мутнейшим...Откуда-то появляются обращения к новому экземпляру делегата, а не к тому, через которого событие работает, да и делегат объявляется выше, а при объявлении в классе не работает...

А просто применить делегат в виде простой ссылки на метод - вопроса нет...
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
30.11.2017, 09:11
Цитата Сообщение от PowerCat Посмотреть сообщение
А когда идет обмен данными между разными thread через делегатов
Если речь о конструкторе Thread, то там нет никакого обмена данными. Вы так указываете потоку какой метод нужно выполнить.
0
 Аватар для PowerCat
0 / 2 / 1
Регистрация: 19.09.2013
Сообщений: 464
30.11.2017, 09:48  [ТС]
неосознанно я это понимаю, понимаю синхронизацию, рекурсию. НО - почему именно вот такая конструкция - непонятно. Т.е. в примерах, у того же Троелсена, написано КАК, но не расписано ПОЧЕМУ именно ТАК...Т.е. не написано, почему вызывается новый экземпляр делегата и т.д.
Вот расписал бы он построчно, что делает каждая операция и почему тут применяется именно она...
0
Эксперт .NET
 Аватар для Usaga
14784 / 9558 / 1366
Регистрация: 21.01.2016
Сообщений: 36,044
30.11.2017, 12:11
PowerCat, что вы понимаете под "новым экземпляром делегата" и где вы это видите?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2017, 12:11

Обработка событий формы в классе
Я создаю библиотеку, в ней одна форма MyForm и модуль класса MyClass. В форме объявлено событие Public Event OkClicked()Событие...

Вызов объектов формы в классе
Может слегка не корректно описал вопрос. В общем есть программа и нужно в функциях класса использовать элементы формы. Unit1.cpp ...

Расположение переменных в классе формы
Есть код. { public partial class Form4 : Form { public Form4() {

Функция класса не работает в классе формы
Пытаюсь описать функцию для подсчёта суммы чисел. using System; using System.Collections.Generic; using System.ComponentModel; ...

Использование компонента формы в своем классе
Здравствуйте у меня такой вопрос, можно ли как нибудь использовать компонент формы в своем классе?


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
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: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru