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

Считать данные с одного класса и использовать их в другом классе

27.10.2015, 10:01. Показов 1902. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть два класса в программе - 1. Window Form со всеми контролс и переменными и 2. Асинхронный TCP. Сейчас в TCP можно написать строчку и передать ее серверу, все работает. Я захотел использовать строчку из 1-го класса во 2-м классе.
Моя логика такая: у меня в программе таймер, переменные все время обновляются, но начнем с простого. Например, нужно просто передать глобальную переменную A из класса 1 (FormM) в класс 2. Тогда я могу написать так во втором классе:
Code
1
2
FormM myClass1 = new FormM();
        public string Ipart = myClass1.A;
Оказывается, передать так нельзя. Ошибка
Error 1 A field initializer cannot reference the non-static field, method, or property 'Bin_creator.AsynchronousClient.myClass1 ' C:\Users\engineer\Desktop\Step1_binFFT_v 2\LAST_Version_Workable_OFDM_TCP\Bin_cre ator_4OFDM_TCP\Bin_creator\FormM.cs 495 31 Bin_creator
Можно я Вас немного поспрашиваю? Прежде всего, как мне получить в Ipart значение A?

Добавлено через 9 минут
Кстати, если можно использовать переменную глобально не в классе, а во всех классах - то есть что объявил ее где-то в закоулках WF и все, то было бы вообще шикарно. Потому-что, заходя немного вперед, она меняется каждые 100мс, например, и, в конце концов, нужно фиксировать и передавать все изменения этой переменной по TCP.

Добавлено через 21 минуту
Уже кучу тем прочитал. Не помогает. Например, пробовал, как здесь Видимость переменной класса в другом классе, пишет на
C#
1
2
AsynchronousClient myClass2 = new AsynchronousClient();
        myClass2.Ipart = "21";
Error 1 Invalid token '=' in class, struct, or interface member declaration C:\Users\engineer\Desktop\Step1_binFFT_v 2\LAST_Version_Workable_OFDM_TCP\Bin_cre ator_4OFDM_TCP\Bin_creator\FormM.cs 33 24 Bin_creator

Error 2 'Bin_creator.FormM.myClass2' is a 'field' but is used like a 'type' C:\Users\engineer\Desktop\Step1_binFFT_v 2\LAST_Version_Workable_OFDM_TCP\Bin_cre ator_4OFDM_TCP\Bin_creator\FormM.cs 33 9 Bin_creator
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.10.2015, 10:01
Ответы с готовыми решениями:

