Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как увидеть из контрола в дизайн-тайме обьекты контейнера / 25 сообщений из 25, страница 1 из 1
25.05.2006, 11:11
    #33750643
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Поставили задачу написать контрол с PropertyPage, чтоб в нем можно было работать с формой-контейнером В ДИЗАЙН ТАЙМЕ. Ну и цветовым индикатором там сигнализировать допустим - есть ли на форме ВСЕ необходимые элементы для работы этого контрола.
А не вижу в дизайн-тайме формы-контейнера.... Кто-нидь чего-нидь подскажет?
...
Рейтинг: 0 / 0
25.05.2006, 11:55
    #33750833
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Поиск всех ImageList-ов на хозяине UserControl-а, заполнение выпадающего списка их именами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
 'В модуле страницы свойств
Private Sub PropertyPage_SelectionChanged()
 Dim UC As UserControl1
 Dim ctl As Object
 Set UC = SelectedControls( 0 ) 'Вставить обработчик ошибок
 cboImageListName.Clear
 cboImageListName.AddItem "<None>"
 For Each ctl In UC.Parent.Controls 'Вставить обработчик ошибок
    If TypeOf ctl Is MSComctlLib.ImageList Then
       cboImageListName.AddItem ctl.Name
    End If
 Next ctl
 If Len(UC.ImageListName) Then
    cboImageListName.Text = UC.ImageListName
 Else
    cboImageListName.Text = "<None>"
 End If
End Sub

 'В модуле UserControl-а
Private m_ImageListName As String

Friend Property Get ImageListName() As String
 ImageListName = m_ImageListName
End Property

Public Property Get Parent() As Object 'либо Friend
 Set Parent = UserControl.ParentControls( 0 )
End Property
...
Рейтинг: 0 / 0
25.05.2006, 13:16
    #33751185
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Ссылка Y вашим способом "UserControl.ParentControls(0)" на форму контейнер получается отлично. Только я видимо туплю уже и не пойму почему я не могу получить прямо из контрола перечисление всех обьектов X формы:
...
Рейтинг: 0 / 0
25.05.2006, 13:31
    #33751244
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Удивительно также, что из PropertyPage ЭТИМ ЖЕ СПОСОБОМ перечисление контролов на форме выполнить получается...
...
Рейтинг: 0 / 0
25.05.2006, 13:47
    #33751311
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
sysadm2000,
я не понял вопроса. В модуле UserControl-а можно напрямую обратиться к элементам управления хозяина, коллекция ParentControls содержит 0-м элементом хозяина, затем идут "детки":
Код: plaintext
1.
2.
3.
 For Each X In UserControl.ParentControls
    Print X.Name 'Вместе с формой-хозяином
 Next
Но в модуле PropertyPage так не получится - из него видны только Public и Friend свойства экземпляра UserControl-а. Поэтому приходится помогать, делая свойство Parent.
...
Рейтинг: 0 / 0
25.05.2006, 13:48
    #33751326
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
И второго вопроса не понял - почему удивительно?
...
Рейтинг: 0 / 0
25.05.2006, 15:21
    #33751789
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Код: plaintext
коллекция ParentControls содержит  0 -м элементом хозяина, затем идут "детки":
Не вижу деток. Только ссылку на форму вижу, а элементов формы не вижу.

Вообще уже получилась такая PropertyPage.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
Private Sub PropertyPage_SelectionChanged()
Dim UC As MultySTD
Dim X As Object
Set UC = SelectedControls( 0 )
''сначала просто загрузили комбешники
For Each X In UC.Parent1.Controls
    If TypeName(X) = "CommandButton" Then
        cbAddAll.AddItem (X.Name)
        cbAddOne.AddItem (X.Name)
        cbDelAll.AddItem (X.Name)
        cbDelOne.AddItem (X.Name)
    End If
    If TypeName(X) = "FlexGridST" Then
        cbTop.AddItem (X.Name)
        cbLeft.AddItem (X.Name)
        cbRight.AddItem (X.Name)
    End If
Next
''теперь отпозиционировали их
Dim Name1 As String, i As Integer
For i =  0  To cbAddAll.ListCount -  1 
    If cbAddAll.List(i) = "btAddAll" Then cbAddAll.ListIndex = i
Next
For i =  0  To cbAddOne.ListCount -  1 
    If cbAddOne.List(i) = "btAddOne" Then cbAddOne.ListIndex = i
Next
For i =  0  To cbDelAll.ListCount -  1 
    If cbDelAll.List(i) = "btDelAll" Then cbDelAll.ListIndex = i
Next
For i =  0  To cbDelOne.ListCount -  1 
    If cbDelOne.List(i) = "btDelOne" Then cbDelOne.ListIndex = i
Next
For i =  0  To cbTop.ListCount -  1 
    If cbTop.List(i) = "grTop" Then cbTop.ListIndex = i
Next
For i =  0  To cbLeft.ListCount -  1 
    If cbLeft.List(i) = "grLeft" Then cbLeft.ListIndex = i
Next
For i =  0  To cbAddAll.ListCount -  1 
    If cbRight.List(i) = "grRight" Then cbRight.ListIndex = i
Next
End Sub

Private Sub cbAddAll_Click()
Changed = True
End Sub
Private Sub cbAddOne_Click()
Changed = True
End Sub
Private Sub cbDelAll_Click()
Changed = True
End Sub
Private Sub cbDelOne_Click()
Changed = True
End Sub
Private Sub cbLeft_Click()
Changed = True
End Sub
Private Sub cbRight_Click()
Changed = True
End Sub
Private Sub cbTop_Click()
Changed = True
End Sub

''теперь выбор юзера вписали в контрол
Private Sub PropertyPage_ApplyChanges()
SelectedControls( 0 ).btAddAll_Name = cbAddAll.Text
SelectedControls( 0 ).btAddOne_Name = cbAddOne.Text
SelectedControls( 0 ).btDelAll_Name = cbDelAll.Text
SelectedControls( 0 ).btDelOne_Name = cbDelOne.Text
SelectedControls( 0 ).grTop_Name = cbTop.Text
SelectedControls( 0 ).grLeft_Name = cbLeft.Text
SelectedControls( 0 ).grRight_Name = cbRight.Text
End Sub

Соотвественно контрол имеет свойства
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Dim AddAll_Name As String
Dim AddOne_Name As String
Dim DelAll_Name As String
Dim DelOne_Name As String
Dim Top_Name As String
Dim Left_Name As String
Dim Right_Name As String

''это свойство позволяет в PropertyPage получить ссылку на форму-контейнер
Public Property Get Parent1() As Object
 Set Parent1 = UserControl.ParentControls( 0 )
End Property

''в эти свойства PropertyPage сохраняет настройки контрола выбранные в Дизайн-тайме
Public Property Let btAddAll_Name(X As String)
AddAll_Name = X
End Property
Public Property Let btAddOne_Name(X As String)
AddOne_Name = X
End Property
Public Property Let btDelAll_Name(X As String)
DelAll_Name = X
End Property
Public Property Let btDelOne_Name(X As String)
DelOne_Name = X
End Property
Public Property Let grTop_Name(X As String)
Top_Name = X
End Property
Public Property Let grLeft_Name(X As String)
Left_Name = X
End Property
Public Property Let grRight_Name(X As String)
Right_Name = X
End Property
Public Property Get btAddAll_Name() As String
btAddAll_Name = AddAll_Name
End Property
Public Property Get btAddOne_Name() As String
btAddOne_Name = AddOne_Name
End Property
Public Property Get btDelAll_Name() As String
btDelAll_Name = DelAll_Name
End Property
Public Property Get btDelOne_Name() As String
btDelOne_Name = DelOne_Name
End Property
Public Property Get grTop_Name() As String
grTop_Name = Top_Name
End Property
Public Property Get grLeft_Name() As String
grLeft_Name = Left_Name
End Property
Public Property Get grRight_Name() As String
grRight_Name = Right_Name
End Property

'в контроле в PropertyBag всегда после него идет UserControl_ReadProperties
Private Sub UserControl_Initialize()
Image1.Picture = IL1.ListImages("RED").Picture
End Sub

И вот теперь-то в контроле надо манипулировать с обьктами формы - имена их уже есть - их выбрал юзер в Дизайн-тайме, а сослаться на них из контрола не могу. Вижу только ссылку на форму. Не могу перечислить контролы на контейнере (по выбранным юзером именам) - и дальше собственно начать смысловой алгоритм контрола.
...
Рейтинг: 0 / 0
25.05.2006, 16:37
    #33752055
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
"Не вижу" - это что, в ParentControls кроме формы ничего нет?

Вот, обсуждал недавно на другом форуме .
...
Рейтинг: 0 / 0
25.05.2006, 16:40
    #33752068
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Кстати, в Property Let неполохо бы вставлять PropertyChanged "ИмяСвойства".
...
Рейтинг: 0 / 0
25.05.2006, 17:10
    #33752206
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Код: plaintext
в ParentControls кроме формы ничего нет?
Абсолютно ничего. Хотя на форме гора кнопок и сеток.
...
Рейтинг: 0 / 0
25.05.2006, 17:39
    #33752318
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Код: plaintext
И второго вопроса не понял - почему удивительно?
А удивляет все это меня потому, что из PropertyPage (которая от формы радикально дальше чем сам контрол) - я все таки увидел кнопки и сетки на форме...
...
Рейтинг: 0 / 0
25.05.2006, 17:45
    #33752348
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Т.е. в PropertyPage я увидел все элементы формы, с которыми должен работать алгоритм контрола(как видите - все комбешники в PropertyPage заполнены), передал их в контрол и....
как дальше вычитать значения из сеток и собственно начать довольно таки нехилый алгоритм контрола, если, увы, эти имена бесполезны - из самого контрола я не вижу ничего в контейнере...
...
Рейтинг: 0 / 0
25.05.2006, 17:49
    #33752360
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Что-то не в порядке в Датском королевстве. Можешь сделать тестовый проект - я повожусь вечером?
...
Рейтинг: 0 / 0
25.05.2006, 17:56
    #33752379
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Ща все в рабочем проекте - тут сотни форм, контролов, коннектов, репортов и всего-всего...
Ща в вырежу этот конкретный момент в отдельный проект и выложу его прямо сюда в исходниках...
...
Рейтинг: 0 / 0
25.05.2006, 18:14
    #33752427
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Готово - тестовый проект во вложении.
Чтобы быстрее вспомнить отладку Дизайн-тайма напомню: запускать его не надо. Сначала надо открыть контрол и в нем поставить BREAK на точке Print X.Name (перечисление всего что видно на форме).
После чего в IDE просто открывать форму... И наблюдать за значением X...
...
Рейтинг: 0 / 0
25.05.2006, 18:23
    #33752443
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
В этом контроле вообще нетривиальная идея задумана - визуальный код возврата - зеленый квадрат или красный. Типа если контролу все необходимое есть на форме и в библиотеках - он видим на форме как зеленый, а если чего-то не хватает - то как красный (эти рисунки и содержит его единственный элемент ImageList).
В целом же в рантайме этот контрол должен держать в себе УНИВЕРСАЛЬНЫЙ алгоритм редактирования размещеных на форме сеток, отражающих отношения типа многие-ко-многим. Со всякими наворотами типа UNDO и тд.
В общем тут еще начать и кончить...
...
Рейтинг: 0 / 0
25.05.2006, 18:39
    #33752486
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Как говорится - век учись.
При переносе кода из ReadProperties в Show или Paint список выводится. Очевидно, это свойство MDI child-формы, потому что с обычной формой такого не наблюдается. По-видимому, это связано с порядком создания элементов управления на форме.
...
Рейтинг: 0 / 0
25.05.2006, 18:59
    #33752533
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Ни когда бы не додумался что перечисление КОТОРОГО НЕТ ВООБЩЕ в UserControl_ReadProperties может ВДРУГ появится в UserControl_Show.
За что и ненавижу шестерку за ее непредсказуемость.
В семерке ВЕСЬ обслуживающий служебный код явно виден в FORM.DESIGNER.VB, куда я довольно часто ЯВНО и сам вношу изменения (например делаю что-то из FRIEND - PUBLIC).
Никаких детских нежиданностей вроде этой БЫТЬ ПРОСТО НЕ МОЖЕТ - к тому же в VB.NET весь вспомогательный код трассируется в отладчике ЯВНО и явно видны все преобразования в нем....
Мда.... Ну и дела....
...
Рейтинг: 0 / 0
25.05.2006, 19:02
    #33752537
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Кстати я не увидел привязку этого бага к MDIChild - Если снять этот флаг - ничего не меняется
...
Рейтинг: 0 / 0
25.05.2006, 19:10
    #33752554
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Еще один прикол - после выполнения перечисления в SHOW:
...
Рейтинг: 0 / 0
25.05.2006, 19:11
    #33752557
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Перечисление (коллекция) есть и работает формально нормально - что есть на данный момент, то и показывает. Другое дело, когда элементы добавляются в коллекцию - вот тут могут быть претензии. Обрати внимание - если добавить сейчас на форму кнопку, она покажется в списке даже в ReadProperties. Т.е. дело в creation order-е.

С 7-кой не работал, сказать ничего не могу.
...
Рейтинг: 0 / 0
25.05.2006, 19:25
    #33752592
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Ну это еще интереснее - т.е. перечисляется часть коллекции в зависимости от порядка добавления контролов на форму - только то, что добавлено ПОЗЖЕ контрола....
Ну а у меня ж изначальная постановка задачи - привязатся контролом к УЖЕ лежашим на форме кнопкам - и ответить визуальным значком - всех ли там кнопок и сеток достаточно для начала работы замороченного-презамороченного алгоритма...
...
Рейтинг: 0 / 0
25.05.2006, 19:32
    #33752606
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
OFF.
Шарюсь в инете в поисках способы решения проблемы топика и наткнулся здесь http://ru.infocom.uz/more.php?id=131_0_1_0_M
на такую цитату:
Код: plaintext
1.
Весь мир делится на две группы людей: на тех, кто недолюбливает Visual Basic, 
и на тех, кто жить без него не может. Вы почувствовали себя во второй группе?
Хорошо, а как быть тем, кто до тошноты и рвоты ненавидит VB6 - видя все его КОНКРЕТНЫЕ недостатки по сравнению с VB7, но работает на нем на службе? На обьекте My я б все это за час решил вообще голову не напрягая...
...
Рейтинг: 0 / 0
26.05.2006, 02:08
    #33752929
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Да, MDIchild или нет, не влияет. Только порядок создания. В общем, резон в том, что в момент ReadProperties не все элементы управления созданы, есть. То, что упала в Show, бывает, главное, чтобы стабильно этого не делала. "Шарить" по форме надо позже ReadProperties, когда создано всё; до Paint-а вообще можно "курить". Но Paint также может быть не лучшим местом - похоже, надо делать явно вызываемый метод обновления (а Paint может его дёргать). Такой метод теоретически может пригодиться, если ты захочешь сделать а) plug-in, отслеживающий в design-time добавление элементов управления на форму, и сообщающий об этом UserControl-у (не спрашивай - никогда не делал), и б) создание элементов управления на форме в run-time.

=sysadm2000Шарюсь в инете в поисках способы решения проблемы топика и наткнулся здесь http://ru.infocom.uz/more.php?id=131_0_1_0_M ...
Забавно, но эту страницу я недавно видел. Автор не пробовал запускать своё творение в скомпилированном виде, либо пробовал, но решил промолчать, что из этого вышло.

=sysadm2000Хорошо, а как быть тем ...
Как быть? Я для себя этот вопрос решил, когда работал за границей, в аналогичных условиях - отставшие от жизни, но лицензионные средства разработки. Я считаю, что это умение работать с теми инструментами, что есть - часть профессионализма. Может, звучит пафосно, но потом пригодилось и до сих пор пригождается.
...
Рейтинг: 0 / 0
26.05.2006, 11:45
    #33753640
sysadm2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как увидеть из контрола в дизайн-тайме обьекты контейнера
Большое спасибо Бенедикт.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как увидеть из контрола в дизайн-тайме обьекты контейнера / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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