Назначение и перегрузка события. Сферы применения.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Назначение и перегрузка события. Сферы применения.

Сообщение Admiralisimys » 27.01.2010 (Ср) 11:42

Здравствуйте.
В качестве наглядного примера есть код
Код: Выделить всё
Imports System
Imports System.Windows.Forms
Imports System.Drawing

Class ModernLabel
    Inherits Label
    Protected Overrides Sub OnPaint(ByVal Pea As PaintEventArgs)
        'MyBase.OnPaint(Pea)
        Dim g As Graphics = Pea.Graphics
        g.DrawString(Me.Text, Font, Brushes.Black, 2, 2)
        g.DrawString(Me.Text, Font, Brushes.White, 0, 0)
    End Sub
End Class

Class Form1
    Inherits Form
    Shared Sub Main()
        Application.Run(New Form1)
    End Sub
    Sub New()
        Dim Label1 As New ModernLabel
        Label1.Parent = Me
        Label1.Text = "Label1 Text"
        Label1.Location = New Point(10, 10)
        'AddHandler Label1.Paint, AddressOf Label1_Paint
    End Sub
    'Private Sub Label1_Paint(ByVal Obj As Object, ByVal Pea As PaintEventArgs)

    'End Sub
End Class

К примеру для того что б организовать тень компонента Надпись (Label) можно создать наследующий его класс, в котором перегрузить событие (свойство) OnPaint.
Считаю такой подход наиболее рациональным, если есть потребность в множестве таких контролов, и тени везде должны быть одинаковы.
А что если хотим проделать указанное действие применительно к одному элементу или тень должна быть разная? Возможно ли как-то в этом случаи устроить через AddHandler Label1.Paint, AddressOf Label1_Paint?
И правильно ли полагать что AddHandler Object1.Event, AddressOf Object_Event декларирует, что мы хотим во время этого события делать, а Protected Overrides Sub OnPaint(ByVal Pea As PaintEventArgs) в наследующем классе, говорим как?

К примеру, в случаи кнопки событии Click для того что б кнопка пищал при нажатии не обязательно перегружать это событие, достаточно в процедуре события указать соответственный вызов.

P.S.
Много страничная тема Свой элемент управления была достаточно давно, и там практика, мне хотелось бы для начала разобраться в теории.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Назначение и перегрузка события. Сферы применения.

Сообщение MIT » 27.01.2010 (Ср) 11:54

Начну с того, что Overrides — это переназначение, а не перегрузка. Перегрузка - это создание одноименных функций/процедур, которые принимают разные входящие данные и возвращают однотипный результат. Переназначение же — замена кода одной функции/процедуры на другой, свой.

Admiralisimys писал(а):А что если хотим проделать указанное действие применительно к одному элементу или тень должна быть разная?
Привильнее сделать у контрола соответсвующие свойства (Тень: есть/нет, ТипТени:1/2/3/4), а процедура OnPaint должна просто учитавать все эти настройки.

Если ты добавляешь обработчик события, то код обработчкика может дополнить, а не заменить предусмотренные действия. Обработчиком события (в данном случае), можно, например, нарисовать поверх лейбла что-нибудь, однако процедура оотрисовки самого лейбла никак не зависит от наличия обработчкика, а также от кода, который в этом обработчике имеется.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Назначение и перегрузка события. Сферы применения.

Сообщение Admiralisimys » 27.01.2010 (Ср) 13:18

MIT спасибо за расстановку терминов. Верно ли, в качестве синонима, сказать что Overrides это переопределение? Хочу подкорректировать название темы. Или назначение заменить на "Добавить обработчик"? Посоветуй.

С AddHandler тоже ясно, можно утрировано сказать, что это Overrides Sub с не отключаемым MyBase.OnEvent()
Вот только что б получить текст Надписи, нужно будет использовать глобальную переменную (вернее в ней он будет хранится).

P.S.
Интересно, для чего практически может понадобится переназначать нажатие кнопки? Разве для создания своей кнопки. Но разве MyBase.OnEvent() не выполняется по умолчанию для не переназначенных событий? Какая сфера применения для этого практического случая?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Назначение и перегрузка события. Сферы применения.

Сообщение MIT » 27.01.2010 (Ср) 13:43

Admiralisimys писал(а):Верно ли, в качестве синонима, сказать что Overrides это переопределение?
Да, хотя само слово переводится несколько иначе.
Admiralisimys писал(а):С AddHandler тоже ясно, можно утрировано сказать, что это Overrides Sub с не отключаемым MyBase.OnEvent()
Не всегда: если, например, в твоем примере связь ясна (OnPaint и событие Paint), то для некоторых событий нет индивидуальных процедур внутри контрола (например в одной процедуре может создаваться 10 событий).
Admiralisimys писал(а):Вот только что б получить текст Надписи, нужно будет использовать глобальную переменную (вернее в ней он будет хранится).
Зачем? А как же стандартное свойство Text?

Admiralisimys писал(а):Интересно, для чего практически может понадобится переназначать нажатие кнопки?
Да мало ли. Может я захочу что бы при нажатии менялся текст? Прчем обязательно до нажатия, а не по событию. В данном случае я переопределю процедуру обработки нажатия в классе кнопки, напишу нужный код и вызову изначальную функцию (MyBase.OnClick).

Admiralisimys писал(а):Но разве MyBase.OnEvent() не выполняется по умолчанию для не переназначенных событий?
MyBase.OnEvent - это не событие, это процедура (или функция). Само по себе оно не вызывается и это правильно: ведь возможна ситуация, когда мне надо выполнить код обязательно до вызова или обязательно после вызова, а может быть я вообще не хочу вызывать изначальную процедуру/функцию?
Вот, например, недавно была ситуация:
Создал я, значит, свой класс, унаследованный от формы
Код: Выделить всё
Public Class MyForm
   Inherits Form
   Friend Overridable Function SomeFunction() As SomeType
      Throw New NotImplementedException
   End Function
   Public Sub New()
      msgbox(SomeFunction.ToString)
   End Sub
End Class

Если унаследовать от этого класса форму и попробовать ей воспользоваться, то результат очевиден — произойдет исключение. Что бы его не произошло, в наследующем классе надо переопределить эту функцию:
Код: Выделить всё
Public Class Form1
   Inherits MyForm
   Friend Overrides Function SomeFunction() As SomeType
      Return New SomeType
   End Function
End Class

При этом очевидно, что вызывать MyBase.SomeFunction совсем-совсем не стоит.


Admiralisimys писал(а):Хочу подкорректировать название темы.
Оставь его в покое...
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Назначение и перегрузка события. Сферы применения.

Сообщение Admiralisimys » 27.01.2010 (Ср) 14:13

MIT в переназначенном варианте свойство Текст доступно посредством объекта Ме. В случаи обработчика или Лейбл необходимо будет объявить как глобальную переменную (а не как сейчас в Sub New) или завести глобальную текстовую переменную.

Буду иметь ввиду, в .NET ещё не стыкался с такими событиями, для которых нету отдельных процедур внутри контрола (просто внутрь контрола до этой темы не лез :D ). По опыту Win32 могу предположить, что это за события, которые выполняются одновременно.

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

Класс, (в данном случаи наследующий Лейбл) был идентичный предку без переопределённого кода, с таким, но лишь со строчкой MyBase (которая выскакивает автоматом редактором). Изменения ощутил при закомментировании последней. Вот по этому посчитал что все вызовы по умолчанию выполняются, как указанны в предке. И отключается это только в случаи добавления переназначении и комментировании MyBase.
Постараюсь осмыслить приведённую ситуацию.

Добро, название оставлю как есть.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Назначение и перегрузка события. Сферы применения.

Сообщение MIT » 27.01.2010 (Ср) 14:21

Admiralisimys писал(а):По опыту Win32 могу предположить, что это за события, которые выполняются одновременно.
Как вариант, возможно такое:
Код: Выделить всё
Public Class MyClass
Public event Start
Public event Processed(Item as SomeType)
Public event Finish

Public SomeArray() as SomeType

Public Sub DoSmth()
  RaiseEvent Start
  For Each Item as SomeType In Me.SomeArray
    Debug.Print(Item.Tostring)
    RaiseEvent Processed(Item)
  End For
  RaiseEvent Finish
End Sub
End Class
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Назначение и перегрузка события. Сферы применения.

Сообщение Admiralisimys » 27.01.2010 (Ср) 15:24

MIT в обработчик Private Sub Label1_Paint(ByVal Obj As Object, ByVal Pea As PaintEventArgs) ведь передаются два параметра - Obj и Pea.
В нём указываем
Dim TmpLable As Label = Obj
и получаем Текст - TmpLabel.Text, так что +1 8)
Глобальные переменные можно не использовать.

P.S.
Интересно, почему в TmpLable пустое поле Name, в то время как, к примеру, Location заполнено верно. Хотя Name и Location не относятся к классу Object напрямую.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Назначение и перегрузка события. Сферы применения.

Сообщение MIT » 27.01.2010 (Ср) 15:33

Admiralisimys писал(а):ByVal Obj As Object
Вообще-то имя переменной (изначально) - Sender, что какбэ говорит нам. Во всех событиях контролов передается в качестве Sender`а объект, который вызвал событие. Т.е. в данном случае это Label: Dim TmpLable As Label = DirectCast(Obj, Label).
При этом TmpLable - это именно тот лейбл, который доступен как Me.Label1 (даже не смотря на то что ByVal), один и тот же объект, поэтому значение всех свойств объекта Label1 может быть получено и через TmpLable.

Почему "пустое поле Name" - не знаю, но догадываюсь, что у Label1 оно тоже не установлено. Если Label1 создан не дизайнером а руками, то значит ты просто забыл задать имя.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Назначение и перегрузка события. Сферы применения.

Сообщение Admiralisimys » 27.01.2010 (Ср) 15:47

MIT да, переменная действительно переименована.

Полагал что в Name должно быть имя переменной, в данном случаи - Label1. Видимо полагал зря, и такой автоматики не предусмотренно в .NET.
Спасибо, буду знать про ручное заполнение (а то как-то, что б отличить один от второго элемент управления (созданные динамически) в одном общем обработчике (как создавать динамически обработчик пока не знаю), проверял его координаты... :oops:
А всего - то нужно при создании задать имя, заполнив соответственное поле).
Последний раз редактировалось Admiralisimys 27.01.2010 (Ср) 15:52, всего редактировалось 1 раз.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Назначение и перегрузка события. Сферы применения.

Сообщение MIT » 27.01.2010 (Ср) 15:52

Name - это совершенно обычное свойство, оно не имеет отношения к названию переменной. Прояви любознательность и загляни в код, сформированный дизайнером. Для кнопки он будет примерно таким:
Код: Выделить всё
Me.BtnCancel.Location = New System.Drawing.Point(109, 28)
Me.BtnCancel.Name = "BtnCancel"
Me.BtnCancel.Size = New System.Drawing.Size(111, 25)
Me.BtnCancel.TabIndex = 0
Me.BtnCancel.Text = "Отменить"
Me.BtnCancel.UseVisualStyleBackColor = True

Для остальных контролов — аналогично.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Назначение и перегрузка события. Сферы применения.

Сообщение Admiralisimys » 27.01.2010 (Ср) 15:58

Я часто заглядываю в код созданным дизайнером, когда Среда под рукой. (То есть когда это не блокнот с %SystemRoot%\Microsoft.NET\Framework\v3.5\vbc)

Ещё раз спасибо за ответы MIT. :wink:

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Назначение и перегрузка события. Сферы применения.

Сообщение Dmitriy2003 » 27.01.2010 (Ср) 16:42

MIT писал(а):
Admiralisimys писал(а):Верно ли, в качестве синонима, сказать что Overrides это переопределение?
Да, хотя само слово переводится несколько иначе.

Мне кажется такое определение определение больше подходит к контексту...
MIT писал(а):...а может быть я вообще не хочу вызывать изначальную процедуру/функцию?

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 318
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Назначение и перегрузка события. Сферы применения.

Сообщение Admiralisimys » 27.01.2010 (Ср) 18:09

Dmitriy2003 может и так, да только Overrides в переводном термине "Перекрывание" наверное мало кому знаком.

К примеру в русскоязычной литературе есть мало популярный термин буксирование, означающий Drag & Drop.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Назначение и перегрузка события. Сферы применения.

Сообщение iGrok » 27.01.2010 (Ср) 18:47

Что-то у вас словари какие-то.. Глупые, что ли.. Слов мало знають. )
О как надо: http://multitran.ru/c/m.exe?CL=1&l1=1&s=override

Не знаю, как насчёт мало кому, но я всегда переводил override именно как перекрывать, переопределять.
Перегрузка у меня всегда ассоцировалась именно с возможностью иметь несколько вариантов функции/оператора, в зависимости от входных/выходных параметров.

Впрочем, что касается переводной литературы - везде применяется своя терминология, и подчас понять, что именно имеется в виду в той или иной главе книги можно только прочитав всю книгу с самого начала. )
label:
cli
jmp label

Dmitriy2003
Постоялец
Постоялец
 
Сообщения: 690
Зарегистрирован: 27.05.2003 (Вт) 22:47
Откуда: Deutschland

Re: Назначение и перегрузка события. Сферы применения.

Сообщение Dmitriy2003 » 27.01.2010 (Ср) 19:10

Admiralisimys писал(а):Dmitriy2003 может и так, да только Overrides в переводном термине "Перекрывание" наверное мало кому знаком.

Не, дело не в этом - просто вас сам vb путает...
Overrides
overrides

Но для vb (overrides == Overrides) вегда True. И внимательно изучив это становиться понятно почему в vb прияната форма - "Overrides"


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

    TopList