С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/35: Рейтинг темы: голосов - 35, средняя оценка - 4.91
2 / 2 / 0
Регистрация: 07.05.2013
Сообщений: 90

Работа в MainForm

08.05.2013, 19:14. Показов 6964. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите плз, есть пара вопросов:

1. Почему я не могу работать здесь с моими контролами размещенными на форме? Ведь вся работа должна вестить в классах, но я ведь работаю в классе..
C#
1
2
3
4
5
6
7
8
9
10
11
namespace Search_In_Database
{
    public partial class MainForm : Window
    {
        public MainForm()
        {
            InitializeComponent();
        }
        myButton1 < -- Почему нет?
    }
}
2.Должен ли я создавать объект класса MainForm здесь чтоб работать с контроллами или обьект автоматически создается в InitializeComponent()? Или это никчемное дублирование кода и создание не нужного обьекта?
C#
1
2
3
4
5
6
7
8
9
10
11
12
namespace Search_In_Database
{
    public partial class MainForm : Window
    {
        MainForm mainForm;
        public MainForm()
        {
            InitializeComponent();
            mainForm = new MainForm();
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.05.2013, 19:14
Ответы с готовыми решениями:

Application.CreateForm(TMainForm, MainForm); ошибка не нравится MainForm
Вот программа с ошибкой program FirstProg; uses Vcl.Forms, MainUnit in 'MainUnit.pas' {mainFORM}; {$R *.res} begin

MainForm
Где он находится? и чем отличается от Form?

MainForm->Print()
Пытаюсь распечатать форму таким методом void __fastcall TMainForm::Button1Click(TObject *Sender) { MainForm-&gt;Print(); } ...

14
68 / 38 / 1
Регистрация: 09.11.2009
Сообщений: 391
08.05.2013, 19:22
1. Обращаться к контролам нужно внутри методов. Т. е. если Вы ходите поменять какие-то свойства контрола или просто считать их и запомнить в какой-то переменной, то это все нужно делать внутри метода.

2. Конструктор класса (в вашем случае MainForm) вызывается автоматически когда вы создаете объект класса MainForm.
Вот эту строку mainForm = new MainForm(); - нужно удалить из конструктора. У вас так программа зависнет.


Если мой ответ Вам помог нажмите пожалуйста кнопку "+1 Cпасибо" в моем сообщении
1
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.05.2013, 20:16
Цитата Сообщение от KantalSoft Посмотреть сообщение
1. Обращаться к контролам нужно внутри методов. Т. е. если Вы ходите поменять какие-то свойства контрола или просто считать их и запомнить в какой-то переменной, то это все нужно делать внутри метода.
Не совсем. Ещё можно внутри Свойства, конструктора и деструктора. =Р

Цитата Сообщение от dzhigurda Посмотреть сообщение
Должен ли я создавать объект класса MainForm здесь чтоб работать с контроллами или обьект автоматически создается в InitializeComponent()? Или это никчемное дублирование кода и создание не нужного обьекта?
KantalSoft прав - у вас так программа зависнет, а потом вывалится с переполнением стека. Вы в конструкторе класса создаете новый элемент этого же класса - эдакая бесконечная рекурсия. InitializeComponent(); - некий метод, который скрытым от вас образом создает в классе MainForm все описанные в xaml-файле контролы, свойства и прочее.
1
68 / 38 / 1
Регистрация: 09.11.2009
Сообщений: 391
08.05.2013, 20:22
[QUOTE=Wolfdp;4528186]Не совсем. Ещё можно внутри Свойства, конструктора и деструктора. =Р

Под словом "метод" я имел ввиду все что вы перечислиле вместе взятое
0
2 / 2 / 0
Регистрация: 07.05.2013
Сообщений: 90
08.05.2013, 20:43  [ТС]
Не совсем что то понимаю, объявляю допустим static метод внутри MainForm, почему я не могу его вызвать в этом классе?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace Search_In_Database
{
    public partial class MainForm : Window
    {
        int x;
        public MainForm()
        {
            InitializeComponent();
        }
        
        public static void MyMeth()
        {
             x++;
        }
 
        MyMeth();  <--?
    }
}
И еще в MainForm не производится вся работа, а только описываются всякие методы? Тогда где должна производится по-порядку как в консольном приложении? Еще, допустим я создал класс WorkClass, и хочу получить там доступ к контроллам с формы, я должан создать объект класса MainForm там или только ссылку? Когда я создаю объект класса MainForm, я создаю просто же объект этого класса, сама же новая форма не создается?
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
08.05.2013, 20:59
Вы не можете обратиться к MyMeth() таким способом, как вы указали, потому что вызывать методы нужно из других методов, равно как и работать с контролами и т.п., возвращаясь к начальному вопросу данного топика.

Между прочим, в консольном приложении было тоже самое - все методы, свойства и прочее вы вызывали не из неоткуда, а из другого метода, который стартует при запуске приложения - это метод void Main()
Также и в WinForms приложении вызов метода возможен только из другого метода.

Насчёт другого созданного вами класса - для того, чтобы из него работать с контролами основного класса, вы должны передавать экземпляр MainForm в конструктор вашего нового класса, так что он (новый класс) может с ним работать.
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.05.2013, 22:34
Цитата Сообщение от dzhigurda Посмотреть сообщение
Когда я создаю объект класса MainForm, я создаю просто же объект этого класса, сама же новая форма не создается?
Форма - это и есть объект класса. Практически всё в шарпе - объект класса object. На то оно и ООП.
0
2 / 2 / 0
Регистрация: 07.05.2013
Сообщений: 90
08.05.2013, 22:55  [ТС]
Можно по полкам?

1. В MainForm не производится вся работа, а только описываются методы?
2. Тогда где должна производится вся работа? Вся логика должна быть запихнута в конструктор MainForm? Имею ввиду последовательность кода как ее выполнять как последовательность в консольном приложении.
3. Допустим я создал класс WorkClass, и хочу получить там доступ к контроллам с формы, я должан создать объект класса MainForm там или только ссылку?
4. Конструктор MainForm при запуске создает объект этого класса, если я создам объект этого класса в другом классе, получится что у меня 2 обьекта класса MainForm в памяти?
5. Когда я создаю объект класса MainForm, я создаю просто же объект этого класса, сама же новая форма не создается? Или я создаю конкретно еще одну форму?
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.05.2013, 23:12
По полкам:

1. Твое окно, будь оно консольное или нет - это некий объект класса. Все оконые приложения наследуются от класса Windows или Form, в зависимости от типа вашего проекта.

2. Конструктор - это то что выполняется при создании нового объекта.
Windows windows = new Windows();
Неправильно говорить что "конструктор создает объект". Новый объект создает оператор new, также этот оператор вызывает конструктор создаваемого объекта.

3. Вся-вся-вся логика по сути заключена в методы. Также вы можете код добавить в Свойства (get;set конструктор и десктруктор. Когда хотите что-то сделать - вызываете метод.

4. Дабы получить доступ к контролам окна можно:
- обратится к списку контролов окна (свойство Controls для Form; Сhild для Window).
- обратится к открытому свойству/значению/методу, которое указывает на нужный нам контрол.
По сути нам просто нужен указатель на этот контрол, ведь это тоже объект класса. Мы может сделать что-то такое

C#
1
2
3
4
5
6
7
void Method()
{
Form form = new Form();
Button button = new Button();
form.Controls.Add(button); // добавили кнопку в окно form
button.Text = "Nya!"; // поменяли текст кнопки
}
5. Меньше вопросов - больше практики. Просто берёшь и пишешь любое просто приложение (можно и не просто), доводишь его до ума и делаешь выводы. Без практики - фиг что поймешь. Я вообще большую часть познавал методом тыка.
0
2 / 2 / 0
Регистрация: 07.05.2013
Сообщений: 90
09.05.2013, 01:07  [ТС]
Wolfdp, на чьи вы вопросы отвечали - непонятно..
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
09.05.2013, 07:20
dzhigurda, твои вопросы для меня звучат где-то так "чтобы поехать, руль крутить нужно, да?" Ты даже не понимаешь основ ООП и вопросы задаешь наугад. И дабы секономить время и вам, и мне, я просто сделал общее объяснение, но как видимо зря.
0
2 / 2 / 0
Регистрация: 07.05.2013
Сообщений: 90
09.05.2013, 08:36  [ТС]
Спасибо конечно за старания, но в моем случае, конкретные ответы были бы полезнее..
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
09.05.2013, 11:24
В вашем случае конкретное чтение литературы было бы полезнее, чем выхватывание отдельных кусков то тут, то там по форумам.
В этой теме уже 3 разных человека нормальным русским языком объясняли вам и отвечали на ваши вопросы, чётко и по делу - вам это не помогло. Что ж, значит, мало что поможет.
0
2 / 2 / 0
Регистрация: 07.05.2013
Сообщений: 90
09.05.2013, 12:29  [ТС]
Зачем устраивать перепалку? Вопросы глупые для кого то, я не спорю, на это и форум для новичков и здесь присутсвует разный контингент..
И все же, я постараюсь вопросить третий раз, кому не сложно, можно по пунктам, без нравручений и учения дзен..
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
09.05.2013, 13:10
Окей, припустим...

Цитата Сообщение от dzhigurda Посмотреть сообщение
1. В MainForm не производится вся работа, а только описываются методы?
Вся "работа" происходит в методах. Вообще любой код должен быть в что-то завернут, чтобы среда знала что и когда вызывать.

Цитата Сообщение от dzhigurda Посмотреть сообщение
2. Тогда где должна производится вся работа?
Есть методы, события, конструкторы, деструкторы, потоки, делегаты и прочая лабуда, которая содержит код/параметры/объекты.

Цитата Сообщение от dzhigurda Посмотреть сообщение
Вся логика должна быть запихнута в конструктор MainForm?
Вся "логика" должна быть на своем месте. Вы же не засуните вывод сообщения о закрытии конструктор.

Цитата Сообщение от dzhigurda Посмотреть сообщение
3. Допустим я создал класс WorkClass, и хочу получить там доступ к контроллам
Внутри объекта WorkClass - можно обратится к текущему списку контролов (this.Controls[i]) или просто сохранить сылку в внутренюю переменую. Извне - опять же обратится к списку контролов или к открытому полю/свойству.

Цитата Сообщение от dzhigurda Посмотреть сообщение
4. Конструктор MainForm при запуске создает объект этого класса
Ещё раз - конструктор НИЧЕГО НЕ СОЗДАЕТ. Это метод, который обязательно выполняется во время создание нового объекта через new.

Цитата Сообщение от dzhigurda Посмотреть сообщение
если я создам объект этого класса в другом классе, получится что у меня 2 обьекта класса MainForm в памяти?
Сколько раз используешь new, столько созданных объектов у тебя и будет.

Цитата Сообщение от dzhigurda Посмотреть сообщение
5. Когда я создаю объект класса MainForm, я создаю просто же объект этого класса, сама же новая форма не создается? Или я создаю конкретно еще одну форму?
Форма и есть объект класса. И вообще, в шарпе - всё объект. Даже то что по сути не объект, всё равно объект, так как не явно наследуется от object.

P.S. А теперь, если возникнут ещё вопросы, то ищи или книжку, или стенку.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2013, 13:10
Помогаю со студенческими работами здесь

Передать значение на MainForm
здрасте)) есть mainwindow.h(ну и соответственно .cpp и .ui) в нём есть public: double *val есть EnterAngleDialog.h(ну и...

mainform в delphi xe3
Всем привет! Довольно долго кодил на дельфи, решил наконец перейти на xe3. Создал несколько форм. И тут проблема - как сделать...

Не MainForm на таск баре
У меня есть несколько форм в проекте - главная, что то типа сплэша, форма коннекта к дб (если файл настроек не найде) (и другие но они не...

Запустить MainForm с параметрами
Здравствуйте! Возникла следующая проблема, нужно запустить форму с параметрами, если запускаю просто Form - в командной строке все...

BackgroundWorker и MainForm ошибка потока
Уважаемые участники форума. Помогите пожалуйста. Пишу программу и никак не могу победить ошибку. Вот кусок...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru