Форум на Kuban.ru (http://forums.kuban.ru/)
-   Разработка программ (http://forums.kuban.ru/f1024/)
-   -   Вопрос по С# (http://forums.kuban.ru/f1024/vopros_po_s-3418900.html)

WOLF DIABLO 11.12.2012 14:14

Вопрос по С#
 
Суть такая есть программа с несколькими формами, на главной форме есть компонента serial port , процедура обработки приема данных из порта ну и всякая фигня прочая ) не могу понять как с остальных форм обращаться к компонетам и процедурам главной формы.
вообще не могу даже условно взять текст с какого нить Лейбела.
как объявить обработчик принятых данных с порта, форму?

Sserj 12.12.2012 04:49

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

WOLF DIABLO 12.12.2012 07:48

1-Sserj >это то понятно))
как это сделать?
просто в дельфях например в интерфейс добавил и все не паришся насколько помню.
в VB тоже вроде объявил глобально и доступна.
а ту хз

Sserj 12.12.2012 10:57

(2) Ну к примеру сделай класс со статическими методами setFormWithPort и getFormWithPort() ну и внутри поле статическое с типом этой формы, туда его запихивай и доставай, можно конечно и просто поле открытое, но это как то не гламурно :)

Sserj 12.12.2012 11:06

3-Sserj > +
Вообще по хорошему это должен быть класс с контейнером где хранятся ссылки на все открытые формы твоей программульки и их можно былобы получать по какому-либо ключу, так тебе будет легко допустим обойти все открытые формы и сделать с ними что-нибуть, допустим свернуть или наоборот развернуть все, или "закрыть все окна", вывести что-то на передний план или открыть если чего-то не открыто, вообщем то что является нормой во всех MDI приложениях :)

spaceman 12.12.2012 12:36

Если WinForms, то:
1. Объявить нужный компонент на форме как public (либо создать public только get свойство, через которое давать ссылку на компонент).
2. Доступ к объекту формы организовать либо через Application.OpenForms, либо в Program.cs объявить public static свойство и в нем возвращать ссылку на главную форму. Пример:
-----
static class Program
**
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
**
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form1 v_main_form = new Form1();
MainForm = v_main_form;
Application.Run(v_main_form);
**

static Form1 MainForm ** get; private set; **
**
------
Если WPF, то доступ к главной форме через Application.MainWindow.
------
Мое ИМХО: если объект используется в нескольких формах приложения - его лучше не "кидать" на форму, а создавать как ресурс уровня всего приложения. Либо передавать его в другие формы через параметр конструктора формы в момент ее создания.

michaeljee 14.12.2012 14:46

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

WOLF DIABLO 17.12.2012 09:32

вроде разобрался всем спасибо

Naix 17.12.2012 18:42

Через делегаты можешь
Примерно так объявить:
//Описание делегатов для связи с главной формой и вывода сообщений из потоков
delegate void addText(string text);
// Добавление элемента в ListBox1
private void addItemToListBox1(string text)
**
listBox1.Items.Add(text);
**
Так вызывать:
if (listBox3.InvokeRequired)
**
listBox3.Invoke(new addText(addItemToListBox1), new object[] ** "Отключение клинета. IP: " + rep.Address.ToString() **);
**

Naix 17.12.2012 18:44

упс, немного разный код скопировал.
в вызове listBox[b]3[/b] заменить на listBox[b]1[/b] (подлежащее замене выделено жирным)


Текущее время: 02:16. Часовой пояс GMT +3.