Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
.NET 4.x

Обращаться к форме и ее компонентам из другого класса

09.09.2017, 07:22. Показов 1446. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Как можно обращаться к форме и ее компонентам из другого класа или есть другой способ уменьшения кода в классе форме?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.09.2017, 07:22
Ответы с готовыми решениями:

Рисование на форме из другого класса
В общем вопрос такой: Имеется форма с названием MainForm, также имеется класс GameObject. Рисовать на форме я представляю как,...

Не изменяется текст метки в главной форме из другого класса
Цель - изменить на главной форме значение текста в текстовой метке, находясь в другом классе. Сделал так, в коде основной формы...

Подскажите, как правильно обращаться к фунциям-членам другого класса
Подскажите как правильно обращаться к фунциям-членам другого класса. 1-й класс (m_list - член класса, которую необходимо вызвать с...

8
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18278 / 14201 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
09.09.2017, 07:45
Alexandr_7, к форме можно обращаться также как и к другим классам - путем передачи экземпляра формы. Дополнительно можно использовать коллекцию Application.OpenForms. Варианты обращения к элементам формы рассмотрены в ответе на вопрос №2 в теме Ответы на 7 самых частых вопросов по WinForms. Что касается уменьшения объема кода, то обычные ООП практики в помощь. Код который относится к самой форме можно разделить на части с помошью partial классов.

Заодно рекомендую внимательно прочитать тему Архитектура ПО в WinForms (FAQ & HowTo)
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
10.09.2017, 09:40  [ТС]
Вот код:
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
        private void SetFullNameEmulator()
        {
            ofd.Title = "Выбрать эмулятор";
            ofd.FileName = "gens100MHz_2MB_Ram.bin";
            ofd.Filter = "Эмулятор|*.exe";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                Options.Settings.EmulatorFullName = ofd.FileName;
            }
        }
 
        private bool GetFullNameEmulator()
        {
            if (System.IO.File.Exists(Options.Settings.EmulatorFullName))
                return true;
            else
            {
                SetFullNameEmulator();
                if (System.IO.File.Exists(Options.Settings.EmulatorFullName))
                    return true;
                else
                    return false;
            }
                
        }
 
        private void SetPathDuneHachk()
        {
            ofd.Title = "Выбрать оригинальный ром Dune Hack \"DuneHack_" + Options.MyСonfig.Dune_Hack_Version + ".bin\"";
            ofd.FileName = "DuneHack_" + Options.MyСonfig.Dune_Hack_Version + ".bin";
            ofd.Filter = "DuneHack_" + Options.MyСonfig.Dune_Hack_Version + ".bin|*.bin";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                Options.Settings.PathDuneHack = System.IO.Path.GetDirectoryName(ofd.FileName);
                Options.Settings.OriginalDuneHackFileName = @"\" + System.IO.Path.GetFileName(ofd.FileName);
            }
        }
 
        private void GetPathDuneHachk()
        {
            if (!System.IO.File.Exists(Options.Settings.PathDuneHack + Options.Settings.OriginalDuneHackFileName))
            {
                SetPathDuneHachk();
                if (!System.IO.File.Exists(Options.Settings.PathDuneHack + Options.Settings.OriginalDuneHackFileName))
                {
                    MessageBox.Show("Я не работаю без пути к папке Dune Hack!\r\nКак будешь готов запусти меня снова а пока досвидание!", "С уважением от \"Build Dune Region And Other Editors\"");
                    Environment.Exit(0);
                }
            }
            btnRun_Original_DuneHack.Text = String.Format("Запустить оригинальный файл: \"{0}\"", Options.Settings.OriginalDuneHackFileName.Substring(1));
            EnabledRunDuneHack = GetFullNameEmulator();
            btnRun_Original_DuneHack.Enabled = EnabledRunDuneHack;
            btnRun_Emulator.Enabled = EnabledRunDuneHack;
 
        }
 
        private void LoadLanguageInfo()
        {
            System.IO.StreamReader fsr = new System.IO.StreamReader(Options.Settings.PathDuneHack + Options.Settings.LIFileName, Encoding.GetEncoding(1251));
            int I, L;
            while (!fsr.EndOfStream)
            {
                string strRead = "";
                strRead = fsr.ReadLine().ToLower().Replace(Convert.ToChar(9), ' ').Replace(" ", "");
                if (strRead.IndexOf("ru_dialogs=") >= 0)
                {
                    I = strRead.IndexOf("ru_dialogs=");
                    L = 11;
                    chbParamBuild_RUS_Mentats_Dialogs.Checked = Convert.ToBoolean(Convert.ToInt32(strRead.Substring(I + L, 1)));
                }
                if (strRead.IndexOf("ru_names=") >= 0)
                {
                    I = strRead.IndexOf("ru_names=");
                    L = 9;
                    chbParamBuild_RUS_BU.Checked = Convert.ToBoolean(Convert.ToInt32(strRead.Substring(I + L, 1)));
                }
                if (strRead.IndexOf("ru_gfx=") >= 0)
                {
                    I = strRead.IndexOf("ru_gfx=");
                    L = 7;
                    chbParamBuild_RUS_Graphics.Checked = Convert.ToBoolean(Convert.ToInt32(strRead.Substring(I + L, 1)));
                }
                if (strRead.IndexOf("ru_password=") >= 0)
                {
                    I = strRead.IndexOf("ru_password=");
                    L = 12;
                    chbParamBuild_RUS_Passwords.Checked = Convert.ToBoolean(Convert.ToInt32(strRead.Substring(I + L, 1)));
                }
                if (strRead.IndexOf("ru_sound=") >= 0)
                {
                    I = strRead.IndexOf("ru_sound=");
                    L = 9;
                    chbParamBuild_RUS_Sounds.Checked = Convert.ToBoolean(Convert.ToInt32(strRead.Substring(I + L, 1)));
                }
            }
            fsr.Close();
        }
 
        private void SaveLanguageInfo()
        {
            var aFN = Options.Settings.PathDuneHack + Options.Settings.LIFileName;
            string[] strReadsWrites = System.IO.File.ReadAllLines(aFN, Encoding.GetEncoding(1251));
            var strRead = "";
            for (int i = 0; i < strReadsWrites.Length; i++)
            {
                strRead = strReadsWrites[i].ToLower().Replace(Convert.ToChar(9), ' ').Replace(" ", "");
                if (strRead.IndexOf("ru_dialogs=") >= 0)
                    strReadsWrites[i] = "RU_DIALOGS = " + Convert.ToInt32(chbParamBuild_RUS_Mentats_Dialogs.Checked).ToString() + " ; текст ментата, финальные титры";
                if (strRead.IndexOf("ru_names=") >= 0)
                    strReadsWrites[i] = "RU_NAMES = " + Convert.ToInt32(chbParamBuild_RUS_BU.Checked).ToString() + "    ; имена юнитов и зданий, титульного экрана, меню паузы";
                if (strRead.IndexOf("ru_gfx=") >= 0)
                    strReadsWrites[i] = "RU_GFX = " + Convert.ToInt32(chbParamBuild_RUS_Graphics.Checked).ToString() + "    ; элементы графики";
                if (strRead.IndexOf("ru_password=") >= 0)
                    strReadsWrites[i] = "RU_PASSWORD = " + Convert.ToInt32(chbParamBuild_RUS_Passwords.Checked).ToString() + " ; пароли";
                if (strRead.IndexOf("ru_sound=") >= 0)
                    strReadsWrites[i] = "RU_SOUND = " + Convert.ToInt32(chbParamBuild_RUS_Sounds.Checked).ToString() + "    ; звуки (для старого движка)";
            }
 
            FileManager.Copy_Reserved(Options.Settings.PathDuneHack + Options.Settings.LIFileName);
            System.IO.File.WriteAllLines(aFN, strReadsWrites, Encoding.GetEncoding(1251));
        }
И такого кода давольнатаки много так как файлов которые программа будет редактировать очень много. Мне нужен совет.
Толи оставлять это в классе формы толи выносить в отдельный класс FileManager в который я уже вынес 3 метода
3 для создания резевной копии остальные 2 для запуска и выполнения команд командной строки

Добавлено через 8 минут
И да. Не надо писать на счет то что первые четыре метода неправильно оформил. Я их упростил. Когда первый раз писал както не подумал.
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
private bool SetFullNameEmulator()
        {
            ofd.Title = "Выбрать эмулятор";
            ofd.FileName = "gens100MHz_2MB_Ram.bin";
            ofd.Filter = "Эмулятор|*.exe";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                Options.Settings.EmulatorFullName = ofd.FileName;
                return System.IO.File.Exists(Options.Settings.EmulatorFullName);
            }
            else
                return false;
 
        }
 
        private bool GetFullNameEmulator()
        {
            if (System.IO.File.Exists(Options.Settings.EmulatorFullName))
                return true;
            else
                return SetFullNameEmulator();                
        }
 
        private bool SetPathDuneHachk()
        {
            ofd.Title = "Выбрать оригинальный ром Dune Hack \"DuneHack_" + Options.MyСonfig.Dune_Hack_Version + ".bin\"";
            ofd.FileName = "DuneHack_" + Options.MyСonfig.Dune_Hack_Version + ".bin";
            ofd.Filter = "DuneHack_" + Options.MyСonfig.Dune_Hack_Version + ".bin|*.bin";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                Options.Settings.PathDuneHack = System.IO.Path.GetDirectoryName(ofd.FileName);
                Options.Settings.OriginalDuneHackFileName = @"\" + System.IO.Path.GetFileName(ofd.FileName);
                return System.IO.File.Exists(Options.Settings.PathDuneHack + Options.Settings.OriginalDuneHackFileName);
            }
            else
                return false;
        }
 
        private void GetPathDuneHachk()
        {
            if (!System.IO.File.Exists(Options.Settings.PathDuneHack + Options.Settings.OriginalDuneHackFileName))
            {
                if (!SetPathDuneHachk())
                {
                    MessageBox.Show("Я не работаю без пути к папке Dune Hack!\r\nКак будешь готов запусти меня снова а пока досвидание!", "С уважением от \"Build Dune Region And Other Editors\"");
                    Environment.Exit(0);
                }
            }
            btnRun_Original_DuneHack.Text = String.Format("Запустить оригинальный файл: \"{0}\"", Options.Settings.OriginalDuneHackFileName.Substring(1));
            EnabledRunDuneHack = GetFullNameEmulator();
            btnRun_Original_DuneHack.Enabled = EnabledRunDuneHack;
            btnRun_Emulator.Enabled = EnabledRunDuneHack;
 
        }
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
10.09.2017, 12:28
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
обращаться к форме и ее компонентам из другого класа
Классы вообще не должны знать ни о каких формах. Они просто выполняют свою работу и выдают результат, это все. Если по логике работы в процессе им нужно известить вызывающий код о чем-либо, то используются стандартные механизмы - делегаты/события.
А форма-это отображение, она просто отображает результаты работы ваших классов.
1
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
11.09.2017, 08:21  [ТС]
Пока что в классе у меня вынесены 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
 
namespace Build_Dune_Region_And_Other_Editors
{
    public class CFileManager
    {
        public void RunCommand(string aPath, string aCommands, frmBDRAOE_Main aFrmThis)
        {
            Process aProcess = new Process();
            aProcess.StartInfo.WorkingDirectory = aPath;
            aProcess.StartInfo.CreateNoWindow = true;
            aProcess.StartInfo.RedirectStandardInput = true;
            aProcess.StartInfo.UseShellExecute = false;
            aProcess.StartInfo.FileName = "cmd.exe";
            aProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            aProcess.StartInfo.Arguments = "@echo off\r\n/c " + aCommands;
            aFrmThis.Enabled = false;
            aFrmThis.Cursor = System.Windows.Forms.Cursors.WaitCursor;
            aProcess.Start();
            aProcess.WaitForExit();
            aFrmThis.Cursor = System.Windows.Forms.Cursors.Default;
            aFrmThis.Enabled = true;
        }
 
        public void RunProgramm(string aFullNameProgramm, string aFullNameOpenFileinProgramm)
        {
            Process aProcess = new Process();
            aProcess.StartInfo.WorkingDirectory = Path.GetDirectoryName(aFullNameProgramm);
            aProcess.StartInfo.FileName = aFullNameProgramm;
            aProcess.StartInfo.Arguments = aFullNameOpenFileinProgramm;
            aProcess.Start();
        }
 
        public void Copy_Reserved(string aFileName)
        {
            if (!File.Exists(aFileName + ".Original"))
                File.Copy(aFileName, aFileName + ".Original");
            File.Delete(aFileName);
        }
    }
}
На счет деолегатов то читал про них но либо не понял либо они в моем случае не подходят но скорее всего не понял

Добавлено через 23 минуты
Хотя есть нарушение с ооп а именно вот это
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void RunCommand(string aPath, string aCommands, [B]frmBDRAOE_Main aFrmThis[/B])
        {
            Process aProcess = new Process();
            aProcess.StartInfo.WorkingDirectory = aPath;
            aProcess.StartInfo.CreateNoWindow = true;
            aProcess.StartInfo.RedirectStandardInput = true;
            aProcess.StartInfo.UseShellExecute = false;
            aProcess.StartInfo.FileName = "cmd.exe";
            aProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            aProcess.StartInfo.Arguments = "@echo off\r\n/c " + aCommands;
            [B]aFrmThis.Enabled = false;
            aFrmThis.Cursor = System.Windows.Forms.Cursors.WaitCursor;[/B]
            aProcess.Start();
            aProcess.WaitForExit();
            [B]aFrmThis.Cursor = System.Windows.Forms.Cursors.Default;
            aFrmThis.Enabled = true;[/B]
        }
Их бы желательно выполнить в самом класе формы но
1 Вводить для этого отдельную переменную не вариант
2 Если использовать 2 раза return тоесть сначало вернуть false потом true но это не правильно да и ничего с таким не получится так как при вызове return завершается метод
Как сделать правильно. На счет с помощью делегатов то сразу говорю может пример дадите ибо примеры от макрасофт msdn както я не разобрался по ним

Добавлено через 18 часов 44 минуты
Пожалуйста помогите мне. Как правильно сделать из другого класса присвоить элементам кое какие параметры.
В примере тот что выше нужно форму сделать неактивной на время выполнения комманд.
Также еще выше примеры то там нужно изменять свойство Checked у CheckBox
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
11.09.2017, 09:25
Давайте так рассуждать. Если не понимаете что такое делегаты/события - то, простите, что Вы в формах забыли? Ведь каждый обработчик (клавиши, клики, мышки) - это реакция (грубо говоря запуск метода) программы на СОБЫТИЕ. Как минимум нужно понять что такое событие, как оно вызывается, как на него подписываться/отписываться, передавать параметры. И это всё нужно знать до того, как садиться писать приложение в формах (ну и с развитием технологий и WPF и далее).
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
сделать из другого класса присвоить элементам кое какие параметры
Это уже курс для маленьких, для начинающих.
C#
1
2
MyNewClass ins = new MyNewClass();
MyTexbox.Text =  ins.MyMethod(params....);
Вот таким нехитрым способом класс MyNewClass, ничего не знающий о форме - может обработать код, вернуть значение, и это значение будет отображено в текстбоксе.
Если код в отдельном классе выполняется долго - можно завернуть метод отдельного класса в таску, и запускать его асинхронно, чтобы UI не "висел" в процессе работы другого кода.
1
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
11.09.2017, 09:56  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
Это уже курс для маленьких, для начинающих.
C#
1
2
MyNewClass ins = new MyNewClass();
MyTexbox.Text = *ins.MyMethod(params....);
Вот таким нехитрым способом класс MyNewClass, ничего не знающий о форме - может обработать код, вернуть значение, и это значение будет отображено в текстбоксе.
Если код в отдельном классе выполняется долго - можно завернуть метод отдельного класса в таску, и запускать его асинхронно, чтобы UI не "висел" в процессе работы другого кода.
Да это в курсе. Но цель такая. К примеру метод в классе должен выполнить команды командной строки и на время выполнения заморозить форму а после завершения выполнения разморозить.
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
11.09.2017, 10:30
Нужно на логику процесса смотреть, по коду - это то, что Вы написали, а может это не соответствовать тому, что хотелось. Ну это ладно.
Из всего метода - оставляйте только enable/disable для формы, а остальную часть уводите в какой-то хелпер/отдельный класс.
Но вполне может оказаться, что как раз не нужно делать disable, и форма сама заморозиться, ведь работать будет в синхронном режиме. Поэтому для начала - понять бизнес логику приложения - потом раздавать советы по красоте кода. Вариант кое-что кое-где натолкнет только на ответ кое-как.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
11.09.2017, 19:01  [ТС]
Она та замарозиться . Но вот при попытке чтото сделать появится надпись программа не отвичает пока не закончит компилировать а потом выполнит то что ты там сделал но нужно именно блокировать упровление прогой пока не завершиться компиляция + менять курсор у проги на соответсвующий для выполнения чего либо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2017, 19:01
Помогаю со студенческими работами здесь

Как обращаться к компонентам формы?
я начал изучать С++ (до этого python3.x) в учебнике только консольные приложения. я книжку дочитал, инфу хорошо усвоил, теперь пробую...

Как обращаться к компонентам Shape в цикле?
Помогите пожалуйста решить следующую задачу: мне нужно чтоб на форме отображались 100 кружочков (или квадратиков) в форме сетки (10 на...

Как в Android Studio обращаться к компонентам (кнопкам, полям, и т.д.)?
как например делать что бы при клике на кнопку(в андроид студио)всплывало сообщение или переменная одного поля присваивалась другому. ...

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

Обращение к форме из другого класса
Добрый день. Помогите пожалуйста, У меня есть форма: ploskipanel.h ploskipanel.cpp ploskipanel.ui И есть класс, spline.cpp. Как я...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru