Являеться ли объект контейнером

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Являеться ли объект контейнером

Сообщение GM » 06.03.2005 (Вс) 1:37

У меня есть хендл объекта, или сам объект, как мне определить являеться ли он контейнером(PictureBox,Frame) или нет (commandButton).
الفيجوال بيسك الرابح

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

Сообщение GSerg » 06.03.2005 (Вс) 8:09

if typeof obj is frame then...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 06.03.2005 (Вс) 8:22

Это чуть не то, мне нужен универсальный вариант. PictureBox,Frame я навел лиш к примеру.
الفيجوال بيسك الرابح

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 06.03.2005 (Вс) 11:16

Если EnumChildWindows что-то найдет - то является

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.03.2005 (Вс) 11:52

Serega.I писал(а):Если EnumChildWindows что-то найдет - то является
Контейнер м.б. и пустым!
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.03.2005 (Вс) 11:54

GSerg писал(а):if typeof obj is frame then...


Код: Выделить всё
if typeof obj is frame or typeof obj is picturebox then...


Какие ещё контейнеры есть? Перечисли все...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.03.2005 (Вс) 12:23

Их неограниченно много - любой ActiveX-контрол м.б. контейнером. Например, SSTab и DataRepeater - контейнеры.
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.03.2005 (Вс) 12:28

Предложение - кидать какой-либо оьъект SetParent'ом в нужный хендл. Если SetParent возвращает NULL, то объект - не контейнер. Так?

API-Guide писал(а):The SetParent function changes the parent window of the specified child window.
...
· hWndChild
Identifies the child window.
· hWndNewParent
Identifies the new parent window. If this parameter is NULL, the desktop window becomes the new parent window.
...
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.03.2005 (Вс) 12:35

Как оказалось, код

Код: Выделить всё
'Create a new project and add this code to Form1
Const FORMAT_MESSAGE_ALLOCATE_BUFFER = &H100
Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Const LANG_NEUTRAL = &H0
Const SUBLANG_DEFAULT = &H1
Const ERROR_BAD_USERNAME = 2202&
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Sub SetLastError Lib "kernel32" (ByVal dwErrCode As Long)
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

Private Sub Form_Click()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
   
    SetParent Command2.hWnd, Command1.hWnd
   
    DoEvents
   
    Dim Buffer As String
    'Create a string buffer
    Buffer = Space(200)
    'Set the error number
    'SetLastError ERROR_BAD_USERNAME
    'Format the message string
    FormatMessage FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, GetLastError, LANG_NEUTRAL, Buffer, 200, ByVal 0&
    'Show the message
    MsgBox Buffer
End Sub


возвращает "Операция успешно завершена", хотя, кажется, CommandButton - не контейнер? :?

Думаю дальше...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.03.2005 (Вс) 12:35

Может быть, кидать объект SetParent'ом в нужный хендл, а потом проверять его наличие в предполагаемом контейнере EnumChildWindows? Проверяю...

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

Сообщение GSerg » 06.03.2005 (Вс) 12:51

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

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.03.2005 (Вс) 12:54

Кстати, попробуйте CommandButton засунуть в CommandButton. И нажать на родительскую. Море эмоций! ;)
"Скрытая кнопка!" :lol:
Сейчас выложу результаты исследований

Код: Выделить всё
Option Explicit
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

Private Function CheckContainterness(hwnd As Long) As Boolean
SetParent Command1.hwnd, hwnd
DoEvents
If GetParent(Command1.hwnd) = hwnd Then CheckContainterness = True
End Function

Private Sub Form_Load()
MsgBox CheckContainterness(Picture1.hwnd)
End Sub


На форме кнопка Command1 и пикчербокс Picture1. Попробуйте с объектами, которые точно не контейнеры. Какие, например, есть? :)

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 06.03.2005 (Вс) 18:22

Да c Setparent тоже делал, и ничего это мне не дало, можна в любой контрол засунуть еще один :(
الفيجوال بيسك الرابح


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

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

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

    TopList