Invisible at run-time. Как определить?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Invisible at run-time. Как определить?

Сообщение burik » 05.04.2008 (Сб) 14:40

Как определить является ли контрол видимым в run-time?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 20:15

burik
А зачем определять это? Этот факт остаётся всегда неизменным -- либо он видимый, либо он невидимый. В design-time ты же знаешь, какой он, поэтому вшивай в программу соответсвующее значения.

И всё-таки я не пойму, где это нужно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.04.2008 (Сб) 20:18

Если контрол для внутреннего пользования, то самый простой способ - спросить об этом контейнер.

Я контролов .ocx не делаю, так что пользуюсь таким способом:
В контроле объявляю событие

Event ifVisibleMe(danet as boolean)
Event whereI(x as long, y as long)
и т.д. для любых свойств, к которым не имею доступа изнутри.


Там, где мне нужно узнать, видим ли я, инициирую событие:
RaiseEvent ifVisibleMe(danet)
myVisible=danet

Теперь в контейнере, во время срабатывания события, сообщаю:
Private Sub myCtrl1_ifVisibleMe(danet As Boolean)
danet =myCtrl1.visible
End Sub

Хакер
А нужно, кстати, довольно часто. И с чего ты, решил, что контрол всегда останется видим? Хозяен же может его по собственному усмотрению прятать и показывать.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 20:23

arthur2
Если ты извращенец, то хотя бы не учи извращенствам других, ещё не испорченых людей.

ADDED:
А нужно, кстати, довольно часто. И с чего ты, решил, что контрол всегда останется видим? Хозяен же может его по собственному усмотрению прятать и показывать.

С того, что речь идёт о контроллах, которые вообще невидимы в Run-time, о контроллах подобных таймеру. Потому как в названии темы упоминается свойство InvisibleAtRuntime, имеющееся у UserControl-а, придающее контроллу как раз такую особенность.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.04.2008 (Сб) 20:32

Хакер
Прости дурака, о великий!
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 20:33

:roll:

Может хватит уже этого выпендрежа по поводу "великих", "снисхождения гуру до тебя" и пр.?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 05.04.2008 (Сб) 21:26

У невидимых в run-time обычно нет свойства Visible. Но это, конечно, ненадёжный способ. С другой стороны, действительно, зачем это надо?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.04.2008 (Сб) 21:57

Хакер
А ты не снобствуй.

Если это правда про то свойство, которое Invisible - тогда действительно незачем. Аб-со-лют-но.

Но если бы речь шла о свойстве, которое просто изнутри недоступно, то чем плох мой способ? Предложите свой получше, я с удовольствием буду им пользоваться вместо своего извращенческого.
Артур
 
   

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 05.04.2008 (Сб) 22:17

Это требуется для моего самописного контрола-контейнера. В котором мне ужасно нехватает полос прокрутки и которые я туда прикрутил. Все работало пока я туда таймер не кинул.. Таймер я конечно могу и рядом положить, сути не измениться, но что бы в будущем спокойно юзать этот контрол решил доработать. Я там просто перебираю контролы, нахожу макс. width+left и top+height и выставляю значения для полос прокрутки. А вот у InvisibleAtRuntime контролов это не работает (свойств left, top, width и height просто нет).. Еще думаю как вариант - перебрать дочерние окна (GetWindow) и получить RECT каждого.. Такое прокатит с таймером? Или еще как-то можно такое сделать?

P. S. А вообще сейчас даже интересно стало: неужели никак нельзя определить?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 22:32

arthur2 писал(а):А ты не снобствуй.

Во-первых, я не снобствую. Я замечаю 1) подмечаю, что предложенный тобой способ - есть дрянной способ и 2) отвечаю на твой вопрос. Во-вторых, что за приказной тон?

arthur2 писал(а):Но если бы речь шла о свойстве, которое просто изнутри недоступно, то ...

Что значит изнутри? Изнутри чего? Объекта, которому оно относится? Что ещё за свойства, которые недоступны изнутри объекта, но доступны снаружи? :?
arthur2 писал(а):чем плох мой способ?

Да всем. Начиная от того, что события используются не по назначению, вопреки всем концепциям ООП, и заканчивая невероятно гадким именем переменной (я о той, которая danet).


burik
Такое не прокатит с таймером, потому как у таймера есть своё окно, которое может тебе помешать.

Поэтому:
Т.к. ты перебираешь контролы, то очевидно, что всё-это происходит через позднее связывание. А раз так - то лучший способ, просто игнорировать ошибку Object doesn't support this property or method.

Но если конечно хочется именно точно узнать (что вряд ли целесообразно), можно запросить у объекта ITypeInfo, и узнать, а поддерживает ли он свойства Left, Top, Width, Height.

С другой стороны, налицо неправильный подход. Зачем вообще подсчитывать каждый раз Left+Width и Top + Height. У тебя что они, самопроизвольно перемещаются что-ли?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 05.04.2008 (Сб) 22:43

Такое не прокатит с таймером, потому как у таймера есть своё окно, которое может тебе помешать.


Есть окно, но нету RECT? Такое разве бывает?

С другой стороны, налицо неправильный подход. Зачем вообще подсчитывать каждый раз Left+Width и Top + Height. У тебя что они, самопроизвольно перемещаются что-ли?


Самопроизвольно нет, но юзверь(точнее программер его использующий) может переместить.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 22:45

Есть окно, но нету RECT? Такое разве бывает?

Есть окно и есть RECT. Совершенно левый, который может влиять на результат подсчёта Bounding-box'а.

Самопроизвольно нет, но юзверь(точнее программер его использующий) может переместить.

Ну так вот и подсчитывай в этот момент - если нижняя грань перемещаемого элемента вышла ниже подсчитанной ранее границы - то подсчитывай эту границу заново. А не перебирай всё подряд каждый раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.04.2008 (Сб) 22:47

Хакер
Как узнать, видим контрол или нет, изнутри контрола?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 22:51

Что значит в рамках данного вопрос слово "видим"? Его состояние свойства Visible или состояние его InvisibleAtRunime ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.04.2008 (Сб) 22:57

Хакер
Ты специально?
Состояние свойства визибл
Состояние свойства лефт
состояние свойства нэйм
и т д.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 22:59

arthur2
У тебя помутнение рассудка что-ли? Что "специально"?

Ты можешь корректно задать свой вопрос?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 05.04.2008 (Сб) 23:43

Что ещё за свойства, которые недоступны изнутри объекта, но доступны снаружи?


Свойстово UserControl.Width есть, а свойства UserControl.Left нет. Как узнать это свойство?

Хакер (предпологаемый ответ): ты же сам написал, что этого свойства нет. Как можно узнать то, чего нет?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.04.2008 (Сб) 23:49

UserControl.Extender.Left
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 06.04.2008 (Вс) 0:04

Ну вот, спасибо. Мой извращенческий способ отменяется.

Немного погодя:
Стоп! пошёл исправлять у себя код, и тут же выяснил - не факт, что это нужно делать. Для некоторых случаев мой способ всё-же удобнее.

Первый подход. Правильный.
UserControl.Extender.move 10,10,100.100
Я, контрол, двигаюсь куда хочу.

Второй подход. "Неправильный" (пока не убедишь, что есть способ лучше, сталю в кавычки)
RaiseEvent moveMe(10,10,100,100)
Я, контрол, прошу подвинуть меня туда-то.

Во втором случае я предоставляю контейнеру решать, как именно меня двигать (может в контейнере система координат другая, или он вообще не хочет позволять мне двигаться?)
Артур
 
   

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 06.04.2008 (Вс) 12:29

Хакер, спасибо. Да, правильней будет менять значения макс. x,y только при перемещении/добавлении/удалении объектов в контроле.
Сам удивляюсь как я про обработчик ошибок не сообразил.. :oops:
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.04.2008 (Вс) 12:37

Учти, что в этом алгоритме есть одна тонкость: надо применить чуть-чуть изобретательности, когда будешь делать обработку случая, когда самый нижний контролл перестаёт быть самым нижним.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 23

    TopList