Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Есть способ блокирнуть форму, не используя Enabled=False? / 13 сообщений из 13, страница 1 из 1
25.04.2015, 03:11
    #38945108
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
Скажем так, нажимаем на форме кнопку, запускается действо, например секунд на 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.
Me.Enabled=False

Do
  Application.DoEvents() 'не тупо, можно раз в 100 итераций например
  Делаем дела
  FormProgress.ProgressBar.Value=FormProgress.ProgressBar.Value+1
  когда дела сделаны, Exit Do
Loop

Me.Enabled=True



Проблема в чем.
Если в .Net делаешь форме Me.Enabled=False она по индукции пытается отобразить этот факт на всех элементах, на ней находящихся. Т.е. серые ListView, TextBox-ы и т.д. (В VB6 внешний вид элементов не меняется, они не выглядят задизейбленными).
Мне эта "серая визуализация" не нравится.
Как побороться?


P.S. У меня огромная просьба. Не надо обсуждать/критиковать приведенную архитектуру.
Просто ответьте на мой вопрос, если вдруг знаете.
Мне просто надо сделать Enabled=False, но чтоб при этом не менялся внешний вид элементов формы.
...
Рейтинг: 0 / 0
25.04.2015, 11:32
    #38945159
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
Дмитрий77,

В VB6 решалось подложкой под контролы PictureBox/Frame, здесь я думаю надо попробовать также
...
Рейтинг: 0 / 0
25.04.2015, 11:58
    #38945167
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
Не помогло, скорее всего свойство Enabled обрабатывает внутри себя дочерние контролы, если контрол-контейнер

Работает через API

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Public Class Form1

    Private Declare Function EnableWindow Lib "user32" (ByVal hWnd As Integer, ByVal fEnable As Integer) As Integer

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        'Enable через 2 секунды
        With New Timer
            AddHandler .Tick, Sub() EnableWindow(Me.Handle.ToInt32, 1)
            .Interval = 2000
            .Start()
        End With

        'Disable
        EnableWindow(Me.Handle.ToInt32, 0)
    End Sub

End Class
...
Рейтинг: 0 / 0
25.04.2015, 12:58
    #38945181
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
VSVLADРаботает через API
Ну ДА, уже подумывал об этом, надо попробовать. PictureBox/Frame у меня хватает, видимо поэтому в VB6 таких вопросов не возникало.

Вот только недавний пример когда API "спасло" в другой ситуации.
Иконка: чтоб не отображалась на форме, но отображалась в панели задач и по Alt+TAB
...
Рейтинг: 0 / 0
25.04.2015, 13:45
    #38945203
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
VSVLAD,

Ну ДА, то что надо:

Код: vbnet
1.
2.
3.
4.
5.
6.
  Public Declare Function EnableWindow Lib "user32.dll" (ByVal hwnd As IntPtr, _
   ByVal bEnable As Boolean) As Boolean

EnableWindow(Me.Handle, False)
...
EnableWindow(Me.Handle, True)



Благодарствую.
...
Рейтинг: 0 / 0
25.04.2015, 14:17
    #38945213
_=ДОБРЫНЯ=_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
Я делал по другому.
на форму кидал Panel и в нее все остальное. прогрессбар - кидал только на форму (не в панель). при нажатии на кнопку панель блокируется и показывается прогресс. как только все закончилось - панель активна , а поргресс исчезает.
...
Рейтинг: 0 / 0
25.04.2015, 15:06
    #38945231
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
_=ДОБРЫНЯ=_,

я попробовал блокировать панель, через свойство Enabled, но она блочит все контролы внутри себя
...
Рейтинг: 0 / 0
25.04.2015, 15:26
    #38945241
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
VSVLAD,

_=ДОБРЫНЯ=_ говорит не про "серую индукцию внутри себя". Он начал обсуждать "алгоритм", но это уже дело вкуса - как прогресс показывать и какие извращения при этом делать. В моем алгоритме их хватает, но здесь главное чтоб смотрелось прилично (что выполняется), поэтому просил не обсуждать.

А с API отлично дизейблится, пойду переделывать/доделывать несколько "применений" что наваял ранее и забил.
...
Рейтинг: 0 / 0
25.04.2015, 17:06
    #38945275
_=ДОБРЫНЯ=_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
VSVLAD_=ДОБРЫНЯ=_,

я попробовал блокировать панель, через свойство Enabled, но она блочит все контролы внутри себя
Блокирует. Мое мнение таково - контролы которые "задействованы" в парралельном потоке - не должны эксплуатироваться пользователем пока работает парралельный поток. Как только он завершит своюработу - все разблокируется.

Я попробывал представленный способ с API. Ниче не блокируется как хотел ТС, НО! Блокируется вся форма наглухо. Ничего нельзя с ней сделать.
В моем способе блокируются только то что нужно блокировать, а с формой можно проводить манипуляции - перетаскивание, скрывание, ресайз и т.д.

Ну, у каждого свои потребности....
...
Рейтинг: 0 / 0
25.04.2015, 17:35
    #38945284
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
_=ДОБРЫНЯ=_НО! Блокируется вся форма наглухо. Ничего нельзя с ней сделать.
...проводить манипуляции - перетаскивание, скрывание, ресайз и т.д.
А когда ты диалог поверх формы выводишь, ты тоже форму под ним таскаешь и ресайзишь?
Почему я не использую FormProgress.ShowDialog я объяснил в первом посте.
Теоретически могу, но тогда мне придется пихать весь смысловой код в FormProgress,
а мне удобнее использовать единую FormProgress для разных действий.
FormProgress - просто отображалка (шапка , Label, картинка, ProgressBar) - содержание проще засовывать в нее внешним кодом.
...
Рейтинг: 0 / 0
25.04.2015, 17:46
    #38945287
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
VSVLADя попробовал блокировать панель , через свойство Enabled, но она блочит все контролы внутри себя
А через API? Панель? Если уж на то пошло.
...
Рейтинг: 0 / 0
25.04.2015, 18:29
    #38945295
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
Дмитрий77,

Не попробовал, но вероятнее всего даст нужный эффект, залочится, контролы будут недоступными, но не задизеблинными
...
Рейтинг: 0 / 0
25.04.2015, 19:22
    #38945307
_=ДОБРЫНЯ=_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть способ блокирнуть форму, не используя Enabled=False?
Дмитрий77Почему я не использую FormProgress.ShowDialog я объяснил в первом посте.
Теоретически могу, но тогда мне придется пихать весь смысловой код в FormProgress,
а мне удобнее использовать единую FormProgress для разных действий.


Пихать весь код в FormProgress и не нужно.
FormProgress.ShowDialog - и это не нужно, кроме каких-то особых случаев.

У меня нет цели Вас переубеждать, я выложил одно из своих направлений которое сейчас использую и работает очень хорошо.
ПрогрессБар, лейблы и даже GIF-и создаются динамически. Если использую Бэкграундворкер - то там есть метод по "дерганью" прореса и лебла (если надо) или каких-то еще действий. Если использую что-то другое -то дергаю делегат.

А если использовать API - то вся форма становится залоченной (не серой) и ничего сделать с ней низя.

Кстати - как еще вариант с панелью - можно просто создавать динамически панел на самой форме и делать ее поверх всех. Ниче с контролами сделать не получится так как кликанье будет по панеле. + можно же в эту панель напихать прогресов, леблов... да чего угодно. вобщем - фантазировать можно как угодно. Но это так, к слову
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Есть способ блокирнуть форму, не используя Enabled=False? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]