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

Управление одной формой из другой.

10.10.2008, 12:17. Показов 31129. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Наверное глупый вопрос:
Есть 2 формы, MainForm и Form1. В данный момент фокус на форме Form1. Нужно из неё сделать Enabled = false для MainForm. На ум приходит только менять фокус на MainForm и делать ActiveForm.Enabled = false;, но как передать фокус всё той же MainForm?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.10.2008, 12:17
Ответы с готовыми решениями:

Управление одной формой из другой
Доброго времени суток. Вопрос такой: Существует две формы (Form1 и Form2) На Form1 есть меню с несколькими RadioButton'ми. При...

Как передать управление от одной формы другой?
Здравствуйте. Не могу понять как передать управление из одной формы в другую. В начале запуска программы запускается форма...

Управление формой из другой формы
мне надо изменить тэг form3, из кода для form1, фокус на form1)Как это сделать?)

19
Комбайнёр
 Аватар для MAcK
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
10.10.2008, 12:47
Передать из дочерней формы главной можно через делегаты ...
0
2 / 2 / 0
Регистрация: 03.10.2008
Сообщений: 17
10.10.2008, 16:11  [ТС]
А можешь показать на примере? Я теорию делегатов ни с одной книги не догнал, а примеров не видел.
Смотри, есть форма MainForm. Во время загрузки открываем Form1 и "морозим" MainForm:
C#
1
2
3
4
5
6
7
8
9
10
11
12
...
public MainForm()   //Морозим MainForm в конструкторе
{
    InitializeComponent();
    this.Enabled = false;
}
...
void MainFormShown(object sender, EventArgs e)   //Открываем Form1
{
    Form1 form1 = new Form1();
    form1.Visible = true;
}
На второй форме, допустим, есть некая кнопка, при нажатии на которую эта форма закрывается, а MainForm становиться .Enabled = true.

Обработчик события нажатия этой кнопки:

C#
1
2
3
4
5
void ButtonOKClick(object sender, EventArgs e)
{
    ???.Enabled = true; //Тут я не догнал, что ставить вместо ???.
    this.close();
}
Памаги. Заранее пасиба.
0
Администратор
 Аватар для mik-a-el
87847 / 53168 / 249
Регистрация: 10.04.2006
Сообщений: 13,764
10.10.2008, 16:13
Form1 и MainForm - это формы одного приложения? Если да, то передайте в дочернюю форму ссылку на родительскую.
0
2 / 2 / 0
Регистрация: 03.10.2008
Сообщений: 17
11.10.2008, 00:39  [ТС]
Да, и MainForm, и Form1 - формы одного приложения. Но, хот убей, не понимаю, как передать в дочернюю форму ссылку на родительскую. Используя ключевое слово "ref"? Методом тыка у меня ничего не получается. Чиркни, плз, пару строчек кода. На примере ведь всегда понятней.

P.S. Как я понимаю, Enabled - свойство динамическое, чтобы его использовать нужно создать экземпляр класса MainForm. Но если форма уже запущена, то и экземпляр его уже создан. Как узнать как к нему обратиться?
0
Администратор
 Аватар для mik-a-el
87847 / 53168 / 249
Регистрация: 10.04.2006
Сообщений: 13,764
11.10.2008, 00:59
Определи у дочерней формы конструктор, у него параметр типа Form, в него и передавай при создании.
0
2 / 2 / 0
Регистрация: 03.10.2008
Сообщений: 17
11.10.2008, 12:30  [ТС]
Или я такой тупой, или руки кривые, или ... Ну не получается. Ну тыкни носом дурака в строчку кода. С меня пиво.
0
2 / 2 / 0
Регистрация: 03.10.2008
Сообщений: 17
12.10.2008, 12:43  [ТС]
Ну ответьте хоть кто-нить...
Я тут, перекопав несколько исходников, нашёл такие строки (применительно к моему случаю, в коде формы Form1):

C#
1
2
MainForm frm = (MainForm) this.ParentForm;
frm.Enabled = true;
Компилируется, но выбрасывает исключение: Object reference not set to an instance of an object (тобиш нет ссылки на экземпляр объекта). Как это исправить, не пойму.

