Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

дочерние диаолговые окна

7.6K
18 марта 2007 года
bmn
27 / / 01.08.2005
Добрый вечер.
требуется сделать дочернее диалоговое окно (форма, с прогрессбаром)
и чтоб нельзя было перейти на хозяина (owner) пока это окно существует.
получается что-то вроде ShowDialog()
но есть одно НО. когда мы сворачиваем modaldialog, то форма-хозяин остается. а если сделать что-то вроде:
 
Код:
if (this.WindowState == FormWindowState.Minimized)
  this.owner.WindowState = FormWindowState.Minimized;

то будет считаться, что дочернее диалоговое окно было закрыто.

пример желаемого окна можно посмотреть в Total Commander.когда идет закачка файла.

подскажите как можно решить данную проблему?

пробовал эксперементировать с Activated:
 
Код:
private void Form1_Activated (object sender, EventArgs e)
{
    if (this.OwnedForms.Length > 0)
    {
        this.OwnedForms[0].Focus();
    }
}
5
20 марта 2007 года
hardcase
4.5K / / 09.08.2005
Чем не подходит вот это:
 
Код:
Form2 form = new Form2();
form.ShowDialog();

Если свернуть эту форму - главное окно также свернётся.
Полагаю у тебя она только и делает, что демонструрует прогресс какой-то фоновой операции.
Когда операция завершится, ты просто скажешь form.Dispose() или form.Close() и оно благополучно сдохнет.

З,Ы, не забудь поставить свойство ShowInTaskBar как false
7.6K
25 марта 2007 года
bmn
27 / / 01.08.2005
hardcase, спасибо.
только вот ещё одна проблема:
Есть главная форма (MainForm)
она открывает какую-то дочернюю форму (ChildForm)
а ChildForm открывает Settings (как Modal, т.е. ShowDialog)
---
получается, что пока не закроешь Settings получить доступ к ChildForm и MainForm нельзя. а надо чтоб MainForm было независимой..
5
25 марта 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: bmn
hardcase, спасибо.
только вот ещё одна проблема:
Есть главная форма (MainForm)
она открывает какую-то дочернюю форму (ChildForm)
а ChildForm открывает Settings (как Modal, т.е. ShowDialog)
---
получается, что пока не закроешь Settings получить доступ к ChildForm и MainForm нельзя. а надо чтоб MainForm было независимой..


Есть вариант, в котором мы ChildForm создаём в новом потоке (Thread) и тогда ShowDialog будет воздействовать на ту форму. Думаю этот вариант тебе не слишком подойдёт - там есть проблемы с доступом к окнам между потоками.

Другой вариант - форма SettingsForm знает о форме, которая её вызвала, и на время своего отображения на экране элементарно блокирует caller-форму:

Код:
public partial class SettingsForm : Form {

    private Form callerForm;

    public SettingsForm(Form callerForm) {
        InitializeComponent();
        this.callerForm = callerForm;
    }

    private void SettingsForm_Load(object sender, EventArgs e) {
        if(callerForm != null)
            callerForm.Enabled = false;
    }
    private void SettingsForm_FormClosed(object sender, FormClosedEventArgs e) {
        if(callerForm != null)
            callerForm.Enabled = true;
    }
}


Чтобы создать эту форму мы должны передать параметр-форму, в контексте которой мы вызывам Settings-окно:
 
Код:
private void button1_Click(object sender, EventArgs e) {
    SettingsForm settingsForm = new SettingsForm(this);
    settingsForm.Show();
}
273
26 марта 2007 года
3A3-968M
1.2K / / 22.12.2005
Поправлю hardcase - создавать отдельное поле для хранения ссылки на форму не надо - можно использовать свойство Owner. Например так:
 
Код:
[LEFT][FONT=Courier New]private void button1_Click(object sender, EventArgs e) [/FONT]
[FONT=Courier New]{
    SettingsForm settingsForm = new SettingsForm();
    settingsForm.Owner = this;[/FONT]
[FONT=Courier New]    settingsForm.Show();
}[/FONT][/LEFT]

Или так (используя интерфейс IWin32Window):
 
Код:
[LEFT][FONT=Courier New]private void button1_Click(object sender, EventArgs e) [/FONT]
[FONT=Courier New]{
    SettingsForm settingsForm = new SettingsForm();[/FONT]
[FONT=Courier New]    settingsForm.Show(this);
}[/FONT][/LEFT]
7.6K
27 марта 2007 года
bmn
27 / / 01.08.2005
посмотрел код. совсем я чё-то не то увидел(((
обьясню по порядку:
создается MainForm, нажимаем на иконку, открывается ChildForm и есть настройка ChildForm'а - SettingsForm.

Так вот этот SettingsFrom вызываем типа
SettingsForm s = new SettingsForm();
s.ShowDialog (this);
из ChildForm.

получаем следующую ситуацию:
нельзя получить доступ, ну т.е. открыть там другие формы (из MainForm), MainForm и ChildForm. Я хочу чтоб эта НЕДОСТУПНОСТЬ (что-ли) действовало только на ту форму, которая вызывает ShowDialog, а MainForm осталась независимой. Она как коллекция программ идет, из неё вызвать можно будет другие формы.

Реально такое?
--
конечно есть вариант, типа из MainForm открывать exe'шные апликухи, но как тогда сделать, чтоб они принадлежали MainForm, и закрылись, когда я закрою MainForm.
Просто держать массив открытых программ, а при закрытии главной программы завершить эти процессы?
5
28 марта 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: bmn

s.ShowDialog (this);


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

7.6K
31 марта 2007 года
bmn
27 / / 01.08.2005
Цитата: hardcase
А теперь покажи, где в коде, что я тебе запостил, есть подобный вызов?


извини, не совсем так сначала понял. ты типа имитируешь свой ShowDialog..?
а можно просто сделать так, чтобы события форм, которые вызываются методом Show(), без указаний owner'a не влияли на форму. Чтоб она была независимоЙ!!?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог