Модератор 0
- 11.12.2012 - 14:14
|
Суть такая есть программа с несколькими формами, на главной форме есть компонента serial port , процедура обработки приема данных из порта ну и всякая фигня прочая ) не могу понять как с остальных форм обращаться к компонетам и процедурам главной формы. вообще не могу даже условно взять текст с какого нить Лейбела. как объявить обработчик принятых данных с порта, форму? | |
1
- 12.12.2012 - 04:49
| Ну как бы и как везде в ООП, у тебя должна быть ссылка на эту форму, чтобы вызывать ее методы и свойства. Тобишь либо при создании этой формы присваивать ее какой-нибуть статической общедоступной переменной, либо передавать при создании других форм ссылку на нее, ну или еще как извратиться. | |
Модератор 2
- 12.12.2012 - 07:48
|
1-Sserj >это то понятно)) как это сделать? просто в дельфях например в интерфейс добавил и все не паришся насколько помню. в VB тоже вроде объявил глобально и доступна. а ту хз | |
3
- 12.12.2012 - 10:57
| (2) Ну к примеру сделай класс со статическими методами setFormWithPort и getFormWithPort() ну и внутри поле статическое с типом этой формы, туда его запихивай и доставай, можно конечно и просто поле открытое, но это как то не гламурно :) | |
4
- 12.12.2012 - 11:06
|
3-Sserj > + Вообще по хорошему это должен быть класс с контейнером где хранятся ссылки на все открытые формы твоей программульки и их можно былобы получать по какому-либо ключу, так тебе будет легко допустим обойти все открытые формы и сделать с ними что-нибуть, допустим свернуть или наоборот развернуть все, или "закрыть все окна", вывести что-то на передний план или открыть если чего-то не открыто, вообщем то что является нормой во всех MDI приложениях :) | |
5
- 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(fals e); Form1 v_main_form = new Form1(); MainForm = v_main_form; Application.Run(v_main_form); ** static Form1 MainForm ** get; private set; ** ** ------ Если WPF, то доступ к главной форме через Application.MainWindow. ------ Мое ИМХО: если объект используется в нескольких формах приложения - его лучше не "кидать" на форму, а создавать как ресурс уровня всего приложения. Либо передавать его в другие формы через параметр конструктора формы в момент ее создания. | |
6
- 14.12.2012 - 14:46
|
Привет Это здорово, это удивительный информацию, я также искал для этого. С уважением | |
Модератор 7
- 17.12.2012 - 09:32
| вроде разобрался всем спасибо | |
8
- 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() **); ** | |
9
- 17.12.2012 - 18:44
|
упс, немного разный код скопировал. в вызове listBox3 заменить на listBox1 (подлежащее замене выделено жирным) | |
| Интернет-форум Краснодарского края и Краснодара |