Gå til innhold
🎄🎅❄️God Jul og Godt Nyttår fra alle oss i Diskusjon.no ×

Public Sub i UserControl, hvordan kaller jeg den?


Anbefalte innlegg

Heisann

 

Jeg holder nå på å lage en stor OCX-fil og har et par events som jeg skal kalle med RaiseEvent. Ser dere sikkert vet må man bruke koden i UserControlen.

 

Jeg må reise en events fra en modul og løsningen blir vel en Public sub i UserControlen:

Public Sub RaisedDrawed(hDC As Long)
   RaiseEvent Drawed(hDC)
End Sub

Men hvordan kaller jeg den? Å skrive RaisedDrawed i en modul fungerer ikke. UserControl.RaisedDrawed fungerer heller ikke, og Engine.RaisedDrawed fungerer heller ikke! ("Engine" er navnet på usercontrolen)

 

Hvordan kaller man subs i usercontrols?

 

Jonas

Lenke til kommentar
Videoannonse
Annonse

Richard87, det du foreslår er rett og slett komplett umulig. Man kan simpelthen ikke kalle RaiseEvent på hendelser utenfor class-modulen Event er deklarert - og attpåtil er denne kommandoen også ulovlig i annet enn COM-objekter (Form, Class, UserControl).

 

Man må derimot lage en funksjon innenfor UserControl'en med den korrekte RaiseEvent-kommandoen for å kjøre hendelsen. Dette kan naturligivis virke plagsomt og irriterende, idet man øyensynlig gir utenforstående også mulighet til å kjøre visse hendelser, men dette kan unngås.

 

Dersom du deklarerer funksjoner og subber som Friend kan de kun nås innenfor prosjektet - aldri utenfor. Eksempelvis vil ikke følgende funksjon være synlig for annet enn moduler innenfor ditt prosjekt:

 

Friend Function InvokeEvent() As String

   ' Code her

End Function

Lenke til kommentar

Friend-funksjonen må selvsagt legges inn i UserControlen.

 

Som du allerede har sett, kan man dessverre ikke kalle en Usercontrol direkte i så måte. For å forklare årsaken, må du ta stilling til det faktum at en brukerkontroll kan befinne seg på flere former samtidig spredd ut i mange forskjellige applikasjoner - hvordan skulle da en enkel modul vite hva som skulle til hva?

 

Løsningen er vel å deklarere en Collection i modulen og legge til og fjerne Me i Initialize og Terminate, såsom dette:

 

Private Sub UserControl_Initialize()

   usrControls.Add Me

End Sub

Private Sub UserControl_Terminate()

   Dim Tell As Long
   
   For Tell = 1 To usrControls.Count
       
       ' Fjern denne brukerkontrollens forekomst i klassen
       If usrControls(Tell) Is Me Then
       
           ' Fjern elementet
           usrControls.Remove Tell
           
           ' Vi har intet mer å gjøre
           Exit Sub
   
       End If
   
   Next


End Sub

 

Nå må du likevel finne ut hvilket objekt som tilhører hva, men dette kan gjøres ved å bl. a. jamføre atributter og liknende.

 

Dersom dette blir en altfor ensidig og unøyaktig løsning, kan du jo alltids se på hvordan denne karen har løst problemet:

 

http://www.mvps.org/vbvision/Super_Collections.htm

Endret av aadnk
Lenke til kommentar

Her en er ActiveX-kontroll som jeg lagde for en tid siden. Den bruker events bl.a. når brukeren flytter på items i kalenderen.

 

Det er mye kode, men du kan jo se om du får noe nyttig ut av det. Bl.a. har jeg laget en custom propertpage som lagrer flere instanser av en ColumnHeader klasse i propertypage. Det var faktisk litt arbeid å få til å lagre et objekt i peropertypage slik at objektets egenskaper ble tatt vare på.

 

Screenshot:

ActivityCalendar.jpg

Activity_Calendar.zip

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å
×
×
  • Opprett ny...