С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/47: Рейтинг темы: голосов - 47, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 28

Передать ссылку на форму в конструкторе

18.08.2016, 16:18. Показов 9314. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть два файла Form1.cs и Protocol.cs, на форме Form1 располагается listBox1, в который выводятся отладочные сообщения при работе некоего протокола обмена. Как в класс Protocol передать ссылку на Form1, чтобы все методы класса Protocol могли записывать данные в listBox1?

Пока передаю в метод ссылку на this, и тогда метод BootloaderInit() записывает данные в listBox1. А хочется один раз, например в конструкторе или еще как.

Form1.cs
C#
1
2
3
4
5
6
7
8
9
10
namespace sSpace
{
    Protocol Boot = new Protocol();
 
    private void button1_Click(object sender, EventArgs e)
    {
            Boot.SerialPortConfig("COM8",115200);
            Boot.BootloaderInit(this);
    }
}
Protocol.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
namespace sSpace
{
  class Protocol
  {     
    public void SerialPortConfig() {};
    public void BootloaderInit(Form1 _frm) 
        {
        ...
            _frm.listBox1.Items.Add("Report") // В listBox1 выводим отчет. 
        ...
        }   
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.08.2016, 16:18
Ответы с готовыми решениями:

Передать форму как ссылку
Всем привет. Подскажите как можно передать форму, в которой на данный момент идет работа, в новый (мой) компонент как ссылку для работы с...

Как передать ссылку на форму (Синтаксическая ошибка: идентификатор "Form1")
Добрый день, работаю в Visual Studio 10. Надо передавать данные из одной формы в другую. Соответственно по рекомендации в конструкторе 2-й...

Передать метод в конструкторе
Имеется класс или структура подобного вида: struct Cmd { string name; Cmd cmds; int func(string params); //своя для...

9
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
18.08.2016, 17:31
Joint14, избитая тема, на которую отвечали тысячу раз и писали FAQ. Никакой ссылки на форму в классе Protocol быть не должно, там должно быть событие, на которое вы подписываетесь на форме и в его обработчике делаете все что нужно.
1
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 28
19.08.2016, 09:31  [ТС]
И на том спасибо, теперь читаю про события и делегаты.
А не сможет ли кто поподробнее объяснить, как мне сделать такое: допустим, что у меня есть одна форма Form1, на этой форме одна кнопка, в обработчике этой кнопки есть код, который по определенному протоколу выполняет запись в порт (SerialPort), например, записывает в порт один байт 7F (HEX) и в случае получения в ответ байта 79 (HEX), считается, что связь установлена. Это одно из действий, а действий может быть много (установить связь, стереть, прочитать, записать, верифицироать...). Это один из протоколов, самый примитивный, его использует аппаратный загрузчик, прошитый в системную память микроконтроллера. Поскольку протоколов (или действий) может быть несколько, а их действия аналогичны, то я решил создать отдельный файл Protocol01.cs и вынести в него все методы протокола 01, предполагается, что в файле Protocol02.cs будут методы протокола 02. Также на форме есть listBox, он используется для отображения обмена. Сейчас я через делегат могу печатать в listBox1 отчет, например
[09:26:34.567] Serial Port COM1 Opened
W: [09:26:35.175] 7F
R: [09:26:35.240] 79
Я вообще правильно думаю или можно как-то по-другому сделать?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.08.2016, 10:26
Joint14, из вашего описания я плохо понимаю, чем отличаются протоколы друг от друга и как все это используется. Возможно, там можно что-то от чего-то унаследовать, что-то упростить/объединить и тд. В целом, про то, чтобы сделать человекопонятный класс-обертку над работой с портом и байтами, конечно, мыслите правильно.
1
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 28
19.08.2016, 13:53  [ТС]
EvilFromHell, хочется сделать просто: нажимаем кнопку на форме и какой бы протокол не использовался (на данный момент достаточно одного протокола) - происходит обновление прошивки устройства через последовательный порт компьютера, а весь обмен (HEX-to-string) с метками времени виден в listBox1.

Добавлено через 3 минуты
Кому интересно, в конструктор передается делегат
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*В проекте два класса Program (Program.cs) и Class1 (Class1.cs).
В Program на форму добавлены button1 и listBox1, добавлен статический метод, 
который позволяет добавлять строку в listBox, через передачу ссылки на экземпляр listBox:*/
 
static void Print(ListBox lb, string s)
{
    if (lb != null) lb.Items.Add(s);
    else MessageBox.Show("lb==null");
} 
 
/*В классе Class1 объявлен делегат и в конструктор класса передается ссылка на делегат,
являющийся методм печати в listBox1.*/
 
public delegate void PrintDelegate(ListBox lb, string Str); // Тип делегата.
 
class Class1
{        
    private PrintDelegate print; // Cохраняет ссылку на делегат.
        
    public Class1(PrintDelegate print) // Конструктор.
    {
        this.print = print;
    }
 
    public void Method01(ListBox lb)
    {
        string s = "Method01";
        if (print != null) print(lb, s);
    }
 
    public void Method02(ListBox lb)
    {
        string s = "Method02";
        if (print != null) print(lb, s);
    }
}
 
/*В обработчике кнопки вызывается статический метод Print() и 
два метода  cl.Method01() и cl.Method02().*/
private void button1_Click(object sender, EventArgs e)
{
    Print(listBox1, "button1_Click"); // Вызов в обработчике статического метода.
 
    // Вызов метода класса cl с передачей ссылки на listBox1 (куда писать отчет).
    cl.Method01(listBox1);  
    cl.Method02(listBox1);
}
 
/*После нажатия на кнопку в listBox1 видим:
button1_Click
Method01
Method02*/
 
Т.о. методы cl.Method01() и cl.Method02() могут выполнять произвольные действия
и записывать отчет о работе в listBox1.
Может, коряво, но я пока не могу иначе.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.08.2016, 15:01
Что-то странное. Чем вас не устраивает стандартная модель событий? Почему в методы Class1 передается какой-то листбокс, хотя он там не используется? Контролы формы не должны передаваться в методы каких-то других классов. Class1 ничего не должен знать ни про какие формы и контролы. Почитайте эти FAQ. Там написано и про события, и про архитектуру вообще.
1
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 28
19.08.2016, 15:10  [ТС]
Спасибо! Почитаю! Проблема в том, что я вообще С-шник, пишу для микроконтроллеров, но периодически приходится писать маленькие приложения для Windows. Вот оттуда и непонимание ООП.
Мне всего-то нужно, чтобы класс в котором реализован протокол обмена (Windows-serialPort-Device) выводил команды с метками времени в listBox1 на Form1, это на время отладки, а потом я это уберу и обмен можно будет "наблюдать" в progressBar. Идея в хранении протоколов в отдельных *.cs файлах, в отдельных классах, а обмен можно наблюдать в родительской форме. Чтобы меньше править.

Что-то странное. Чем вас не устраивает стандартная модель событий? Почему в методы Class1 передается какой-то листбокс, хотя он там не используется?
Чтобы любой протокол, реализованный во внешнем файле мог выводить отладочную информацию в listBox1 формы, куда-то на форму он должен её выводить. Раньше я выводил в текстовый файл, но это не удобно, а здесь - идет обновление и мы видим процесс в listBox1.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.08.2016, 15:43
Цитата Сообщение от Joint14 Посмотреть сообщение
Чтобы любой протокол, реализованный во внешнем файле мог выводить отладочную информацию в listBox1 формы, куда-то на форму он должен её выводить. Раньше я выводил в текстовый файл, но это не удобно, а здесь - идет обновление и мы видим процесс в listBox1.
Joint14, ну вам всего лишь надо прочитать, что такое событие-именно эту задачу оно успешно решает. Ссылку на пример я уже кинул.
1
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 28
19.08.2016, 15:51  [ТС]
Цитата Сообщение от EvilFromHell Посмотреть сообщение
Joint14, ну вам всего лишь надо прочитать, что такое событие-именно эту задачу оно успешно решает. Ссылку на пример я уже кинул.
EvilFromHell, спасибо за ссылку и наставление! До событий я пока не дочитал, только до делегатов. Из событий пока знаю button1_Click и т.д., т.е. обработчики. А какие события нужно использовать в моем случае, чтобы передать отладочную информацию из классов (в которых реализованы протоколы) на форму в listBox1 пока не понимаю, совсем глухо!
Понятно, что на форме нажали кнопку и в обработчике вызвали метод класса (вызвали какую-либо функцию протокола), а дальше ничего не понимаю, какие у меня события должны быть?
Допустим, по кнопке отправили в порт байт 7F, отправили байт - произошло событие. Через некоторое время, например 50 мс, в порт пришел ответ 79. Приход в порт этого байта, вроде как должно быть событием. На это событие должен отреагировать listBox1, т.е. добавить в listBox1 строку вида
R:[Метка времени] 79. Пока не знаю, как это сделать (если я правильно предполагаю).
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
19.08.2016, 16:06
Joint14, ну что такое обработчик кнопки? У кнопки есть событие Click, которое вызывается тогда, когда на кнопку нажали. Но кнопка ничего не знает про класс формы, на которой будет обрабатываться это событие. Она просто инициирует событие и все. А на форме, или в абсолютно любом другом классе, можно подписаться на событие и выполнить тогда, когда оно произойдет, произвольный код. В результате и кнопка не зависит ни от чего, и нужный код на форме вызывается по ее клику.
Цитата Сообщение от Joint14 Посмотреть сообщение
А какие события нужно использовать в моем случае, чтобы передать отладочную информацию из классов (в которых реализованы протоколы) на форму в listBox1 пока не понимаю, совсем глухо!
Раз класс ваш, то и событие писать вам. В случае с кнопкой-ее события написаны майкрософтом.

Добавлено через 5 минут
Суть абсолютно та же, что и с делегатом, только гораздо удобнее синтаксически.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.08.2016, 16:06
Помогаю со студенческими работами здесь

Как в конструкторе класса передать параметром указатель на функцию?
Друзья! Вот тут всё понятно, есть класс, в котором приватная функция f_0, в конструкторе передаётся указатель на функцию f_1. Эта функция...

Не удается открыть форму в конструкторе в Visual Studio 2015
В процессе разработки была внезапно утрачена возможность использования конструктора для одной из форм. При этом код сохранился и все файлы...

Комбинация: обязательное поле в конструкторе таблиц и команда закрыть форму, не работает
Всем привет..) Так и должно быть, что команда DoCmd.Close acForm, закрывает форму без разговоров, минуя обязательные поля заданные в...

При попытке открыть форму в конструкторе, сообщается, что не найден setting.xml
Есть проект, он работает(перестраивается и запускается, согласно последним обновления логики), НО когда я пытаюсь открыть форму в...

Передать ссылку на this
Ключевое слово this ссылается на текущий экземпляр класса, а также используется в качестве модификатора первого параметра метода...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru