Gå til innhold

LØST! Usercontrol, Class collection og Class


Anbefalte innlegg

Fikk ikke plass til hele tittelen. Den skulle egentlig være 'Usercontrol, Class collection og Class. Hvordan trigge event i Usercontrol fra Class item'

 

Jeg holder på med en activex-kontroll som er en kombinasjon av treeview og en kalender.

 

Prosjektet består av en usercontrol (ActivityCalendar), en klasse (ActivityCalendarItem) og en klasse (ActivityCalendarItems) som navnet tilsier er en samling av ActivityCalendarItem.

 

I usercontollen har jeg deklarert en privat variabel av type ActivityCalendarItems og bruker WithEvents slik at jeg kan trigge eventer fra ActivityCalendarItems tilbake til usercontrollen, og på denne måten tegne opp treeview og kalender på nytt ved Add og Remove i klassen ActivityCalendarItems. Det virker helt fint.

 

Kode i usercontrollen

Private WithEvents tmp_items As ActivityCalendarItems

Private Sub tmp_items_Add(NewItem As ActivityCalendarItem)
DrawControl
End Sub

Private Sub tmp_items_Remove()
DrawControl
End Sub

 

Og i ActivityCalendarItems har jeg følgende kode

Public Event Add(NewItem As ActivityCalendarItem)
Public Event Remove()

Public Function Add(sKey As String, Optional Relation As acRelation = acNext, Optional ParentKey As String = "") As ActivityCalendarItem
... masse kode for å legge til ny item...

RaiseEvent Add(objNewMember)
End Function

Public Sub Remove(vntIndexKey As Variant)
... masse kode for å fjerne item...

RaiseEvent Remove
End Sub

 

Problemet mitt er derimot hvordan jeg skal få usercontrollen til å detektere endringer i en ActivityCalendarItem. Jeg kan selvfølgelig lage en public Refresh funskjon i usercontrollen som jeg må huske å kalle fra prosjekter der jeg bruker activex-kontrollen, men jeg kunne tenke meg noe mer dynamisk, altså ved bruk av eventer på samme måte som jeg gjør det med Add og Remove. Men siden verken usercontrollen eller klassen ActivityCalendarItems ikke har noen variabel referanse til klassen ActivityCalendarItem, så klarer jeg ikke å bruke eventer.

 

Er det noen som har peiling på hvordan jeg kan få dette til? En credit i koden til den som løser det. :yes:

Endret av kaffenils
Lenke til kommentar
Videoannonse
Annonse

Uten å se hele koden kan jeg ikke vite hvordan ActivityCalendarItems lagrer de relevante opplysningene om underobjektene, slik at for alt jeg vet ER det mulig å bruke WithEvents på arrayen. Selvsagt er sikkert mulig å gjøre dette ved enhvert tilfelle hvor informasjonen ligger til grunn, men jeg tror dog en mellomløsning vil være lettere og mer oversiktlig.

 

Hvis du isdedenfor la til en Parent object-egenskap i ActivityCalendarItem og kaller den for å gi en referanse til ActivityCalendarItems (eller kontrollen), skulle det hele ikke by til så altfor store problemer. Alt du så trenger å gjøre, er å legge til en lignende funksjon i ActivityCalendarItems, og så kalle den når ønskede hendelse inntreffer:

 

Public Sub EventHandler(sEventName As String, ParamArray aParamenters())

Select Case sEventName
Case "Click"
' Mer kode her ...

End Select

' aParamenters er en array som kan fylles med informasjon om hendelsen. 

 

Eventuelt kan du sette EventHandler til Friend hvis du ikke ønsker at utenomstående skal kunne sende hendelser til ActivityCalendarItems.

Lenke til kommentar

Takk for svaret aadnk. Du har jo ideer om alt :thumbup:

Det er jo faktisk ingen dum ide å ha en friend parent property i ActivityCalendarItem som jeg setter ved Add i ActivityCalendarItems. Eneste jeg er litt bekymret for er at det vil bruke mye minne hvis jeg har hundrevis (kanskje tusenvis) av ActivityCalendarItem objekter som alle har en ActivityCalendarItems variabel. Eller er det mulig å ha en variabel som er en peker til parent objektet?

 

Her er forresten kildekoden hvis du vil se om det kan gjøres på andre måter.

 

EDIT: Start project1.vbp for å teste.

EDIT2: Trykk på knappen Command1 får å fylle activex kontrollen med testdata.

sourcecode.zip

Endret av kaffenils
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...