Ereditarietà e controlli base [:(]

sabato 18 luglio 2009 - 12.58

SgxForum Profilo | Newbie

Ciao a tutti,
vorrei creare una libreria di controlli personalizzati da ereditare nel mio applicativo.

le funzionalità che vorrei ottenere sono le seguenti:
Creo una classe bottone chiamata SGX_Button nel cui click ho inserito un MSGBOX("Click della classe BASE")
Inserisco in una nuova form un Bottone ereditato dalla classe SGX_Button

Cliccando sul bottone della form mi compare la msgbox con il testo ("Click della classe BASE")

a questo punto vorrei sovrascrivere (overrides) il metodo click facendo comparire la msgbox("Click del bottone Ereditato") ma non ci riesco

Sono riuscito ad ottenere solo entrambi i due codici ovvero [b]("Click della classe BASE")[/b] seguito da ("Click del bottone Ereditato") ma non il solo codice ereditato

Allego per precisione il codice che ho scritto si tratta di poche riche banali...

Codice inserito nella libreria di classe:

Public Class SgxButton
Inherits System.Windows.Forms.Button
Public Overridable Sub SgxButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Click
MsgBox("Click della classe base")
End Sub
End Class


Codice inserito nella form:
Private Sub SgxButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SgxButton1.Click
' la sequente riga invece mi da errore
' Private overrides Sub SgxButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SgxButton1.Click
MsgBox("Click sulla classe derivata")
End Sub
[/code]
qualcuno può aiutarmi su dove sbaglio ???
Grazie

Jeremy Profilo | Guru

Ciao Gianni.
Devi dichiarare Overrides la sub che scrivi nella classe derivata dichiarandone una visibilità Protected, quindi:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
per il significato di visibilità Protected, ti lascio alla documentazione di MSDN.

Facci sapere...
Ciao

SgxForum Profilo | Newbie

Ciao Jeremy,
grazie per la tua risposta ma purtroppo non funziona (sob!)

avevo gia provato ad inserire la clausola [b]overrides[/b] ma purtropppo non funziona e ricevo dal compilatore il messaggio:
[i]sub 'sgxbutton_click' canot be declared overrides because it does not it override a sub in a base class[/i]

Sto impazzendo ma non riesco proprio ad ottenere quello che voglio.

aiedail92 Profilo | Expert

Ciao

Il problema è che come stai facendo ora, a quanto ho capito, non derivi affatto la classe base, ma semplicemente aggiungi un gestore per l'evento Click.

Quello che devi fare invece è creare una nuova classe che erediti dalla classe base, e in questa classe eseguire l'override del metodo. Ancora meglio se fin dalla classe base eviti di gestire l'evento Click, ed esegui l'override del metodo OnClick, e in generale per tutti gli "On<Event>":

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Luca

SgxForum Profilo | Newbie

Ciao Luca,
grazie per l'attenzione ... non ci speravo più

Però purtroppo non ottengo quello che voglio e cerco di spiegarti perchè.

Anzitutto il fatto che sto sovrascrivendo / estendendo l'evento onclick è ovviamente solo un esempio ci sono tanti altri metodi e/o eventi che tratterò in seguito nella stessa maniera.

Ho capito che per derivare un oggetto devo inserire inherits ....
ma il mio problema consiste nel fatto che nell'ambiente in cui sono abituato a lavorare io, quando trascino un controllo in una form, questo è già un controllo derivato e nella form posso estendere / sovrascrivere metodi e/o proprietà dell'oggetto template (per quanto mi riguarda potrebbe essere già l'oggetto SGX_Button) ma non ci sono problemi se debba essere SGX_button_derived

Siccome sto cercando di iniziare a trasferire il mio applicativo scritto in VFP nell'ambiente .NET visto che M$ ci ha dato il benservito, vorrei creare una libreria di controlli Sgx_Textbox, Sgx_button ecc. che siano formattati opportunamente ed abbiano eventi che reagiscano con il mio applicativo, ma vorrei avere la possibilità di cambiare eventualmente il comportamento standard solo in alcuni casi ove sia necessario.

Per esempio se creo un bottone SGX_button derivato da button, nel metodo OnClick scriverò ad esempio
MSGBOX("Hai eseguito il click")

questo codice verrà eseguito sempre ovunque io usi il bottone SGX_Button,

ma potrebbe esserci il caso in cui in una particolare form possa essere necessario che il click qualcosa del tipo

if MSGBOX("guarda che hai eseguito il clik sei sicuro?",32+4) = 6 then
sgx_button.onclick(e)
else
... esegui altro codice senza eseguire il codice della classe template.

Questo in VFP potevo farlo direttamente nella form dove utilizzavo l'oggetto derivato (io usavo il termine subclassato), senza dover ovviamente toccare la libreria di classe che una volta messa a punto sta li e devve funzionare nei secoli dei secoli.....

Qualcuno mi ha parlato dei delegates sto cercando di capire qualcosa in più di questo ambiente che è vastissimo!!!

Ho visto che conosci la materia molto bene se potessi aiutarmi ad imboccare la giusta strada te ne sarei grato

a presto ...(spero)

Gianni


SgxForum Profilo | Newbie

sono riuscito a fare qualcosa di simile a quello che voglio procedendo in questa maniera.
nel progetto libreria di classe ho inserito solo il seguente codice:
Public Class SgxButton
Inherits System.Windows.Forms.Button

Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
MsgBox("Sono nel Click nella classe Templatebase")
MyBase.OnClick(e) ' genero l'evento Click della classe base.
End Sub

End Class


nel progetto WINFORM ho scritto:

Imports Sgx_BaseClass
Public Class Form1
' .... codice della form
End Class
Public Class SgxButton_Der
Inherits SgxButton
Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
MsgBox("OnClick nella classe derivata !!!")

' Se voglio eseguire il codice della classe Template
' decommento la riga seguente
' MyBase.OnClick(e)
End Sub
End Class

Non so se questa è la maniera giusta di fare le cose ma almeno così ho il comportamento voluto

aiedail92 Profilo | Expert

Ciao Gianni

Era proprio il sistema che ti avevo consigliato di usare!

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5