kaffenils Skrevet 28. oktober 2004 Del Skrevet 28. oktober 2004 (endret) 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. Endret 28. oktober 2004 av kaffenils Lenke til kommentar
aadnk Skrevet 28. oktober 2004 Del Skrevet 28. oktober 2004 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
kaffenils Skrevet 28. oktober 2004 Forfatter Del Skrevet 28. oktober 2004 (endret) Takk for svaret aadnk. Du har jo ideer om alt 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 28. oktober 2004 av kaffenils Lenke til kommentar
kaffenils Skrevet 28. oktober 2004 Forfatter Del Skrevet 28. oktober 2004 Det fungerte glimrende. Tusen takk!! Skal legge inn kommentarer i koden med en stor takk til deg. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå