Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: VB6, событие к добавленному программно контролу Добавлено: 18.09.06 17:06  

Автор вопроса:  -АлександР- | Web-сайт: sham.clan.su
Добавил через Me.Controls.Add себе на форму несколко текстбоксов. А как сделать события на нах, чтобы работало типа:
Set textWidt(numLab) = Me.Controls.Add("VB.textbox", "lineWidth" & numLab, Me)
а потом lineWidth_change?

Заранее благодарен!

Ответить

  Ответы Всего ответов: 39  

Номер ответа: 1
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #1 Добавлено: 18.09.06 17:38

события на нах

Не понял. Ты имел ввиду события на них или события ну нах? :)
1. Забить на массив и объявлять переменные поштучно WithEvents.
2. Забить на Controls.Add и грузить через Load (предварительно положив экземпляр на форму).
3. Забить на события вообще и использовать враппер или сабклассинг.
Вкратце все.

Ответить

Номер ответа: 2
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #2
Добавлено: 18.09.06 18:07
Не понял. Ты имел ввиду события на них или события ну нах? :)
я имел в виду "на них". Опечатался просто...
2. Забить на Controls.Add и грузить через Load (предварительно положив экземпляр на форму).
Да load пробовал, хочется чего-то нового попробовать, узнать... вот и решил Add юзать

1. Забить на массив и объявлять переменные поштучно WithEvents.
Почему?

3. Забить на события вообще и использовать враппер или сабклассинг.
ну сабклассинг это ещё понятно, хотя смутно, что-то от sub и class, а враппер это чё такое?

Ответить

Номер ответа: 3
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #3
Добавлено: 18.09.06 18:13
Почему?
В смысле почему забить на массив?
И вообще откуда узнал, что у меня массив, из-за "lineWidth" & numLab что ли?


что-то от sub и class

И как, если я правилно понял про саб и класс, можно это реализоват?

Ответить

Номер ответа: 4
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #4 Добавлено: 18.09.06 18:13
Почему?

Потому что ты не объявишь массив WithEvents.
ну сабклассинг это ещё понятно, хотя смутно, что-то от sub и class, а враппер это чё такое?

Улыбнуло :)
Если говорить грубо - сабклассинг это переопределение оконной процедуры (с целью кустарной обработки сообщений), а враппер - это класс-обертка. Все просто.

Ответить

Номер ответа: 5
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #5 Добавлено: 18.09.06 18:16
И вообще откуда узнал, что у меня массив, из-за "lineWidth" & numLab что ли?

Именно :))
И как, если я правилно понял про саб и класс, можно это реализоват?

Еще раз улыбнуло :)
Никаких Sub и Class. Точнее, Sub будет, а вот вместо класса - Module & SetWindowLong. Глянь на форуме, примеров должно быть море.

Ответить

Номер ответа: 6
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #6
Добавлено: 18.09.06 18:29
Потому что ты не объявишь массив WithEvents.
Ну это можно обойти, например сделать массив модуял классса, а там в каждом соответственно withevents.... пусть
,не важно это

Глянь на форуме, примеров должно быть море
В том то и дело, что должно быть

Ответить

Номер ответа: 7
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #7
Добавлено: 18.09.06 18:31
Если говорить грубо - сабклассинг это переопределение оконной процедуры (с целью кустарной обработки сообщений), а враппер - это класс-обертка. Все просто.
А можно не грубо?

Ответить

Номер ответа: 8
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #8 Добавлено: 18.09.06 19:28
может проще массив? Назнать событие одному массиву, потом смотреть Index?

Ответить

Номер ответа: 9
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #9
Добавлено: 19.09.06 12:03
http://basicproduction.nm.ru/LblCstm.zip

Ответить

Номер ответа: 10
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #10 Добавлено: 19.09.06 12:16
Ну это можно обойти, например сделать массив модуял классса, а там в каждом соответственно withevents

Это и есть класс-обертка, т.е. враппер.
может проще массив? Назнать событие одному массиву, потом смотреть Index

Каким образом ты динамически назначишь событие массиву?
ЗЫ Пример не совсем удачный уже потому что там используется таймер. Несколько проще передавать во враппер ссылку на парент-форму и вызывать метод формы явно с индексом элемента. Гораздо удобнее, но нужно следить чтобы ссылки эти потом корректно убирались при закрытии формы.
Либо IConnectionPoint :)

Ответить

Номер ответа: 11
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #11
Добавлено: 20.09.06 17:09
Это и есть класс-обертка, т.е. враппер.
А, ну я код понимаю, а как он называется... :) откуда знать, студент ещё, учусь.
http://basicproduction.nm.ru/LblCstm.zip
Да ты знаешь, у менян на компе есть этот пример. Я ж - на него посмотрел и тоже захотел...
Но код, несмотря обильное наличие комментариев, я не понял: как ты добился события с помощью таймера?

Этот код хотелось бы разобрать: там в модуле класса такой код:
Private WithEvents DemoLabel As Label
Property Let MkEqu(DemoLabel2 As Object)
Set DemoLabel = DemoLabel2
End Property
Sub DemoLabel_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Form1.GetIndex DemoLabel.Name
End Sub
Комментарии я не прописал, т. к. кодировка всё переводит в греческий... Их отдельно: там написано, что
так как мы объявили переменную с событиями... то соответственно все события посланного объекта унаследовались нашей переменной (св-во mkEqu)
Но разве у "посланного" объекта есть события?
LabelEvent(CreateLabels).MkEqu = MyLabel(CreateLabels)
Посланный объект у нас - это LabelEvent(CreateLabels), правильно?
У него по идее есть имя (name)
"Label" & LTrim(Str(CreateLabels + 1))
которое мы задаем при его создании.
Почему тоогда (если
у "посланного" объекта есть события
и
У него по идее есть имя (name)
) мы не можем написать в коде: labelname_событие()...

Вообще запутано всё как-то... ты бы подробную статью написал о том, как враппер делать. Поместил бы у себя на сайте - сразу посетителей прибавится, т.к нет таких статей в интернете.

Ну или по-крайней мере, объясни мне, недоумку, как это работает?

Ответить

Номер ответа: 12
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #12 Добавлено: 20.09.06 17:28
я не понял: как ты добился события с помощью таймера?

Никак. Просто по таймеру идет проверка положения курсора и гасятся лейблы. События MouseMove обрабатываюся во враппере и выдается на форму через метод GetIndex. Т.е. это вариант ссылки из враппера на Parent форму.
Как другой вариант - STATIC вместо Label и сабкласс.

Ответить

Номер ответа: 13
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #13
Добавлено: 20.09.06 18:43
А блин, и вправду без таймера всё работает...

Ну ладно, вот у меня вроде бы всё по аналогии, но не работает почему-то:(класс Vrapper)
Option Explicit

Private WithEvents DemoTxtBox As TextBox

Property Let MkEqu(DemoTxtBox2 As Object)

    Set DemoTxtBox = DemoTxtBox2
    
End Property

Sub DemoTxtBox_Change()

    frmSetmLine.Caption = 0
    
End Sub
и form1
Option Explicit
Private textWidt() As VB.TextBox
Dim numLab As Byte
Dim myTxtBox() As New Vrapper

Private Sub Form_Load()
    Me.Show
    Text1.SetFocus
    Text1.SelLength = 1
End Sub

Private Sub Text1_Change()
    
    Dim topLab As Integer
    topLab = Label1.Top + 600

    ReDim textWidt(Val(Text1))
    ReDim myTxtBox(Val(Text1))

    While numLab < Val(Text1)

        Set textWidt(numLab) = Me.Controls.Add("VB.textbox", "lineWidth" & numLab, Me)

        With textWidt(numLab)
            .Visible = True
            .Left = Text1.Left
            .Width = 350
            .Top = topLab
            .FontSize = 14
            .Text = 1
        End With

        numLab = numLab + 1
        topLab = topLab + 600
        myTxtBox(numLab).MkEqu = textWidt(numLab)
    Wend
    
    textWidt(0).SetFocus
    textWidt(0).SelLength = 1
        
End Sub
Сразу предупреждаю, на форме лежат label1 и text1. По умолчанию Text1.Text = 1

Ч т о я н е с д е л а л ?

Ответить

Номер ответа: 14
Автор ответа:
 -АлександР-



Вопросов: 55
Ответов: 1008
 Web-сайт: sham.clan.su
 Профиль | | #14
Добавлено: 20.09.06 19:07
LOL
Как другой вариант - STATIC вместо Label и сабкласс.
Нашёл на vbrussians статью про сабкласстнг. Там говорится, что SubClass - это контрол, я на правильном пути? Ты не употребил ни разу этоого термина при описании сабклассинга здесь

Ответить

Номер ответа: 15
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #15 Добавлено: 20.09.06 20:39
Я имел ввиду первый контрол создать всетаки, в IDE, назначить ему индекс, создать обработку события, в ней проверять индекс...

Зачем контрол создавать программно новый?

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам