• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Serrr
  • Дата начала
S

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

Код:

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_ам



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

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

Serrr

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

etc

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

Serrr

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

vital

кто такой эдит? и кто такой канвас?(канвас в другой теме, просто заодно узнать..)
я понимаю, что все нормальные люди начинают изучение чего-либо с определений (понятий),
Книжку почитать не?
 
S

Serrr

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

etc

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

Serrr

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

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

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

etc

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

Serrr

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

то есть цель этой программы сугубо учебная, нацеленная на что-то вроде проверки достиг ли объект края экрана, например
 
E

etc

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

Добавлено:
Private Sub KRT(ByVal sender As Object, ByVal c As String) Handles F.Kr ' это обработчик события
А где его привязывание? Вощем вы непонятно чего делаете. Надо решать задачу а не сферических коней.
Расскажите о ТЗ. без колекций событий и классов.
 
S

Serrr

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

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

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

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

Serrr

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

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

etc

S

Serrr

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

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

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

etc

Надо было просто переместить обработчик события моего класса в текст моего класса, а у меня изначально он был написан в классе формы.
Ну это спорный вопрос. Я бы не сказал где обработчика место.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!