Вопрос с диалогами. Ситуация такая: есть главный Form1 и есть Form2, который вызывается как модальный. Далее с Form2 вызывается уже не модальный Form3, между 2 и 3 формами юзер имеет возможность переключатся и управлять ими, кроме Form1. По закрытию Form2, остается Form1 и Form3, которые тоже прекрасно управляются юзером. Если не закрывая Form3 вызвать опять модальный Form2, то блокируются 1 и 3 формы. Причем если с Form2 обратится к Form3, методом Activate(), то форма просто вылезет на передний фон, а контроль над ней будет не доступен. Переоткрывать Form3 как-то не красиво что ли... Вопрос заключается в том, как сделать так чтобы модальный диалог не блокировал все окна, кроме того с которого он запускается?
Вряд ли это возможно, специфика модального диалога такова. Могу посоветовать использовать всегда не модальный диалог, и блокировать контролы если они по логике в остальных формах должны быть недоступны.
Спасибо. Я уже решил эту проблему через многопоточность, если по логике надо чтобы какаято форма не блокировалась модальным диалогом, ее необходимо запустить через Application.Run() в другом потоке. Как всегда решение было перед самым носом.
>>ее необходимо запустить через Application.Run() в корне неверное решение, у вас что-то с формами напутано.
Если вы не знаете, лучше молчите! Простейший пример: проект с тремя формами. с Form1 вызовите Form2, через Show(). Не закрывая Form2, с Form1 вызовите Form3 через ShowDialog(). Как сделать так чтобы ранее вызванный Form2 не блокировался модальным Form3? По-мойму, вполне конкретный вопрос, а вы отсылаете разбираться с формами... указывая, что с логикой что-то не так... да тут элементарная логика, на пальцах объяснить можно.
spkody, уважаемый, рот мне не стоит закрывать. У Вас явные проблемы с архитектурой, назовите мне dialy ПО которое себя так ведет? Получается проблемы с том, что, где и как показать, не правда ли?
>>То что он может копировать файлы в отдельном от основного потока слышали... ну так вот это копирование не блокирует работу основного окна. facepalm... ужас... 1. Модальные окна не блокируют работу основного потока. 2. Поменяйте сборку, у Вас отсутствует кнопка - "В фоне" Проблема в том, что сначала запускается главное окно, поверх него модальное и должно работать еще 1 окно, причем не взирая на модальное. 1. Где смысл модального окна? 2. ShowDialog с параметром (принимает IWin32Window) - этот метод как раз таки и позволяет блокировать определенную форму, а не все. Именно оно нужно, но никак не Application.Run. Может быть стоит действительно прислушаться? Я все понимаю, амбиции, молодость и прочее, но здоровую критику никто не отменял.
Начинаю интересоваться простым программированием и т.п. для реализации своих идей и замыслов по автоматизации работы ПК. Есть такой вопрос: есть ли русскоязычные билдеры программ в которых интерфейс позволит мне понять какую функцию и за чем я вставлю. есть знания ШТМЛ, немного очень ПШП, когда то начинал самостоятельно бейсик, тоесть о создании переменных и назначении им функций немного понимаю. Но вот интересует именно простое программирование с помощью русскоязычных и понятных интерфейсов и т.п.
1. holyshit!! т.е. код после ShowDialog спокойно может исполнятся не дожидаясь пока диалог че-то там вернет? ... 2. Никогда ей не пользовался -> всегда копирует в фоне, зачем мне эта кнопка... даже не жалею что ее нет. Ну надо так! понимаете, НА-ДО. Тот же TC: поставьте фоновое копирование, а потом еще раз вызовите диалог копирования F5 -> вот пока он у вас висит он блокирует контролы основного окна TC(нельзя с ним работать), но то копирование что было запущено можно отменить или приостановить -> его управление не заблокировано! > 1. Где смысл модального окна? Она нужно там где нужно, а не везде! > 2. ShowDialog с параметром (принимает IWin32Window) - этот метод как раз таки и позволяет блокировать определенную форму, а не все. Именно оно нужно, но никак не Application.Run. Пример пож-та в студию, я как не крутил этот owner так и не добился нужного эффекта. Про "позволяет блокировать определенную форму, а не все" не нагуглил ничего подобного. Вместо Application.Run(), можно использовать тот-же showdialog, но всеровно в другом потоке. Прислушиваться не к чему. Критиковать, не означает только обосрать, надо указать как должно быть. Через 3 поста вы выдавили про IWin32Window, а до этого отсылали рассматривать какие-то абстракции типо архитектура и т.д. Я все понимаю старость не в радость, высокомерие через край... но "здоровость" вашей критики под сомнением. Вот мой говнокод, так я вызываю окно которое не хочу блокировать модальностью других: Code: private Thread t; static private void thread_run() { Program.f3 = new Form3(); Program.f3.ShowDialog(); } public void show() { if (Program.f3 == null || t == null || (!Program.f3.loaded)) { t = new Thread(thread_run); t.Start(); } else Program.f3.Invoke(new ThreadStart(delegate() { Program.f3.Activate(); })); } Приведите ваш пример, с IWin32Window
1. >>1. holyshit!! т.е. код после ShowDialog спокойно может исполнятся не дожидаясь пока диалог че-то там вернет? ... Советую вчитаться в ответ. Если не понятно, могу посоветовать сделать примерно так: 1. Кинуть на форму таймер, написать обработчик события, который к примеру будет показывать текущее время вплоть до секунд, интервал - 1 секунду и запустить. 2. Кинуть на ту же форму кнопку, которая будет открывать модальное окно (p.s. MessageBox то же самое окно, абсолютно) 3. Нажать эту кнопку, дабы отобразилось модальное окно. 2. >>2. Никогда ей не пользовался -> всегда копирует в фоне, зачем мне эта кнопка... даже не жалею что ее нет. Советую нажать, посмотреть что будет. Form1 - ButtonClick Form2 frm = new Form2(); frm.ShowDialog(this) - будет модальным окном только для Form1. frm.ShowDialog() - будет модальным окном для всего приложения (грубо говоря для всех окон). Если этого не понятно, могу написать пример и залить/отправить/запостить исходники.
в каком потоке генерируется собитие Timer_tick ? Code: private void button2_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.ShowDialog(this); } private void button1_Click(object sender, EventArgs e) { Form3 f3 = new Form3(); f3.Show(); } Нажмите сначала button1, а потом button2. Попробуйте закрыть Form3. Она вылазит на передний план если ее на таскбаре кликнуть, но контроль заблокирован! желаю!
нет слов, одни эмоции =))) Code: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { new Form2().ShowDialog(this); } } Code: public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var f = new Form3(); f.Show(); } }
ага, это как в универе - типичная отмазка препода, который чувствует свою не компетентность, но не хочет этого показать. В вашем случае, вы уже все показали - так что поздно отмазываться и самое время последовать своему же совету. А на будущее, если вы чего то не знаете - молчите! Ваши бесплатные советы про "пойти почитать книги" никому даром не нужны.
Ребята, подскажите пожалуйста, как заставить с шарпе numericUpDown выводить значения до 10 с нулем впереди. Например не 1, а 01, 02 и т.д. Есть ли какой-то параметр или еще что-то?