P.S. Пробовал писать this.Owner вместо this.ParentForm. Один хрен. Кста, в чём разница между Parent и Owner?
0
Администратор
 Аватар для mik-a-el
87847 / 53168 / 249
Регистрация: 10.04.2006
Сообщений: 13,764
12.10.2008, 13:03
Лучший ответ Сообщение было отмечено как решение

Решение

Пример в аттаче, разбирайтесь.
Кстати, а зачем оно вам нужно?
Вложения
Тип файла: rar WindowsApplication4_20081012.rar (31.2 Кб, 1592 просмотров)
3
2 / 2 / 0
Регистрация: 03.10.2008
Сообщений: 17
13.10.2008, 12:55  [ТС]
Bool’s eye! Пасиба агроменное. Особенно пасиба за терпение. Оказалось всё очень просто (даже не догадался, что Form можно использовать как тип переменной). А насчёт «зачем?..». Да так... Я жеж тока учусь. Ставлю перед собой задачи, пытаюсь решить, сталкиваюсь с проблемами... Бьюсь над их решением... Надоедаю форумчанам...

Добавлено через 20 часов 52 минуты 11 секунд
Я, наверное уже достал, но не легче передавать ссылку на объект одной формы другой форме не в ввиде аргумента конструктора, а просто статической public-переменной? Не подумай, что я тебя поучаю, просто хочется побольше знать. Ведь так меньше телодвижений и в будущем, если понадобиться, допустим, добавить ссылку на новый объект, всё это дело легче провернуть. Или может через конструктор правильнее? Ниже я приаттачил то, что имею ввиду.
P.S. Если надоел, не отвечай на мой пост.

Добавлено через 13 минут 19 секунд
Собсьна сам пример:
2
Администратор
 Аватар для mik-a-el
87847 / 53168 / 249
Регистрация: 10.04.2006
Сообщений: 13,764
13.10.2008, 12:59
Цитата Сообщение от lonesomeman Посмотреть сообщение
Я, наверное уже достал, но не легче передавать ссылку на объект одной формы другой форме не в ввиде аргумента конструктора, а просто статической public-переменной?
Можно. Разница лишь в том, что на инициализацию в моем варианте вы тратите 1 строку кода, а в вашем - две
Цитата Сообщение от lonesomeman Посмотреть сообщение
Ведь так меньше телодвижений и в будущем, если понадобиться, допустим, добавить ссылку на новый объект, всё это дело легче провернуть.
Так заведи свойство в целевой форме. Оно и будет инициализироваться в конструкторе. При желании его можно будет переустановить другим значением.
0
2 / 2 / 0
Регистрация: 03.10.2008
Сообщений: 17
13.10.2008, 13:06  [ТС]
Чёй-то не аттачиться.
Кароч, в одной форме делаем

public static Form Form_ref;

потом

Form_ref = this;

а топом из фтарой формы пишем MainForm.Form_ref.Enabled = true;
0
Администратор
 Аватар для mik-a-el
87847 / 53168 / 249
Регистрация: 10.04.2006
Сообщений: 13,764
13.10.2008, 13:15
См. пост 11.
0
2 / 2 / 0
Регистрация: 03.10.2008
Сообщений: 17
13.10.2008, 13:33  [ТС]
Та я уже понял, просто ты ответил раньше, чем я успел описать свой аттачмент. За сим откланяюсь. Тема закрыта. Всем спасибо, все свободны.
0
 Аватар для Jnis
13 / 13 / 2
Регистрация: 06.01.2009
Сообщений: 70
07.01.2009, 01:53
Можно еще так:

У каждой формы есть свой заголовочный "*.h" и текст "*.cpp" файлы. При первом сохранении можно ввести их имена, но стандартно они Unit1, Unit2...

Пишем например в "Unit2.cpp" //собственно ето в самом редакторе
C++
1
2
3
4
5
6
7
#include "Unit1.h" 
//в дальнейшем можно будет обращатся ко всем атрибутам и объектам формы
 
...
 
   Form1->Enabled=0;
   Form1->Label1->Caption="бла бла бла";
