Страница: 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