1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
1

Как организовать обмен переменными между Form и Program

10.09.2014, 12:40. Показов 4745. Ответов 27
Метки нет (Все метки)

Здравствуйте, может быть вопрос будет несколько сумбурным, или вообще это невыполнимо, т.к. я ещё новичок...
Я сейчас пытаюсь разобраться в примерах серверно-клиентских программ. Задача такова, что вместо консоли в клиентском приложении мне нужно использовать форму. Но как организовать обмен переменными между Form и Program - я не знаю (искал, находил только миллион тем об обмене данными между формами).
Вот пример кода, в котором мне необходимо изменить строки 32, 37, 69 так, чтобы вместо консоли они передавали переменные в форму, а в 58 строке приостановить выполнение до получения переменной из формы, и продолжить после её получения:

Program.cs
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text;
using System.Net;
using System.Net.Sockets;
 
namespace SocketInterface
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        //[STAThread]
 
        private const int port = 11000; // порт посыла сетевых команд
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
 
            try
            {
                SendMessageFromSocket(port);
            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex.ToString());
                // Вместо консоли передать переменную в форму
            }
            finally
            {
                //Console.ReadLine();
                // Вместо консоли передать переменную в форму
            }
        }
 
            public static void SendMessageFromSocket(int port) 
            {
                // Буфер для входящих данных
                byte[] bytes = new byte[1024];
 
                // Соединяемся с удаленным устройством
 
                // Устанавливаем удаленную точку для сокета
                IPAddress localAddress = IPAddress.Parse("127.0.0.1");
                Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint ipEndPoint = new IPEndPoint(localAddress, port);
 
                // Соединяем сокет с удаленной точкой
                sender.Connect(ipEndPoint);
 
                //Console.Write("Введите сообщение: ");
                string message = Console.ReadLine(); //Вместо консоли приостановить выполнение до получения переменной из формы, продолжить после получения переменной.
                
                //Console.WriteLine("Сокет соединяется с {0} ", sender.RemoteEndPoint.ToString());
                byte[] msg = Encoding.UTF8.GetBytes(message);
 
                // Отправляем данные через сокет
                int bytesSent = sender.Send(msg);
 
                // Получаем ответ от сервера
                int bytesRec = sender.Receive(bytes);
 
                //Console.WriteLine("\nОтвет от сервера: {0}\n\n", Encoding.UTF8.GetString(bytes, 0, bytesRec));
                // Вместо консоли передать переменную в форму
                
                // Используем рекурсию для неоднократного вызова SendMessageFromSocket()
                if (message.IndexOf("<TheEnd>") == -1)
                SendMessageFromSocket(port);
 
                // Освобождаем сокет
                sender.Shutdown(SocketShutdown.Both);
                sender.Close();
            }
        
    }
}
В форме единственная кнопка, которая должна передать переменную в Program, которая ожидается в 58 строке:

Form1.cs:
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace SocketInterface
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // Передать переменную в Program
            //message = "check";
        }
    }
}
Помогите пожалуйста с этим разобраться, трудно мне в моём уже не гибком 37-летнем мозге всё это правильно уложить

Спасибо
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2014, 12:40
Ответы с готовыми решениями:

Как организовать обмен данными между приложениями по интернету
Здравствуйте! Подскажите пожалуйста, каким образом можно организовать обмен данными между...

Обмен данными между проектами, как правильно организовать
Доброго времени суток. Есть два проекта в solution. Первый является сервером и собирает информацию...

Как организовать непрерывный обмен между сокетами без переподключения?
Есть примеры синхронных клиента и сервера с использованием сокетов. А мне нужно организовать обмен...

Как передать данные между Program.cs и Form1.cs ?
Как передать данные между Program.cs и Form1.cs? Вот примерный код, того что необходимо...

27
111 / 111 / 13
Регистрация: 01.10.2012
Сообщений: 2,228
10.09.2014, 13:13 2
Ответы на 7 самых частых вопросов по WinForms
0
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
10.09.2014, 13:41  [ТС] 3
Sonyk91, и что? опять же передача из формы в форму, или в конструктор, нет ни одной записи, как сделать из формы в програм, нет ничего об приостановке до получения переменной.
Плохой ответ , смотрел я эту ссыль по приходу на форум.

Добавлено через 9 минут
Хорошо, мои рассуждения таковы: для передачи переменной из Program в форму, я использую public Form1(string data) (опять же сработает ли это ведь передаю не из формы), для ожидания переменной я использую присвоение ей нулевого значения и по условию буду проверять пуста она или нет, но приостановить try я не смогу, он будет выполняться (не думаю, что это верно). Но вопрос по передаче из формы в програм остаётся нерешённым.
0
1085 / 829 / 489
Регистрация: 09.04.2014
Сообщений: 1,965
10.09.2014, 13:50 4
Цитата Сообщение от Lazebin Посмотреть сообщение
необходимо изменить строки 32, 37, 69 так, чтобы вместо консоли они передавали переменные в форму, а в 58 строке приостановить выполнение до получения переменной из формы,
Ваша программа остановится в строке 24
C#
1
Application.Run(new Form1());
пока окно Form1 не закроется, так что говорить о форме в последующих строках не приходится
0
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
10.09.2014, 13:58  [ТС] 5
nedel, ну уже хоть что-то проясняется. Другими словами - лучше всё что написано после 24-й строки написать прямо в форме?
0
1085 / 829 / 489
Регистрация: 09.04.2014
Сообщений: 1,965
10.09.2014, 14:12 6
Цитата Сообщение от Lazebin Посмотреть сообщение
всё что написано после 24-й строки написать прямо в форме?
можно и так
1
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
10.09.2014, 14:16  [ТС] 7
nedel, не хотелось бы, но вижу так проще будет
0
1085 / 829 / 489
Регистрация: 09.04.2014
Сообщений: 1,965
10.09.2014, 14:19 8
а можно иначе:


port у вас и так костанта - можно его не передавать методу, а передать только message
C#
1
2
3
4
public static void SendMessageFromSocket(string message) 
{
...
}
в форме вызвать статический метод
C#
1
2
3
4
5
private void button1_Click(object sender, EventArgs e)
        {
            string message = "check";
            Program.SendMessageFromSocket(message);
        }
Добавлено через 1 минуту
метод Main, конечно, должен заканчиваться 24 строкой
1
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
10.09.2014, 14:32  [ТС] 9
Кажется начинаю понимать, теперь только не понятно, где мне код написать, чтобы не останавливался после 24-й строки, или уже не критично?

Добавлено через 3 минуты
Ведь я так понимаю метод вызывается уже с кнопки...

Добавлено через 3 минуты
А try мне нужно обернуть в метод, и инициализировать его?
0
1085 / 829 / 489
Регистрация: 09.04.2014
Сообщений: 1,965
10.09.2014, 14:34 10
C#
1
2
3
4
5
6
static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
         }
это все что нужно для запуска программы, строка Application.Run(new Form1()); будет обрабатываться пока окно не закроется.
Код взаимодействия с пользователем пишем в классе формы, остальной - в дополнительных (вспомогательных классах), публичные методы которых вызываем из той же формы
0
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
10.09.2014, 14:38  [ТС] 11
Похоже он try вообще уже не нужен Оо
0
1085 / 829 / 489
Регистрация: 09.04.2014
Сообщений: 1,965
10.09.2014, 14:46 12
Лучший ответ Сообщение было отмечено Lazebin как решение

Решение

Цитата Сообщение от Lazebin Посмотреть сообщение
Похоже он try вообще уже не нужен Оо
нужен но не там
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
           string message = "check";
            SendMessage(message);
        }
        void SendMessage(string message)
        {
           try
            {
               Program.SendMessageFromSocket(message);
            }
            catch(Exception ex)
            {
               // тут обрабатываем исключение, на пример выводим сообщение о ошибке
            }
         }
    }
2
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
10.09.2014, 20:38  [ТС] 13
Всё заработало, спасибо, nedel.

Добавлено через 5 часов 50 минут
Даже не знаю какой ответ поставить лучшим, всё прояснялось по мере диалога
0
1085 / 829 / 489
Регистрация: 09.04.2014
Сообщений: 1,965
10.09.2014, 21:35 14
Цитата Сообщение от Lazebin Посмотреть сообщение
Даже не знаю какой ответ поставить лучшим
Это не обязательно, тем более что речь тут шла о азах
0
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
11.09.2014, 04:18  [ТС] 15
Всё таки вопрос о передаче переменной из Program в Form1 остаётся не решённым... Я проколупался с примерами из пресловутой темы о "семи вопросах", и что у меня вышло...

1. Я попытался использовать:
C#
1
2
3
            Form1 child = new Form1();
            child.textBox5.Text = "Отправляемый в форму текст";
            child.Show();
Да! Всё отлично сработало, но только у меня создалась ещё одна идентичная форма, и каждый раз получая ответ от сервера клиент плодил новую форму, попытки изменить синтаксис убирая new, подставляя this. ... не дали результатов, одни ошибки, как изменить, чтобы использовать существующую форму - не знаю.

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
//Program.cs
...
...
namespace SocketInterface
{
    static class Data
    {
        public static string Value { get; set; }
    }
    static class Program
    {
...
...
Data.Value = Encoding.UTF8.GetString(bytes, 0, bytesRec);
...
...
 
 
//Form.cs
...
...
        public void ReadOtvet() // Этот метод 
        {
            textBox5.Text = Data.Value;
        }
...
...
Т.к. он мне показался проще и интереснее, но ничего ровно не произошло причём ссылки на Data.Value прекрасно создались и "соединились" в новом классе, однако в текстбоксе ничего так и не отобразилось.

Ну и напоследок, я попробовал реализовать всё по аналогии Program.SendMessageFromSocket(message); как показал в примере уважаемый nedel, однако Form1.ReadOtvet(otvet) не соглашалась создавать ссылку для нестатического класса, пробовал менять, тут уж textBox5 начинает возмущаться, в общем я в тупике.
0
306 / 283 / 102
Регистрация: 06.05.2014
Сообщений: 861
11.09.2014, 10:30 16
А разреши поинтересоваться - зачем вообще "общаться" с Programm.cs? Не проще ли реализовать логику в коде формы, а в Programm оставить только Main для запуска программы, т.е. создания формы?
0
1085 / 829 / 489
Регистрация: 09.04.2014
Сообщений: 1,965
11.09.2014, 10:58 17
Покажите код целиком, а то не совсем понятно что вы сделали
0
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
11.09.2014, 11:08  [ТС] 18
Цитата Сообщение от BozKurt Посмотреть сообщение
А разреши поинтересоваться - зачем вообще "общаться" с Programm.cs? Не проще ли реализовать логику в коде формы, а в Programm оставить только Main для запуска программы, т.е. создания формы?
Конечно же можно и так, но я так ничему не научусь. Мне нужно понять способы миграции данных между формами и программами, а может я ещё консоль решу привязать и передавать данные туда. Я ж не курсовую делаю, я хочу понять и изучить. О как оно.
0
306 / 283 / 102
Регистрация: 06.05.2014
Сообщений: 861
11.09.2014, 11:18 19
Сейчас ты не делаешь "миграцию данных" между "формами и программами", а занимаешь ерундой, не понимая того, что код выполняется в одном потоке и пока форма открыта, то ниже строки вызова этой формы код не сдвинется.
А передача данных между формами - это совсем другое. Вот создай две формы - и наладь между ними передачу данных, скажем из одного TextBox'а в другой, вот тогда можно будет о чём-то говорить...
0
1 / 1 / 2
Регистрация: 28.08.2014
Сообщений: 68
11.09.2014, 11:30  [ТС] 20
BozKurt, это мы уже разобрали выше, сейчас другая проблема уже, почитайте все сообщения.

Добавлено через 1 минуту
Цитата Сообщение от nedel Посмотреть сообщение
Покажите код целиком, а то не совсем понятно что вы сделали
nedel, какой из них? Я сегодня ночью их все перепробовал

Ну да в общем то у меня сейчас последний вариант основанный на вашем примере:

Program.cs:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text;
using System.Net;
using System.Net.Sockets;
 
namespace SocketInterface
{
 
    //static class Data
    //{
    //    public static string Value { get; set; }
    //}
    public class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
 
        private const int port = 11000; // порт посыла сетевых команд
 
        // Клиентская часть -----------------------------------------------------------------------------------
        public static void SendMessageFromSocket(string message)
        {
            // Буфер для входящих данных
            byte[] bytes = new byte[1024];
 
            // Соединяемся с удаленным устройством
 
            // Устанавливаем удаленную точку для сокета
            IPAddress localAddress = IPAddress.Parse("127.0.0.1");
            Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ipEndPoint = new IPEndPoint(localAddress, port);
 
            // Соединяем сокет с удаленной точкой
            sender.Connect(ipEndPoint);
 
            byte[] msg = Encoding.UTF8.GetBytes(message);
 
            // Отправляем данные через сокет
            int bytesSent = sender.Send(msg);
 
            // Получаем ответ от серверa
            int bytesRec = sender.Receive(bytes);
            string otvet = Encoding.UTF8.GetString(bytes, 0, bytesRec);
            
            SendOtvet(otvet);
 
            
            //Data.Value = Encoding.UTF8.GetString(bytes, 0, bytesRec);
 
            //Form1 child = new Form1();
            //child.textBox5.Text = "sdgsdg";
            //child.Show();
 
            // Освобождаем сокет
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();
        }
        // ----------------------------------------------------------------------------------------------------
        
        // Передача в текстовое поле ------------------------------------------------------------------------
        static void SendOtvet(string otvet)
        {
            try
            {
                Form1.ReadOtvet(otvet);
            }
            catch (Exception ex)
            {
                // тут обрабатываем исключение, на пример выводим сообщение о ошибке
            }
        }
    }
}
57-я строка вызывает метод SendOtvet организованный в строках 73-83, в 77-й строке я вызываю метод ReadOtvet уже в форме и передаю в него переменную otvet... Далее в форме:

Form1.cs
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
56
57
58
59
60
61
62
63
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace SocketInterface
{
    public partial class Form1 : Form
    {
        //string message;
        void SendMessage(string message)
        {
            try
            {
                Program.SendMessageFromSocket(message);
            }
            catch (Exception ex)
            {
                // тут обрабатываем исключение, на пример выводим сообщение о ошибке
            }
        }
        public Form1()
        {
            InitializeComponent();
            //ReadOtvet();
        }
 
        private void button1_Click_1(object sender, EventArgs e)
        {
            string message = "on";
            SendMessage(message);
        }
 
...
...
...
// Вместо троеточий тут обработка событий 23-х кнопок по аналогии с первой, я их не стал вставлять, по понятным причинам :)
...
...
...
 
        // Присвоение значения тестовому полю -----------------------------------------------------------------
        //static void textsend(string serverotv)
        //{
        //    textBox5.Text = serverotv;
        //}
        // ----------------------------------------------------------------------------------------------------
 
        // чтение ответа от сервера из клиентской части -------------------------------------------------------
        public static void ReadOtvet(string otvet)
        {
            string serverotv = otvet;
            //textsend(serverotv); 
            textBox5.Text = serverotv;
        }
        // ----------------------------------------------------------------------------------------------------
    }
}
Я принимаю значение otvet в метод ReadOtvet и пытаюсь присвоить её значение текстовому полю textBox5 (добавление новой переменной было основано serverotv на попытке передать её в другой метод, вообще она не нужна). В общем ругается 59-я строка, говорит что: "Ошибка 3 Для нестатического поля, метода или свойства "SocketInterface.Form1.textBox5" требуется ссылка на объект бла-бла-бла", если пытаюсь менять на public и т.д. чтоб не ругалась - тогда ругается 57-я строка в Program.cs

Хотя, конечно, мне больше по нраву public static string Value { get; set; } могу описать как я делал его...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2014, 11:30
Помогаю со студенческими работами здесь

Windows Form как организовать поток, или что-то ещё
Добрый день. Есть маленький вопрос по поводу работы потока на протяжении работы мультиформенного...

Как организовать обмен данными между двумя контроллерами
Заранее извиняюсь за нубский вопрос. Есть два микроконтроллера, шина данных (порты A, B), линия...

Как организовать кроссплатформенный обмен данных между процессами?
Добрый день всем посетившим! Мне нужно передать буфер char-ов из callback-функции cUrl-а в...

обмен между 2-мя строковыми переменными
Составить на ассемблере программу обмена между двумя строковыми переменными размером в 12 байт...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru