|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
Скажем так, нажимаем на форме кнопку, запускается действо, например секунд на 10-15. Дабы юзер не заскучал поверх формы выводится FormProgress, ну например с ProgressBar Выводить FormProgress как диалог я не могу, тогда у меня не будет выполняться код основной формы, который делает действо и рисует этот самый Progress. Чтобы основная форма при этом не скокожилась и не впала в состояние "Окно не отвечает" (если юзер например елозит по ней мышью или другим окном) , немного разбавляем код Application.DoEvents() -проверенный способ. Но при этом надо исключить взаимодействие юзера с основной формой (чтоб кнопочки не нажимались и т.п.) Для этого обрамляем код в Me.Enabled=False/Me.Enabled=True Ну т.е. схематично: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Проблема в чем. Если в .Net делаешь форме Me.Enabled=False она по индукции пытается отобразить этот факт на всех элементах, на ней находящихся. Т.е. серые ListView, TextBox-ы и т.д. (В VB6 внешний вид элементов не меняется, они не выглядят задизейбленными). Мне эта "серая визуализация" не нравится. Как побороться? P.S. У меня огромная просьба. Не надо обсуждать/критиковать приведенную архитектуру. Просто ответьте на мой вопрос, если вдруг знаете. Мне просто надо сделать Enabled=False, но чтоб при этом не менялся внешний вид элементов формы. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 03:11 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
Дмитрий77, В VB6 решалось подложкой под контролы PictureBox/Frame, здесь я думаю надо попробовать также ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 11:32 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
Не помогло, скорее всего свойство Enabled обрабатывает внутри себя дочерние контролы, если контрол-контейнер Работает через API Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 11:58 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
VSVLADРаботает через API Ну ДА, уже подумывал об этом, надо попробовать. PictureBox/Frame у меня хватает, видимо поэтому в VB6 таких вопросов не возникало. Вот только недавний пример когда API "спасло" в другой ситуации. Иконка: чтоб не отображалась на форме, но отображалась в панели задач и по Alt+TAB ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 12:58 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
VSVLAD, Ну ДА, то что надо: Код: vbnet 1. 2. 3. 4. 5. 6.
Благодарствую. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 13:45 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
Я делал по другому. на форму кидал Panel и в нее все остальное. прогрессбар - кидал только на форму (не в панель). при нажатии на кнопку панель блокируется и показывается прогресс. как только все закончилось - панель активна , а поргресс исчезает. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 14:17 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
_=ДОБРЫНЯ=_, я попробовал блокировать панель, через свойство Enabled, но она блочит все контролы внутри себя ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 15:06 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
VSVLAD, _=ДОБРЫНЯ=_ говорит не про "серую индукцию внутри себя". Он начал обсуждать "алгоритм", но это уже дело вкуса - как прогресс показывать и какие извращения при этом делать. В моем алгоритме их хватает, но здесь главное чтоб смотрелось прилично (что выполняется), поэтому просил не обсуждать. А с API отлично дизейблится, пойду переделывать/доделывать несколько "применений" что наваял ранее и забил. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 15:26 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
VSVLAD_=ДОБРЫНЯ=_, я попробовал блокировать панель, через свойство Enabled, но она блочит все контролы внутри себя Блокирует. Мое мнение таково - контролы которые "задействованы" в парралельном потоке - не должны эксплуатироваться пользователем пока работает парралельный поток. Как только он завершит своюработу - все разблокируется. Я попробывал представленный способ с API. Ниче не блокируется как хотел ТС, НО! Блокируется вся форма наглухо. Ничего нельзя с ней сделать. В моем способе блокируются только то что нужно блокировать, а с формой можно проводить манипуляции - перетаскивание, скрывание, ресайз и т.д. Ну, у каждого свои потребности.... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 17:06 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
_=ДОБРЫНЯ=_НО! Блокируется вся форма наглухо. Ничего нельзя с ней сделать. ...проводить манипуляции - перетаскивание, скрывание, ресайз и т.д. А когда ты диалог поверх формы выводишь, ты тоже форму под ним таскаешь и ресайзишь? Почему я не использую FormProgress.ShowDialog я объяснил в первом посте. Теоретически могу, но тогда мне придется пихать весь смысловой код в FormProgress, а мне удобнее использовать единую FormProgress для разных действий. FormProgress - просто отображалка (шапка , Label, картинка, ProgressBar) - содержание проще засовывать в нее внешним кодом. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 17:35 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
VSVLADя попробовал блокировать панель , через свойство Enabled, но она блочит все контролы внутри себя А через API? Панель? Если уж на то пошло. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 17:46 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
Дмитрий77, Не попробовал, но вероятнее всего даст нужный эффект, залочится, контролы будут недоступными, но не задизеблинными ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 18:29 |
|
Есть способ блокирнуть форму, не используя Enabled=False?
|
|||
---|---|---|---|
#18+
Дмитрий77Почему я не использую FormProgress.ShowDialog я объяснил в первом посте. Теоретически могу, но тогда мне придется пихать весь смысловой код в FormProgress, а мне удобнее использовать единую FormProgress для разных действий. Пихать весь код в FormProgress и не нужно. FormProgress.ShowDialog - и это не нужно, кроме каких-то особых случаев. У меня нет цели Вас переубеждать, я выложил одно из своих направлений которое сейчас использую и работает очень хорошо. ПрогрессБар, лейблы и даже GIF-и создаются динамически. Если использую Бэкграундворкер - то там есть метод по "дерганью" прореса и лебла (если надо) или каких-то еще действий. Если использую что-то другое -то дергаю делегат. А если использовать API - то вся форма становится залоченной (не серой) и ничего сделать с ней низя. Кстати - как еще вариант с панелью - можно просто создавать динамически панел на самой форме и делать ее поверх всех. Ниче с контролами сделать не получится так как кликанье будет по панеле. + можно же в эту панель напихать прогресов, леблов... да чего угодно. вобщем - фантазировать можно как угодно. Но это так, к слову ... |
|||
:
Нравится:
Не нравится:
|
|||
25.04.2015, 19:22 |
|
|
start [/forum/topic.php?fid=20&msg=38945213&tid=1401615]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 323ms |
total: | 437ms |
0 / 0 |