Oppure

Loading
22/01/10 17:02
growning
Ciao, ho creato una classe che deriva un Label che chiamerò mylabel.

In mylabel all'evento "DoubleClick" eseguo del codice.

Come potrei fare a chiamare una sub stante nella classe che istanzia mylabel?

per ora faccio con una select case enorme che vorrei togliere:


Protected Overrides Sub OnDoubleClick(ByVal e As System.EventArgs)
'istruzioni
                  Select Case MyBase.Parent.Name
                    Case form1.Name
                        form1.SUBdachiamare
                End Select
                       MyBase.OnDoubleClick(e)
        End Sub


Ho provato con i delegate ma non sono riuscito
aaa
23/01/10 9:48
Il Totem
L'idea è questa: dichiara una nuova interfaccia che imponga l'implementazione di quella sub, ad esempio:
Interface IMyInterface
   Sub NomeSub()
End Interface

Quindi implementala in ogni form che la label dovrà richiamare:
Class Form1
  Implements IMyInterface

  Sub SUBForm() Implements IMyInterface.NomeSub
    '...
  End Sub
End Class

Ora dichiara, nella classe myLabel, un dizionario che associa al nome di un form la sua istanza. Il dizionario deve essere tipizzato in modo da contenere elementi di tipo IMyInterface:
Class myLabel
  Inherits Label

  Private Forms As New Dictionary(Of String, IMyInterface)
  Private form1 As Form1
  '...

  Sub New()
    MyBase.New()
    Forms.Add("form1", form1)
    '...
  End Sub

  Sub OnDoubleClick()
    '...
    Forms(MyBase.Parent.Name).NomeSub()
  End Sub
End Class
aaa
23/01/10 17:17
growning
Postato originariamente da Il Totem:

L'idea è questa: dichiara una nuova interfaccia che imponga l'implementazione di quella sub, ad esempio:
Interface IMyInterface
   Sub NomeSub()
End Interface

Quindi implementala in ogni form che la label dovrà richiamare:
Class Form1
  Implements IMyInterface

  Sub SUBForm() Implements IMyInterface.NomeSub
    '...
  End Sub
End Class

Ora dichiara, nella classe myLabel, un dizionario che associa al nome di un form la sua istanza. Il dizionario deve essere tipizzato in modo da contenere elementi di tipo IMyInterface:
Class myLabel
  Inherits Label

  Private Forms As New Dictionary(Of String, IMyInterface)
  Private form1 As Form1
  '...

  Sub New()
    MyBase.New()
    Forms.Add("form1", form1)
    '...
  End Sub

  Sub OnDoubleClick()
    '...
    Forms(MyBase.Parent.Name).NomeSub()
  End Sub
End Class



Ciao, ho provato il tuo codice, ma all'apertura del form ricevo questo errore:

Errore durante la creazione del form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Errore durante la creazione del form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Il form ha fatto riferimento a se stesso durante la costruzione da un'istanza predefinita e si è verificata una ricorsione infinita. All'interno del costruttore del form fare riferimento al form utilizzando 'Me.'


Ho provato a sostituire (anche se non c'entra molto)
 Forms.Add("form1", form1)


con
 Forms.Add(mybase.parent.name, mybase.parent)


e ricevo quest'errore:

Errore durante la creazione del form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Riferimento a un oggetto non impostato su un'istanza di oggetto.

Ultima modifica effettuata da growning 23/01/10 20:14
aaa
25/01/10 11:14
Il Totem
Ovviamente non puoi aggiungere form1 alla collezione Forms da form1, poiché per creare un'istanza di form1 viene richiamata la sub New, la quale aggiunge la nuova label, la quale crea a sua volta un'altra istanza di form1, la quale crea una nuova label, e così via all'infinito.

form1 era solo un esempio. Dovrai aggiungere alla collezione Forms i form esistenti, magari tramite My.Forms.

Per quanto riguarda il secondo errore, durante la creazione della label, la proprietà Parent non è ancora impostata, perciò è nulla.
aaa
25/01/10 11:22
growning
Postato originariamente da Il Totem:

Ovviamente non puoi aggiungere form1 alla collezione Forms da form1, poiché per creare un'istanza di form1 viene richiamata la sub New, la quale aggiunge la nuova label, la quale crea a sua volta un'altra istanza di form1, la quale crea una nuova label, e così via all'infinito.

form1 era solo un esempio. Dovrai aggiungere alla collezione Forms i form esistenti, magari tramite My.Forms.

Per quanto riguarda il secondo errore, durante la creazione della label, la proprietà Parent non è ancora impostata, perciò è nulla.


Ok.

ps: prima di questo post non utilizzavo Sub New...è un errore?

Ho provato a spostare tutto il codice che stava sotto l'e OnCreateControl nel Sub New e funziona.
aaa