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

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

  1. Serrr

    Serrr Гость

    Всем здравствуйте.

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

    <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">

    Код (LotusScript):
     
    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

    Код ( (Unknown Language)):
     



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

    <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">

    Код (LotusScript):
     
    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

    Код ( (Unknown Language)):
     

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

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

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

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

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



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

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

    etc Гость

    Читайте про DataBinding
     
  3. Serrr

    Serrr Гость

    Айне секундер, уважаемый..

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

    etc Гость

  5. Serrr

    Serrr Гость

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

    etc Гость

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

    Serrr Гость

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

    vital Больной Компом Детектед
    Команда форума Web Team

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

    Serrr Гость

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

    etc Гость

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

    Serrr Гость

    Уточню на всякий случай.

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

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

    etc Гость

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

    Serrr Гость

    Код (LotusScript):
     
    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
    Код ( (Unknown Language)):
     
    то есть цель этой программы сугубо учебная, нацеленная на что-то вроде проверки достиг ли объект края экрана, например
     
  14. etc

    etc Гость

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

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

    Serrr Гость

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

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

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

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

    etc Гость

    Так вы его описали в своем классе:
    Код (LotusScript):
    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 Гость

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

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

    etc Гость

    А компилятор что говорит?
     
  19. Serrr

    Serrr Гость

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

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

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

    etc Гость

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

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