Добавлено через 17 часов 42 минуты 19 секунд
У каждой формы есть свой заголовочный "*.h" и текст "*.cpp" файлы. При первом сохранении можно ввести их имена, но стандартно они Unit1, Unit2...
В редакторе можно переключатся между ними щелкая по названию вкладки правой кнопкой и в контекстном меню самое верхнее "Open Source/Header File"

Управление формой с другой формы:
Например есть у нас 2 формы. Имена "*.h" и "*.cpp" стандартные: Unit1 и Unit2.
Хотим со второй формы поколдавать над первой:

Пишем в "Unit2.cpp"
C++
1
2
3
4
5
#include "Unit1.h"   
//в дальнейшем можно будет обращатся ко всем атрибутам и объектам первой формы  
                     ...    
   Form1->Enabled=0;  
   Form1->Label1->Caption="бла бла бла";
Передача переменных из одной формы в другую:
Положение такое же.
Хотим получить переменную во второй форме из первой:

Тут немножко сложнее но суть та же. Например есть у нас такой код в "Unit1.cpp"
C++
1
2
3
#include "stdio.h"//библиотека для работы с файлами(без нее не знает слово FILE, если у вас другой тип, ее можно не обьявлять)
FILE *f,*fb,*fi; //ето переменные-указатели на файл, которые мы хотим передать. Пишем вне процедур, дабы она была глобальной по всему Unit1.cpp
 ...
Чтобы она стала еще глобальней , в "Unit1.h" ищем раздел "public:" и пишем туда:
C++
1
2
3
4
#include "stdio.h"//предназначение такое же что и в "Unit1.cpp"
 ...
[B]public:[/B]    
        FILE *f,*fb,*fi;
После этого во второй форме можно к ней обращаться:
C++
1
2
3
4
5
#include "Unit1.h"    
                     ...    
char C=fgetc([B]Form1->f[/B]);
fread(&C,1,1,[B]Form1->fi[/B]);
                     ...
0
0 / 0 / 0
Регистрация: 22.04.2009
Сообщений: 3
22.04.2009, 16:39
решил поднять тему. сделал все как в примере выше, но почему-то у меня нет доступа таким образом к примеру к лэйблам и кастомным методам.
что не правильно?
0
Комбайнёр
 Аватар для MAcK
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
22.04.2009, 16:51
Покажите код
0
0 / 0 / 0
Регистрация: 22.04.2009
Сообщений: 3
22.04.2009, 16:57
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
// form1
namespace testform
{
    public partial class Form1 : Form
    {
        Form mdiChildForm = new Form();
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            
             Form2 form2 = new Form2(this);
            form2.Show();
        }
        public void ssetLabel1(string inText)
        {
            label1.Text = inText;
        }
    }
}
-------------------------------------------
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// form2
namespace testform
{
    public partial class Form2 : Form
    {
        private Form _mainForm;
        public Form2(Form mainForm)
        {
            _mainForm = mainForm;
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            _mainForm.????????????????????????
        }
    }
}
0
Комбайнёр
 Аватар для MAcK
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
22.04.2009, 17:07
А если так?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace testform
{
    public partial class Form2 : Form
    {
        private Form1 _mainForm;
        public Form2(Form1 mainForm)
        {
            _mainForm = mainForm;
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            _mainForm.????????????????????????
        }
    }
}
0
0 / 0 / 0
Регистрация: 22.04.2009
Сообщений: 3
22.04.2009, 17:16
ага, тоже понял свою ошибку, хотел отписаться что вкурил
спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.04.2009, 17:16
Помогаю со студенческими работами здесь

Управление формой из другой формы (запустить какой-нибудь метод)
Как передать параметр из одной в другую и наоборот понятно. А вот как допустим из Form2 запустить какой-нибудь метод в Form1Одна тема -...

Как передать данные с одной формы на страницу с другой формой?
Есть страница с формой заказа там есть номер телефона, как передать номер телефона на страницу с другой формой?

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

Управление объектами на одной форме с другой формы
Здравствуйте! имеются две независимые формы. грубо говоря, одна для ввода (form1), другая для вывода (form2). каким образом можно...

Управление записью одной таблицы через поле другой
Здравствуйте! Есть таблица "Планирование" (предположим, с одной записью /строкой/) и таблица "Исполнение" (предположим,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru