Страница: 1 | 2 |
Вопрос: Как создать массив контрола в виде коллекции?
Добавлено: 08.04.07 02:59
Автор вопроса: Legon
Ответы
Всего ответов: 30
Номер ответа: 16
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #16
Добавлено: 09.04.07 14:08
да неее.. уж больно речь у него грамотно поставлена.. он определенно понимает то, что говорит.. просто недостаточо точно выражает свои мысли...
Номер ответа: 17
Автор ответа:
Legon
Вопросов: 4
Ответов: 32
Профиль | | #17
Добавлено: 09.04.07 16:27
Мужики, во-первых хочу сказать спасибо, за то, что откликнулись. Во-вторых поизвинятся, так как ЕРОС был прав - я упустил из виду, что свойство ИТЕМ в классе должно быть по умолчанию. После чего долго размышлял (логически) и понял в чем моя ошибка, когда убрал с экрана код самого класса коллекции:
Public Class PicViewCollections
'Add, Item, Remove, Count ...
...
End Class
Public Class PicView
Dim m_PicViewCollections As PicViewCollections
Public ReadOnly Property Items() As PicViewCollections
Get
'Return m_PicViewCollections
'НО!, m_PicViewCollection = Nothing
End Get
End Class
А при отладке, когда в тестовом проекте я попытался получить количество,
MsgBox(PicView.Items.Count)
Я получил ошибку типа:
Method not found: 'LVItemsCollections testControl1.MListView.get_LVItems()
Так вот, мой бАльшой вопрос (надеюсь сформулирован правильно):
Как мне правильно создать свойство ИТЕМС?
Что он должен вернуть, или как его правильно объявить?
Номер ответа: 18
Автор ответа:
Legon
Вопросов: 4
Ответов: 32
Профиль | | #18
Добавлено: 09.04.07 16:31
Да, и в свое оправдание хочу сказать, что на ВБ я не новичек, и работал на разные направления.
НО! Я никогда не работал над созданием классов, никогда не создавал свои контролы, И, на .НЕТ я только начинаю переходить. )
Номер ответа: 19
Автор ответа:
Legon
Вопросов: 4
Ответов: 32
Профиль | | #19
Добавлено: 09.04.07 16:50
P.S. Еще раз прошу прощения. Так как имена в моем проекте отличаются от имен в примере (только имена), привожу исправленное сообщение об ошибке:
Method not found: 'PicViewCollections MyProject1.PicView.get_Items()
Номер ответа: 20
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #20
Добавлено: 09.04.07 19:35
Legon,
Так а m_PicViewCollections ничему не равно..., это просто пустая переменная, поэтому и Nоthing...
Создай экземпляр класса PicViewCollections и в конструкторе PicView например, приравняй m_PicViewCollections этому экземпляру класса...
P.S ООП с нуля
Номер ответа: 21
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #21
Добавлено: 09.04.07 19:40
Public Class PicView
Dim m_PicViewCollections As PicViewCollections
Sub New()
m_PicViewCollections = 'экземпляр(!!!) класса PicViewCollections!
End Sub
Public ReadOnly Property Items() As PicViewCollections
Get
Return m_PicViewCollections
'НО!, m_PicViewCollection = Nothing
End Get
End Class
Номер ответа: 22
Автор ответа:
-АлександР-
Вопросов: 55
Ответов: 1008
Web-сайт:
Профиль | | #22
Добавлено: 09.04.07 19:45
Обычно экземпляр класса (по-кр. мере я так делаю) в свойство только для чтения я ложу вывожу из какого-нибудь другого свойства, которое можно записывать, или из конструктора
Dim m_PicViewCollections As PicViewCollections
Sub New(e As PicViewCollections)
m_PicViewCollections = e
End Sub
Public ReadOnly Property Items() As PicViewCollections
Get
Return m_PicViewCollections
'НО!, m_PicViewCollection = Nothing
End Get
End Class
давай, удачи
Номер ответа: 23
Автор ответа:
Legon
Вопросов: 4
Ответов: 32
Профиль | | #23
Добавлено: 09.04.07 21:50
УУУУААААААУУУУУ! Заработало!!!!!!!
Спасибки!!!!!
Мужики, вы будете смеятся (я например когда писал это мес, смеялся), но у меня возник "ИСЧО" один вопрос (прошу простить за назойливость но кроме вас помочь больше некому). Так вот:
Имея UserControl MPicView и свойство Items типа PicViewCollections у меня через методы, кнопки классно попадают в коллекцию. А как мне зделать так, чтобы они на ЮсерКонтроле отображались и удалялись.
По логике, реализация должна быть заложена в методах самой коллекции, но коллекция то абстрактная, и ни к одному контейнеру не привязана. Значит реализовывать нужно в самом ЮсерКонтроле, но как отследить изменения в коллекции? И как вообще программно добавить кнопку (или любой контрол) на форму?
Я сам уже "замахался"...
Номер ответа: 24
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #24
Добавлено: 09.04.07 22:03
Вариант, предложенный -АлександР- лично мне не мовсем нравится.. В его примере, чтобы создать экземпляр класса PicView в конструктор надо передавать экземпляр PicViewCollections, что в общем то не совсем верно, поскольку эта коллекция является внутренней и доступ из вне к ней должен быть закрыт.. А посему предлогаю поступить следующим образом - инициализировать PicViewCollections ВНУТРИ самого класса.. либо в конструкторе либо при объвлении..
Вариант 1:
Dim m_PicViewCollections As New PicViewCollections
Вариант 2:
Dim m_PicViewCollections As PicViewCollections
Sub New()
m_PicViewCollections = New PicViewCollections
End Sub
в этом случае ты никогда не получишь исключения подобного тому что у тебя было..
Номер ответа: 25
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #25
Добавлено: 09.04.07 22:12
Верной дорогой идешь товарисчЪ!!
Реализовать надо именно в UserContol. Сейчас объсню суть, а реализацию оставлю тебе.. сложностей она не должна вызвать..
Итак что мы имеем..
1.Чтобы контролы отображались на UserControl тебе необходимо их добавить в сам UserControl, поскольку он ничего не знает о существовании твоей PicViewCollections.
2. Для этого у него есть коллекция Controls. Работа с ней ничем не отличается отработы с обычной коллекций..
3. Тебе надо в методах твоей PicViewCollections (Аdd,Remove) добавить еще по 1-2 строчке чтобы сопоставить сою коллекцию контролов (Button) с коллекцией UserControl
Ну вот собственно и все...
Номер ответа: 26
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #26
Добавлено: 09.04.07 22:15
Сорри за невнимательность.. некорректный вариант был предложен автором а не -АлександР-..
Номер ответа: 27
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #27
Добавлено: 09.04.07 23:52
Ну и чтоб ты не мучался.. примерная реализация твоих классов с тестом...
''' <summary>
''' VS 2005
''' EROS
''' </summary>
''' <remarks>Example using UserControl and ControlCollection</remarks>
Public Class Form1
'// Test UserControl
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
'// PicView1 & Button1 must be added in form!!!!!
'// Add 2 buttons
PicView1.Items.Add(New Button) '// button without text & location
PicView1.Items.Add("MyButton", _
New Point(50, 50)) '// button with text & location
'// Test collection
Me.Text = PicView1.Items(1).Text
End Sub
End Class
Public Class PicView
Inherits UserControl
Public Sub New()
'// Initialization
_Items = New PicViewCollection(Controls)
Me.Size = New Size(200, 200)
End Sub
Private _Items As PicViewCollection
Public ReadOnly Property Items() As PicViewCollection
Get
Return _Items
End Get
End Property
'// Реализация остальных свойств и методов
End Class
Public Class PicViewCollection
Private _owner As Control.ControlCollection
Public Sub New(ByVal owner As Control.ControlCollection)
_owner = owner
End Sub
Public Sub Add(ByVal value As Button)
_owner.Add(value)
End Sub
Public Sub Add(ByVal value As String, _
ByVal location As Point)
Dim _button As New Button
With _button
.Text = value
.Location = location
End With
_owner.Add(_button)
End Sub
 efault Public ReadOnly Property Item(ByVal index As Integer) As Button
Get
Return _owner.Item(index)
End Get
End Property
'// Дальше переопределяешь нужные методы и свойства
End Class
Номер ответа: 28
Автор ответа:
Legon
Вопросов: 4
Ответов: 32
Профиль | | #28
Добавлено: 10.04.07 16:08
Извините, что долго не отвечал. (и за небольшой флуд - температура совсем свалила ).
Спасибо вам всем! Все работает! Жаль что мы с разных городов. Очень хотелось бы вас всех увидеть и угостить пивком! (Сорри за еще один флуд).
Знаю, как это смотрится, но у меня последний вопрос (по теме массива контролов). Как им добавить события (допустим КЛИК)?
Номер ответа: 29
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #29
Добавлено: 10.04.07 21:23
''' <summary>
''' VS 2005
''' EROS
''' </summary>
''' <remarks>Example using UserControl and ControlCollection</remarks>
Public Class Form1
'// Test UserControl
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
'// PicView1 & Button1 must be added to form!!!!!
PicView1.Items.Add("MyButton 1", New Point(0, 0))
PicView1.Items.Add("MyButton 2", New Point(80, 0))
PicView1.Items.Add("MyButton 3", New Point(0, 30))
PicView1.Items.Add("MyButton 4", New Point(80, 30))
End Sub
Private Sub PicView1_ItemClick(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles PicView1.ItemClick
MessageBox.Show((CType(sender, Button)).Text & " was clicked!", _
"vbnet.ru", _
MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End Sub
End Class
<System.ComponentModel.DefaultEvent("ItemClick"> _
Public Class PicView
Inherits UserControl
Public Event ItemClick As EventHandler
Public Sub New()
'// Initialization
_Items = New PicViewCollection(Controls, _
AddressOf OnItemClick)
Me.Size = New Size(200, 200)
End Sub
Private _Items As PicViewCollection
Public ReadOnly Property Items() As PicViewCollection
Get
Return _Items
End Get
End Property
Protected Overridable Sub OnItemClick(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
RaiseEvent ItemClick(sender, e)
End Sub
End Class
Public Class PicViewCollection
Private _owner As Control.ControlCollection
Private _onItemClickDelegate As EventHandler
Friend Sub New(ByVal owner As Control.ControlCollection, _
ByVal OnItemClickDelegate As EventHandler)
_owner = owner
_onItemClickDelegate = OnItemClickDelegate
End Sub
Public Sub Add(ByVal value As Button)
AddHandler value.Click, _
AddressOf OnItemClick
_owner.Add(value)
End Sub
Public Sub Add(ByVal value As String, _
ByVal location As Point)
Dim _button As New Button
With _button
.Text = value
.Location = location
End With
AddHandler _button.Click, _
AddressOf OnItemClick
_owner.Add(_button)
End Sub
 efault Public ReadOnly Property Item(ByVal index As Integer) As Button
Get
Return _owner.Item(index)
End Get
End Property
Public Sub RemoveAt(ByVal index As Integer)
Dim _item As Button = _owner(index)
RemoveHandler _item.Click, _
AddressOf OnItemClick
_owner.RemoveAt(index)
End Sub
Private Sub OnItemClick(ByVal sender As System.Object, _
ByVal e As System.EventArgs)
_onItemClickDelegate.Invoke(sender, e)
End Sub
End Class
Номер ответа: 30
Автор ответа:
Legon
Вопросов: 4
Ответов: 32
Профиль | | #30
Добавлено: 11.04.07 20:04
Добрался до компутера, чтобы еще раз поблагодарить всех вас! Все работает! Спасибо!
Думаю, тема закрыта!
oleg_coder@ukr.net