Передача полей одного класса для редактирования в другом классе
Приятного времени суток. Есть такая задача: нужно передать поля одного класса для редактирования в другом классе (оба класса -...

При создании экземпляра класса в другом классе вылазит ошибка переполнения
using System; using System.Drawing; namespace WindowsFormsApplication4 { /// <summary> /// ИИ /// </summary> ...

Как использовать объект класса, созданого в определеном классе, в другом классе
У меня такой вопрос,как использовать объект класса,созданого в определеном классе,в другом классе.У меня есть объект pl класса Player,это...

2
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
27.10.2015, 11:05
Цитата Сообщение от lennen Посмотреть сообщение
Кстати, если можно использовать переменную глобально не в классе, а во всех классах - то есть что объявил ее где-то в закоулках WF и все, то было бы вообще шикарно.
помогут статические элементы. Например, можно сделать класс со статическими полями.
C#
1
2
3
4
5
static class GlobalData
{
    public static string A;
    public static int N;
}
Обращаться к таким переменным можно через имя класса, т.е.
C#
1
2
public string Ipart = GlobalData.A;
GlobalData.N=42;
0
0 / 0 / 2
Регистрация: 14.09.2014
Сообщений: 123
28.10.2015, 13:22  [ТС]
Тогда что я могу не понимать?
У меня два класса:


C#
1
2
3
4
5
6
7
8
9
10
11
public partial class FormM : Form
    {AsynchronousClient myClass2 = new AsynchronousClient();
        public static int N = 12345;
}
 
 
public class AsynchronousClient
    {
FormM myClass1 = new FormM();
        public static int i11 = myClass1.N;
 ...}
Error 1 An object reference is required for the non-static field, method, or property 'Bin_creator.AsynchronousClient.myClass1 ' C:\Users\engineer\Desktop\Step1_binFFT_v 2\LAST_Version_Workable_OFDM_TCP\Bin_cre ator_4OFDM_TCP\Bin_creator\FormM.cs 498 33 Bin_creator
Добавлено через 32 минуты
Так, я разобрался! static - ключевое слово) Теперь перейдем к более сложной версии этого вопроса. У меня программа запускается при нажатии на кнопку:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void button1_Click(object sender, EventArgs e)
        {
            tmr.Enabled = !tmr.Enabled;
            button1.Text = tmr.Enabled ? "Стоп" : "Старт";
            button1.ForeColor = tmr.Enabled ? Color.Green : Color.DarkRed;
 
            AsynchronousClient myClass = new AsynchronousClient();
            myClass.StartClient();
 
            B.Clear(); Bdig.Clear(); difcod.Clear(); Ipart.Clear(); Qpart.Clear();
            itmr = 1; nSymbol = 1; 
 
            A = richTextBox1.Text;      //Исходное сообщение
            for (int i = 0; i < A.Length; i += 225)
            {
                B.Add(((A.Length - i) < 225) ? A.Substring(i).PadRight(225, '\0') : A.Substring(i, 225));
                nSymbol++;
            }
        }
Как видно, она вызывает функцию с класса AsynchronousClient, которая отвечает за TCP. дальше в классе FormM происходит работа по таймеру - каждые 500 мс генерируются новые массивы данных:
C#
1
 void tmr_Tick(object sender, EventArgs e) { }
Здесь-то я и получаю злосчастную Ipart, которая должна оказываться в классе AsynchronousClient после каждого ее обновления.
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
public class AsynchronousClient
    {
        
        public static string Ipart = "";
        // The port number for the remote device.
        const int port = 11000;
        // ManualResetEvent instances signal completion.
        static System.Threading.ManualResetEvent connectDone =
            new System.Threading.ManualResetEvent(false);
        static System.Threading.ManualResetEvent sendDone =
            new System.Threading.ManualResetEvent(false);
        static System.Threading.ManualResetEvent receiveDone =
            new System.Threading.ManualResetEvent(false);
 
 
        // The response from the remote device.
        static String response = String.Empty;
 
        public void StartClient()
        {
            // Connect to a remote device.
            try
            {
                // Establish the remote endpoint for the socket.
                // The name of the 
                // remote device is "host.contoso.com".
                IPHostEntry ipHostInfo = Dns.Resolve("localhost");
                IPAddress ipAddress = ipHostInfo.AddressList[0];
                IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
 
                // Create a TCP/IP socket.
                Socket client = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream, ProtocolType.Tcp);
 
                // Connect to the remote endpoint.
                client.BeginConnect(remoteEP,
                    new AsyncCallback(ConnectCallback), client);
                connectDone.WaitOne();
                Ipart = "582721278981293123129381923<EOF>";
                Ipart = FormM.Ipart[0] + "<EOF>";
                string ssss = "";
                // Send test data to the remote device.
                Send(client, Ipart);
                sendDone.WaitOne();
Здесь-то и ломается моя логика. При запуске такого кода предварительно запущенный сервер вылетает. Я даже не могу посмотреть в режиме отладки, как принялась Ipart, потому что лаги начинаются именно на этой строчке.

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

Добавлено через 26 минут
Наверное, просто запихать старт клиент из баттона в таймер?

Добавлено через 17 минут
Думаю, проблема решена. Просто запихал в таймер. Но теперь другая проблема. В TCP я хочу передавать сразу две переменные. ну я и написал
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
public void StartClient()
        {
            // Connect to a remote device.
            try
            {
                // Establish the remote endpoint for the socket.
                // The name of the 
                // remote device is "host.contoso.com".
                IPHostEntry ipHostInfo = Dns.Resolve("localhost");
                IPAddress ipAddress = ipHostInfo.AddressList[0];
                IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
 
                // Create a TCP/IP socket.
                Socket client = new Socket(AddressFamily.InterNetwork,
                    SocketType.Stream, ProtocolType.Tcp);
 
                // Connect to the remote endpoint.
                client.BeginConnect(remoteEP,
                    new AsyncCallback(ConnectCallback), client);
                connectDone.WaitOne();
 
                Ipart = Ipart + "<EOF>";
                // Send test data to the remote device.
                Send(client, Ipart);
                sendDone.WaitOne();
 
                Send(client, Ipart);
                sendDone.WaitOne();
...
Почему сервер и клиент зависли? Добавил всего лишь второй раз передачу Ipart. Может в клиенте надо что-то менять? При передаче 1 раз все работает.

Добавлено через 3 минуты
на всякий случай, на сервере функция, аналогичная StartClient(), выглядит так:
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
 public static void StartListening()
        {
            // Data buffer for incoming data.
            byte[] bytes = new Byte[1024];
 
            // Establish the local endpoint for the socket.
            // The DNS name of the computer
            // running the listener is "host.contoso.com".
            IPHostEntry ipHostInfo = Dns.Resolve("localhost");//Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
 
            // Create a TCP/IP socket.
            Socket listener = new Socket(AddressFamily.InterNetwork,
                SocketType.Stream, ProtocolType.Tcp);
 
            // Bind the socket to the local endpoint and listen for incoming connections.
            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(100);
 
                while (true)
                {
                    // Set the event to nonsignaled state.
                    allDone.Reset();
 
                    // Start an asynchronous socket to listen for connections.
                    Console.WriteLine("Waiting for a connection...");
                    listener.BeginAccept(
                        new AsyncCallback(AcceptCallback),
                        listener);
 
                    // Wait until a connection is made before continuing.
                    allDone.WaitOne();
                }
 
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
 
            Console.WriteLine("\nPress ENTER to continue...");
            Console.Read();
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.10.2015, 13:22
Помогаю со студенческими работами здесь

Использование данных одного класса в другом классе
Подскажите как сделать так что бы значения d1,d2 из первого класса можно было использовать во втором классе? #include...

Получение данных от одного класса в другом классе.
Здравствуйте уважаемые программисты. ситуация следующая: Есть класс А. У этого класса есть public функция getVar(), которая возвращает...

Указатель на функцию-член одного класса в другом классе - C++
Добрый вечер! Может кто-то может помочь с проблемой. class Cook { public: void _cook_dish(Dish cook_dish_id) { ... ...

Как использовать функцию класса в другом классе (ни один из классов не наследует другой)?
функция в классе в котором она прописана объявлена как паблик. void auction::rvectoroldtime(int oldtime1, double low, double high ) { ...

Как вызвать стринг из одного класса чтобы он был виден в другом классе?
Доброго дня всем,у меня появился вопрос по классам. И так,у меня есть 2 класса ProcessClass.java и My30.java.В процессе ProcessClass.java...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru