TypeOf

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

TypeOf

Сообщение Alexanbar » 17.10.2005 (Пн) 21:11

Есть ли эквивалент этого оператора?
Есть подозрение, что при переносе DLL на другой комп. он перестаёт работать:


Public Sub DrawContainerBG(Ctrl As Object, ByVal hdc As Long, ByVal hwnd As Long, Optional Container As Object)

Dim CntObj As Object
Dim tcrPar As RECT, tcr As RECT, tcrw As RECT

If Not CntObj Is Nothing Then
If TypeOf Ctrl Is Data Then
Set CntObj = Container
Else
Set CntObj = Ctrl.Container

End If

If TypeOf CntObj Is SSTab Then
....

ElseIf TypeOf CntObj Is Frame Then

....

end if

endif
end sub



ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 17.10.2005 (Пн) 23:35

Как понять, он перестанет работать?
TypeOf вызывает QueryInterface и передает guid того интерфейса, который сравнивается. Если код Dll не менялся, то и результат его работы будет всегда один.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 18.10.2005 (Вт) 0:17

Передаю в процедуру объект Ctrl, например, как я думаю, SSTab, а typeof, по всей видимости, не возвращает TRue, когда приносишь это на другой комп или переустанавливаешь ОСь

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

Сообщение alibek » 18.10.2005 (Вт) 7:37

Эквивалент - TypeName.
Только лучше найди, где у тебя баг.
Lasciate ogni speranza, voi ch'entrate.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 18.10.2005 (Вт) 7:51

alibek писал(а):Эквивалент - TypeName.
Только лучше найди, где у тебя баг.


Баг именно в этом. Это всё используется для отрисовки элементов в стиле XP. Если я в процедурах отрисовки использую конкретные типы контролов в объявлениях, например:

Dim SSTab1 as SStab

идут глюки. для Toolbara это проявлялось в его "лысении" при смене компа. Как только я записал

Dim TB as Object

вместо

Dim TB as Toolbar

"лысение" пропадало.

А теперь и-за typeof идёт непрозрачность фреймов и прочих контролов, поскольку неверное поведение typeof приводит к тому, что не попадаем ни в одну ветку оператора if.

coderx
Новичок
Новичок
 
Сообщения: 29
Зарегистрирован: 05.09.2005 (Пн) 10:44
Откуда: Узбекистан

Сообщение coderx » 18.10.2005 (Вт) 8:09

Я в своих прогах, обычно, в имени элементов использую префиксы, и определяю его начальным три буквам... Можеть это тебе поможет.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2005 (Вт) 11:28

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

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.10.2005 (Вт) 11:34

А причём здесь имя элементов?

Код: Выделить всё
txtAddress
cmdCancel
chkIsActive

Угадай с первого раза, какое название принадлежит какому контролу :lol:
Способ определения типа, конечно, не из лучших, но право на существование имеет.
Лучший способ понять что-то самому — объяснить это другому.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 18.10.2005 (Вт) 15:54

coderx писал(а):Я в своих прогах, обычно, в имени элементов использую префиксы, и определяю его начальным три буквам... Можеть это тебе поможет.


Хотелось бы, чтобы все работало для любых имён

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.10.2005 (Вт) 16:07

Дык всё и работает для любых имен.


А нет там такого, что имеется в виду common controls 5.0, а проверяется 6.0?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 18.10.2005 (Вт) 19:19

Заменил Typeof на TypeName. Как обычно, у меня на компе работает. А у вас?
Вложения
Test SSTab.zip
(62.99 Кб) Скачиваний: 23
Последний раз редактировалось Alexanbar 19.10.2005 (Ср) 0:38, всего редактировалось 1 раз.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 18.10.2005 (Вт) 19:44

Откомпиленый выдает:
Run-Time 429
ActiveX не может создать обьект.

Исходник не смотрел

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 18.10.2005 (Вт) 20:46

GAGArin писал(а):Откомпиленый выдает:
Run-Time 429
ActiveX не может создать обьект.

Исходник не смотрел


А XPSTYLE.dll зарегистрировал с помощью regsvr32.exe?
А MS Windows XP установил?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 18.10.2005 (Вт) 21:30

2Alexanbar: У меня все работает, но какой смысл городить огород? Ты не пробовал использовать манифесты?
Кстати, операторы TypeOf и TypeName суовершенно не эквивалентны.
Один объект может давать true на сравнение с разными типами(typeof), но при этом TypeName у каждого объекта один.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 18.10.2005 (Вт) 23:15

ANDLL писал(а):2Alexanbar: У меня все работает, но какой смысл городить огород? Ты не пробовал использовать манифесты?
Кстати, операторы TypeOf и TypeName суовершенно не эквивалентны.
Один объект может давать true на сравнение с разными типами(typeof), но при этом TypeName у каждого объекта один.

1) В этом то вся и прелесть, что типы для windows числятся как разные, а для меня они абсолютно одинаковые.
2) манифест не обеспечивает полноценного воспроизведения темы табов, а для vb6 вообще половина контролов не отрисовывается. Контролы из VB5 использовать не очень хочется, особенно Listview.
3) Кстати, если всё нормально, монотонно-серого фона у SSTAb, Frame, Option и Check не должно быть.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 20.10.2005 (Чт) 8:28

Вчера заменил typeof на typename ещё в одном месте, иначе не работало:

Public sub xxx(Lvw as object, ..)
if not (typeof (lvw) is LIstview) then exit sub
....
end sub



Иначе после переустановки ОСи всякий раз, когда я пытаюсь передать Listview, происходит возврат из процедуры, поскольку Vb бессовестно врёт, говоря, что я подсовываю ему не Listview.

Так что оператор typeof выкидываем на помойку.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 11:15

А если скобки убрать, которые вокруг lvw?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 20.10.2005 (Чт) 14:43

GSerg писал(а):А если скобки убрать, которые вокруг lvw?

Да нет, скобки не причём. Просто писал по-памяти. Суть в том, что, проект, состоящий из нескольких *.exe, *.dll, компилируется на одном компе, создаётся дистирибутив. Далле дистибутив ставится на другой комп или переустанавливается ОСь, и Listview становится не Listview, SSTab - не SSTAb ... .
Даже был такой случай, правда связанный не с typeof, а с объявлениями внутри процедур типа:

Dim TB as Toolbar

Установил дистриб на другом компе, всё работает правильно с точки зрения отрисовки в XP стиле. Запускаю на этом компе VB и пробую создавать новый проект с применением *.dll. Toolbar в проекте лишился картинок. Перекомпилирую исходник *.dll - в проекте (без изменеия кода!!!!) Toolbar стал с картинками, а в программе, установленной, с дистрибутиав - без картинок.

Лысение убрал только после того, как объявил

Dim TB as Object.

А на днях заметил, что Фреймы, Option-ы и Ck-и, отрсованные мной, стали непрозрачными после того, как переустановлена ОСь. Оказалось, что в данном случае виноват TypeOf.

И вообще, я понял, что как только внутри процедур в *.dll ссылаешься на конкретные имена типов контролов, VB почему-то перестаёт их чуять как таковые после смены компа или переустановки ОСи.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 14:55

Нет, так не может быть.
Значит, при этой самой переуставновке были установлены другие версии используемых компонентов.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 140

    TopList