WithEvents

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Niko
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 102
Зарегистрирован: 16.03.2006 (Чт) 14:43

WithEvents

Сообщение Niko » 04.09.2009 (Пт) 13:32

есть класс class1
одно из свойств этого класса является классом classAC
в классе classAC есть объект DocAC объявленный с WithEvents
class1 имеет событие SelectAC
оно генерируется в процедуре subRaiseEvenSelectAC которая вызывается из класса classAC в тот момент когда срабатывает событие DocAC_SelectionChanget
Программа:
Код: Выделить всё
Option Explicit
Dim WithEvents myClass As Class1

Private Sub Form_Load()
Set myClass = New Class1
myClass.clAC.ConnectAC
End Sub

Private Sub myClass_SelectAC(ByVal mValue As Variant)
Me.Caption = UBound(mValue)
End Sub

Class1:
Код: Выделить всё
Option Explicit
Public Event SelectAC(ByVal mValue As Variant)

Public Property Get clAC() As ClassAC
Set clAC = New ClassAC
Set clAC.cClass = Me
End Property

Friend Sub subRaiseEventSelectAC(ByVal mValue As Variant)
RaiseEvent SelectAC(mValue)
End Sub

ClassAC:
Код: Выделить всё
Option Explicit
Public cClass As Class1
Private WithEvents AppCad As AutoCAD.AcadApplication
Private WithEvents DocAC As AutoCAD.AcadDocument

Private Sub DocAC_SelectionChanged()
Dim mV() As Double
Dim i As Integer

ReDim mV(DocAC.PickfirstSelectionSet.Count)
For i = 1 To DocAC.PickfirstSelectionSet.Count
    mV(i) = DocAC.PickfirstSelectionSet.Item(i - 1).ObjectID
Next i
Call cClass.subRaiseEventSelectAC(mV)
End Sub

Public Sub ConnectAC()
Set AppCad = GetObject(, "AutoCAD.Application")
Set DocAC = AppCad.ActiveDocument
End Sub

по задумке программа должна получать событие в тот момент когда в автокаде изменилось выделение. почему это не работает примерно понятно, каждый раз когда обращаюсь к свойству Class1.clAC создается новый экземпляр класса класса classAC видимо по этому и не работает.
чтобы работало, нужно в программе сделать так:
Код: Выделить всё
Option Explicit
Dim WithEvents myClassAC As ClassAC

Private Sub Form_Load()
Set myClassAC = New ClassAC
myClassAC.ConnectAC
End Sub

Private Sub myClassAC_SelectAC(ByVal mValue As Variant)
Me.Caption = UBound(mValue)
End Sub

в классе объявить событие SelectAC и генерировать его как только получим событие от автокада.
Код: Выделить всё
Option Explicit
Private WithEvents AppCad As AutoCAD.AcadApplication
Private WithEvents DocAC As AutoCAD.AcadDocument
Public Event SelectAC(ByVal mValue As Variant)

Private Sub DocAC_SelectionChanged()
Dim mV() As Double
Dim i As Integer

ReDim mV(DocAC.PickfirstSelectionSet.Count)
For i = 1 To DocAC.PickfirstSelectionSet.Count
    mV(i) = DocAC.PickfirstSelectionSet.Item(i - 1).ObjectID
Next i
RaiseEvent SelectAC(mV)
End Sub

Public Sub ConnectAC()
Set AppCad = GetObject(, "AutoCAD.Application")
Set DocAC = AppCad.ActiveDocument
End Sub

так все работает, но мне так не нравится :)
хочу в программе объявлять только один объект Class1 и чтобы все работало )
можно ли сделать это как-то первым способом?

Niko
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 102
Зарегистрирован: 16.03.2006 (Чт) 14:43

Re: WithEvents

Сообщение Niko » 04.09.2009 (Пт) 14:00

сорри решение нашел :)
как кто-то сказал "Лучший способ что-то понять - объяснить это кому-то другому"
чтобы работало как я хочу нужно перенести в основной класс объявление AppCad и DocAC ну и событие естественно ловить там и генерировать для программы.
---
топик можно удалять :oops:


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 50

    TopList