Как сделать свойсво антагонист у контрола?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1850
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Как сделать свойсво антагонист у контрола?

Сообщение ger_kar » 06.12.2016 (Вт) 15:32

Например у стандартного контрола TextBox есть свойство Visible, но для некоторых целей его бывает недостаточно и требуется аналогичное свойство, но с полностью противоположным эффектом NoVisible. Т.е. если для свойства Visible значение True будет означать видимость, то для NoVisible оно будет значить все ровно наоборот. Получается этакое свойство антагонист.
Для его реализации делаю следующее:
Беру и делаю свой UserControl с названием UserTextBox унаследовав его от стандартного контрола TextBox
Код: Выделить всё
Public Class UserTextBox
    Inherits TextBox

И делаю два противоположных по эффекту свойства:
Код: Выделить всё
Public Overloads Property Visible As Boolean
        Get
            Return MyBase.Visible
        End Get

        Set(ByVal value As Boolean)
            MyBase.Visible = value
        End Set
    End Property

    Public Property NoVisible As Boolean
        Get
            Return Not MyBase.Visible
        End Get

        Set(ByVal value As Boolean)
            MyBase.Visible = Not value
        End Set
    End Property

И все работает не так как надо. Если изменить значение одного свойства, то значение другого не изменяется. В VB6 можно было сделать PropertyChanged и все работало бы как надо, а тут так не сделаешь. Второй нюанс заключается в том, что свойство Visible действует только в рантайме, в режиме разработки, при изменении свойства контрол всегда остается видимым. И переопределенное свойство Visible так и работает, а вот его антагонист NoVisible при выставлении флага делает контрол невидимым прямо в режиме разработки. Что я не так делаю? И как сделать правильно. В MSDN на эту тематику я ответа не нашел.
Бороться и искать, найти и перепрятать

alibek
Большой Человек
Большой Человек
 
Сообщения: 14087
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как сделать свойсво антагонист у контрола?

Сообщение alibek » 06.12.2016 (Вт) 22:13

Не знаю, как в .NET, а в обычном VB следует менять не свойства, а внутреннюю флаговую переменную.
Затем вызывать событие и в обработчике события устанавливать свойство из этой переменной: .Visible = fVisible или .Visible = Not fHidden.
Lasciate ogni speranza, voi ch'entrate.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 153
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как сделать свойсво антагонист у контрола?

Сообщение Sam777e » 06.12.2016 (Вт) 22:15

Сразу предупреждаю: с .NET никогда не работал, с чем едят Overloads не знаю, UserControl делал лет лет 15 [ тому ] назад, решение не проверял.

2-ый нюанс хорошо описал замечательный писатель Николай Николаевич Носов.

— Что же делать? — спрашиваю я.
— А ты подумай.
— Да я уже два часа думал!
— Ну, присмотрись к задаче, — говорит Ваня. — Что ты видишь?
— Вижу, — говорю, — что 12 топоров и 3 пилы стоят 84 рубля, а 12 топоров и 5 пил стоят 100 рублей.
— Ну, ты замечаешь, что в первый раз и во второй топоров куплено одинаковое количество, а пил на две больше?
— Замечаю, — говорю я.
— А замечаешь, что во второй раз уплатили на 16 рублей дороже?
— Тоже замечаю. В первый раз уплатили 84 рубля, а во второй раз — 100 рублей. 100 минус 84, будет 16.
— А как ты думаешь, почему во в горой раз уплатили на 16 рублей больше?
— Это каждому ясно, — ответил я, — купили 2 лишние пилы, вот и пришлось уплатить лишних 16 рублей.
— Значит, 16 рублей заплатили за две пилы?
— Да, — говорю, — за две.
— Сколько же стоит одна пила?
— Раз две 16, то одна, — говорю, — 8.
— Вот ты и узнал, сколько стоит одна пила.
— Тьфу! — говорю. — Совсем простая задача! Как это я сам не догадался?!


И здесь та самая история.
В одном Property Overloads есть, в другом нет, одно Property имеет имя уже [ возможно / скорее всего ] имеющегося стандартного Свойства, а другое имя свое, оригинальное. Может быть, поэтому их цена поведение различаются ?

А сам вопрос [ и печаль по поводу отсутствия PropertyChanged ] решается методом KISS / "непромокаемого пороха". Правда, у меня имя Свойства нестандартное - но, может быть, здесь как раз и поможет неясная мне перегрузка / Overloads.

:salut:

Код: Выделить всё
Private m_myVisible As Boolean


Public Property myVisible As Boolean
  Get
    Return MyBase.m_myVisible
  End Get

  Set(ByVal value As Boolean)
    m_myVisible = Value
    MyBase.Visible = m_myVisible
  End Set
End Property


Public Property myNoVisible As Boolean
  Get
    Return Not m_myVisible
  End Get

  Set(ByVal value As Boolean)
    m_myVisible = Not Value
    MyBase.Visible = m_myVisible
  End Set
End Property

Здоровья и удачи

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1850
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Как сделать свойсво антагонист у контрола?

Сообщение ger_kar » 07.12.2016 (Ср) 7:20

Провел эксперименты. Если сделать парочку с именами myVisible/myNoVisible, отличные от базового свойства, то эта парочка начинает работать в "противофазе" между собой без всякого PropertyChanged. Т.е. выставление флага у одного свойства тут же влечет сброс флага у другого и наоборот. Но!
Опять таки все работает не так как надо.
Во первых при выставлении свойства myNoVisible = True (или myVisible = False) контрол сразу становится невидимым тут же в режиме разработки, что есть неправильно и добиться работы аналогично с базовым свойством Visible не получилось.
Во вторых парочка свойств myVisible/myNoVisible работает сама по себе в отрыве от Visible.
Вобщем совсем не то получается, совсем не то.
Вот ведь засада на ровном месте.
Бороться и искать, найти и перепрятать

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 153
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Как сделать свойсво антагонист у контрола?

Сообщение Sam777e » 07.12.2016 (Ср) 11:21

Очень давно не работал с GUI и не помню стандартного поведения при разработке / выполнении - это раз, только сейчас из второго твоего поста догадался, что тебе надо.


Раньше ( VB6 ) можно было сделать примерно так
MyBase.Visible = m_myVisible And UserControl1.Ambient.UserMode

У Хакера было замечательное решение, связанное с этой темой [ что-то с Debug ?? Там были примерно такие слова: "Изучайте документацию" - но я не сумел найти топик.

Про .NET не знаю; Google выдал
how-to-tell-if-net-code-is-being-run-by-visual-studio-designer
http://stackoverflow.com/questions/73515/
Здоровья и удачи

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 04.01.2017 (Ср) 15:12

Код: Выделить всё
Public Overloads Property Visible As Boolean

Просто удали это свойство и оставь только
Код: Выделить всё
Public Property NoVisible As Boolean
    Get
        Return Not Me.Visible
    End Get
    Set(ByVal value As Boolean)
        Me.Visible = Not value
    End Set
End Property

Думаю, после этого всё заработает.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList