Создание класса

Тема в разделе ".NET", создана пользователем Serrr, 12 сен 2010.

  1. Serrr

    Serrr Гость

    Репутация:
    0
    Всем здравствуйте.

    Создал класс (просто, чтобы разобраться в этой теме)

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"текст класса"</div></div><div class="sp-body"><div class="sp-content">

    Код:
    
    
    Public Class Peremen
    Private VL As Integer
    Private Txt As String = "Peremen "
    Private Nme
    Public Event Kr(ByVal sender As Object, ByVal c As String)

    Public Sub New()
    Dim ff As Integer = Form1.Coun
    Nme = Txt & ff
    Form1.Coun += 1
    End Sub

    Public ReadOnly Property Name() As String
    Get
    Name = Nme
    End Get
    End Property

    Public Property Vall() As Integer
    Get
    Vall = VL
    End Get
    Set(ByVal value As Integer)
    VL = value
    End Set
    End Property

    Public ReadOnly Property Kvadrat()
    Get
    Kvadrat = VL ^ 2
    If Kvadrat / 6 = Int(Kvadrat / 6) Then
    RaiseEvent Kr(Me, "квадрат кратен 6")
    End If
    End Get
    End Property

    Public ReadOnly Property Kub()
    Get
    Kub = VL ^ 3
    If Kub / 4 = Int(Kub / 4) Then
    RaiseEvent Kr(Me, "куб кратен 4")
    End If
    End Get
    End Property

    Код:
    
    



    и класс формы соответственно, тоже есть:

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"класс формы"</div></div><div class="sp-body"><div class="sp-content">

    Код:
    
    
    Public Class Form1
    Public Coun As Integer = 0
    Private Coll As New Collection
    WithEvents F As Peremen

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    If TextBox1.Text <> "" And IsNumeric(TextBox1.Text) And ListBox1.SelectedItem <> Nothing Then
    Dim f = CType(Coll.Item(ListBox1.SelectedItem), Peremen)
    f.Vall = Val(TextBox1.Text)
    Label1.Text = f.Vall & " " & f.Kvadrat & " " & f.Kub
    Else
    Label1.Text = ""
    End If
    End Sub

    Private Sub KRT(ByVal sender As Object, ByVal c As String) Handles F.Kr ' это обработчик события
    Label2.Text = sender.name
    Label3.Text += " : " & c
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    F = New Peremen
    Coll.Add(F, F.Name)
    ListBox1.Items.Add(F.Name)
    End Sub

    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    Label2.Text = ""
    Label3.Text = ""
    TextBox1.Text = CType(Coll.Item(ListBox1.SelectedItem), Peremen).Vall
    End Sub
    End Class

    Код:
    
    

    при нажатии кнопки на форме в ListBox добавляется имя экземпляра класса Peremen, и в коллекцию Coll добавляется сам экземпляр класса.

    при ListBox_SelectedIndexChanged значение Vall выбранного экземпляра присваивается в TextBox.Text (такой тоже имеется на форме).

    при изменении текста в TextBox, Val(этого текста) присваивается выбранному в ListBox_е экземпляру Peremen.

    а в самом классе Peremen при вычислении куба и квадрата значения включаются события (Raise Event, насколько я понял)

    Событие выражается в присваивании текста Label_ам



    Теперь ВОПРОС знатокам:

    почему событие происходит только при изменении значения последнего созданного экземпляра?
    Насколько я читал литературу, понимаю - класс создал экземпляр и забыл о нём при создании следующего. Может, читал неправильно... Но не могу понять, как заставить все экземпляры класса включать свои события.
     
  2. etc

    etc Гость

    Репутация:
    0
    Читайте про DataBinding
     
  3. Serrr

    Serrr Гость

    Репутация:
    0
    Айне секундер, уважаемый..

    А кому указывать-то про этот DataBinding?
    F - это же класс.. Может, я и не понимаю чего..
    Можно не столь туманно?
     
  4. etc

    etc Гость

    Репутация:
    0
  5. Serrr

    Serrr Гость

    Репутация:
    0
    я правильно понял, что это намёк на то, чтобы коллекцию экземпляров класса сразу к списку ЛистБокса привязывать?
     
  6. etc

    etc Гость

    Репутация:
    0
    Да. И не только к листвоксу, но также и к эдитам. Через CurrencyManager (BindingSource)
     
  7. Serrr

    Serrr Гость

    Репутация:
    0
    кто такой эдит? и кто такой канвас?(канвас в другой теме, просто заодно узнать..)
    я понимаю, что все нормальные люди начинают изучение чего-либо с определений (понятий),
    но получилось так, что я с другого бока подошёл к ВБ.нет :unsure:
     
  8. vital

    vital Больной Компом Детектед

    Репутация:
    0
    Регистрация:
    29 янв 2006
    Сообщения:
    2.431
    Симпатии:
    40
    Книжку почитать не?
     
  9. Serrr

    Serrr Гость

    Репутация:
    0
    да читал я.. эту книжку я даже выложил (правда в форуме ВБ) остальные в формате ПДФ попадаются отвратительного качества.
    Но фраза "привязать коллекцию экземпляров к эдитам" мне ни о чём не говорит. :unsure:
     
  10. etc

    etc Гость

    Репутация:
    0
    У вас есть коллекция. Вы хотите чтобы на форме работали с ней синхронно, типа вот в гриде выбрали строку, а остальные контролы (леблы, едиты ...) сразу отображали (и редактировали) информацию которая есть у выбранного рова. Можно все это делать руками как вы и начали в топике, но есть уже готовый механизм - DataBinding, он все это уже умеет. Вам надо просто научится его готовить и работать с ним.
     
  11. Serrr

    Serrr Гость

    Репутация:
    0
    Уточню на всякий случай.

    Целью программы было то, чтобы ВСЕ экземпляры класса (не одновременно или ещё как-либо, а при выборе этого экземпляра в списке) включали событие вычисления куба и квадрата заданного пользователем значения этого экземпляра. То есть при обращении к свойствам .куб и .квадрат должны происходить события (RaiseEvent). У меня происходит событие только при выборе последнего из созданных экземпляров (даже в пошаговом режиме проверял).

    Вы именно так поняли то, что я в топике написал?
     
  12. etc

    etc Гость

    Репутация:
    0
    Я не понимаю что такое "включали событие". А если 2 раза "выбрать экземпляр" то 2 раза "включить"? ерунда какаято :unsure:
     
  13. Serrr

    Serrr Гость

    Репутация:
    0
    Код:
    
    
    Public ReadOnly Property Kvadrat()
    Get
    Kvadrat = VL ^ 2
    If Kvadrat / 6 = Int(Kvadrat / 6) Then
    RaiseEvent Kr(Me, "квадрат кратен 6") ' насколько я понял здесь происходит включение события (ну то есть программа говорит, чтобы управление переходило к обработчику события)
    End If
    End Get
    End Property
    Код:
    
    
    то есть цель этой программы сугубо учебная, нацеленная на что-то вроде проверки достиг ли объект края экрана, например
     
  14. etc

    etc Гость

    Репутация:
    0
    Это ваще не понятный код. Это ридонли (кстати а зачем тут ридонли??) свойство, и когда ктото запрашивает его, может (в зависимости от условий) сработать обработчик события Kr.
    В чем смысл всего этого - покрыто мраком.

    Добавлено:
    А где его привязывание? Вощем вы непонятно чего делаете. Надо решать задачу а не сферических коней.
    Расскажите о ТЗ. без колекций событий и классов.
     
  15. Serrr

    Serrr Гость

    Репутация:
    0
    Ещё раз - этот класс я сделал для того, чтобы понять, как надо создавать классы. Событие здесь просто ради события, чтобы оно происходило.

    По примеру в MSDN решил сделать класс, чтобы у него были свойства, и чтобы были события. А где и как описывать эти события, куда их привязывать - я не нашёл. Вот я и задал на форуме этот вопрос.

    Понимаю, что для опытных программистов моя писанина непонятна абсолютно :unsure:

    До этого я сам не пробовал создать свой класс.
     
  16. etc

    etc Гость

    Репутация:
    0
    Так вы его описали в своем классе:
    Код:
    Public Event Kr(ByVal sender As Object, ByVal c As String)
    А как привязывать надо посмотреть в мсдн http://msdn.microsoft.com/en-us/library/ms...7(v=VS.90).aspx
     
  17. Serrr

    Serrr Гость

    Репутация:
    0
    То есть параметры в описании события правильно указаны?

    Потому что хотел, чтобы обработчик знал, какой объект вызвал событие и что надо вывести в сообщении.
     
  18. etc

    etc Гость

    Репутация:
    0
    А компилятор что говорит?
     
  19. Serrr

    Serrr Гость

    Репутация:
    0
    Связи с нэтом не было...
    Заканчмваю эту тему, т.к. додумался:

    Надо было просто переместить обработчик события моего класса в текст моего класса, а у меня изначально он был написан в классе формы.

    Уважаемый ЕТЦ, Вам спасибо за желание помочь :) (+1)
     
  20. etc

    etc Гость

    Репутация:
    0
    Ну это спорный вопрос. Я бы не сказал где обработчика место.
     
Загрузка...

Поделиться этой страницей