Vorrei creare una libreria di controlli base che abbiano sia metodi che
propriet� personalizzate, che poi vorrei utilizzare nel mio applicativo.
Lo scenario che mi interessa generare � il seguente:
a) Creare una libreria che contenga ad esempio un bottone Base, una
TextBoxBase ecc
b) Utilizzare questi oggetti nelle form del mio applicativo
c) Per quanto riguarda i metodi vorrei avere la possibilit� di:
c1) eseguire solo il codice della classe parent (ereditariet�
semplice)
c2) eseguire solo codice personalizzato nel metodo dell'oggetto
derivato (sovrascrittura del metodo base)
c3) eseguire il metodo parent + altro codice inserito nello stesso
metodo dell'oggetto derivato
per fare questo ho eseguito le seguenti operazioni da VS 2008
Ho creato un nuovo progetto di tipo Libreria di classi
In questo progetto ho creato una classe bottone chiamata SGX_Button che �
ereditata da System.windows.forms.button
per poter testare il comportamento da me desiderato ho inserito un
MSGBOX("Click della classe BASE") nell evento click
A questo punto ho creato un nuovo progetto di tipo windows forms e dopo aver
aggiunto i riferimenti alla DLL della libreria di classe, ho aggiunto sulla
form il controllo ereditato da SGX_button
Eseguo la form e giustamente cliccando sul bottone mi compare la messagebox
con la scritta "Click della classe Base" ( Punto C1 ok!!!)
a questo punto i nascono i miei problemi:
Vorrei sovrascrivere il metodo click del bottone che ho inserito sulla form
ma ma in nessun caso riesco ad eseguire il SOLO codice personalizzato.
Vorrei ad esempio inserire nel click il codice MSGBOX("Click del controllo
EREDITATO")
Potreste aiutarmi a capire dove sto sbagliando ed eventualmente dove poter
capire le differenze tra controlli utente, controlli ereditati ecc.
Grazie
Gianni Sassanelli
P.S.
Allego alcune parti del codice che ho scritto
Codice scritto 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
Anzich� intercettare l'evento Click fai l'override del metodo OnClick.
Questo ti consente di decidere se chiamare o no anche il metodo
della classe base:
----------------------------------------
Public Class ButtonEx : Inherits Button
Protected Overrides Sub OnClick(ByVal e As EventArgs)
MyBase.OnClick(e) '''Omit this if you don't want a call to the base
'''class method
End Sub
End Class
----------------------------------------
> Grazie
Prego! ;-)
--
Matteo Migliore
http://blogs.ugidotnet.org/matteomigliore
Infatti nella mia classe base vorrei inserire del codice che una volta
messo a punto non dovrei più toccare.
Mentre nelle classi derivate vorrei avere la possibilità di eseguire
il codice della classe base con l'aggiunta di ulteriore codice oltre a
casi estremi in cui vorrei sovrascrivere completamente il codice della
classe base.
Il problema però è che vorrei implementare il tutto solo nella classe
derivata.
Mi spiego con un esempio:
Creo un bottone Template chiamato ButtonEx derivato da Button
Inserisco in questo ButtonEx alcune proprietà ed alcuni metodi che
siano visibili e modificabili dai controlli che userò nel applicativo
e per questo li ho dichiarati come public
a questo punto in una form inserisco un oggetto derivato da
ButtonEx e qui ovvero nella form e non nella classe template vorrei
avere le tre possibilità ovvero:
1) eseguire il codice della classe ButtonEx (comportamento
standard)
2) eseguire codice del tutto diverso a quello della classe
Buttonex (questo omportamento credo di chiami override)
3) eseguire il codice della classe ButtonEx più altro codice
inserito nel metodo della form.
You wrote on 20/07/2009 :
> Creo un bottone Template chiamato ButtonEx derivato da Button
> Inserisco in questo ButtonEx alcune proprietᅵ ed alcuni metodi che
> siano visibili e modificabili dai controlli che userᅵ nel applicativo
> e per questo li ho dichiarati come public
> a questo punto in una form inserisco un oggetto derivato da
> ButtonEx e qui ovvero nella form e non nella classe template vorrei
> avere le tre possibilitᅵ ovvero:
ᅵ qui l'errore concettuale, tu vuoi fare "override" del comportamento
non in una classe derivata ma in un contenitore che ᅵ l'utilizzatore
della tua classe. Non ha molto senso. l'ereditarietᅵ nasce proprio per
fare quello che chiedi ma giustamente devi creare una classe derivata.
Button: funzionalitᅵ di base
ButtonEx: aggiunta di funzionalitᅵ
MyCustomButtonEx: modifica del comportamento di ButtonEx
Form1: utilizzo di MyCustomButtonEx
.m
--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCP
http://mvp.support.microsoft.com
http://blogs.ugidotnet.org/topics
whynot [ at ] topics [ dot ] it
Il problema è che non so come utilizzare MyCustomButtonEx nella mia
form
Potresti aiutarmi con un esempio per cortesia??
Grazie.
You wrote on 20/07/2009 :
> Ciao Mauro grazie per la tua attenzione.
> In effetti quello che vorrei ottenere ᅵ proprio quello che tu hai
> descritto.
>
> Il problema ᅵ che non so come utilizzare MyCustomButtonEx nella mia
> form
>
non capisco il problema, ᅵ un controllo come tutti gli altri e come
tutti gli altri lo usi
quale ᅵ l'ostacolo che stai incontrando?
> Grazie.
ho creato un nuovo progetto di tipo "LIBRERIA DI CLASSE"
ed ho inserito il seguente codice
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
Public Class ButtonGs
Inherits SgxButton
Public Overrides Sub SgxButton_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles Me.Click
MsgBox(Me.Text)
Me.Text = Me.Text + "dd"
End Sub
End Class
quindi ho creato un nuovo progetto di tipo Windows Form
in questo progetto ho aggiunto alla toolbox un riferimento alla dll
creata nella libreria di classe precedente e mi è apparsa una icona
con il bottone ButtonGS
a questo punto ho inserito questo controllo nella form Form1
ho cliccato sull'oggetto aggiunto che VS mi ha chiamato ButtonGs1
a questo eseguendo doppio click sul bottone aggiunto VS mi apre la
finestra del codice scrivendo:
Private Sub ButtonGs1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles ButtonGs1.Click
End Sub
io vorrei sostituire questo codice con:
Public Overrides Sub ButtonGs1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles ButtonGs1.Click ' questa riga
mi da errore in quanto dice che il metodo non può essere dichiarato
overrides
msgbox("voglio solo questo codice")
End Sub
credo che sto girando intorno al problema ma non riesco a venirne
fuori
La cosa strana è che se faccio la stessa cosa con classi testuali con
i classici esempi che trovo nei manuali tutto funziona.
Applicando gli stessi principi ai controlli questo non accade
You wrote on 20/07/2009 :
> La cosa strana ᅵ che se faccio la stessa cosa con classi testuali con
> i classici esempi che trovo nei manuali tutto funziona.
> Applicando gli stessi principi ai controlli questo non accade
guara l'esempio di matteo, ᅵ li che stai sbagliando, non devi *gestire*
l'evento nelle classi derivate ma *sovrascrivere* il comportamento.
ho cambiato il codice della classe in :
Protected Overrides Sub OnClick(ByVal e As EventArgs)
MsgBox("ClasseBase")
MyBase.OnClick(e) ' Omit this if you don't want
a call to the base class method
End Sub
e nella form ho scritto:
Private Sub SgxButton1_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles SgxButton1.Click
MsgBox("Controllo ereditato")
End Sub
eseguendo la form e cliccando sul bottone ottengo due messaggi
il primo: "Classe Base"
il secondo: "Controllo Ereditato"
io vorrei solo il secondo ovvero "Controllo Ereditato" ma non vorrei
toccare il codice inserito nella classe base mentre vorrei solo
eseguire il codice sovrascritto nella form.
Siccome vengo dal VFP nel Fox c'era un comando NODEFAULT che non
faceva scattare il codice della classe base .
cosa dovrei fare per *sovrascrivere* ???
thank's
You wrote on 20/07/2009 :
> e nella form ho scritto:
> Private Sub SgxButton1_Click(ByVal sender As System.Object, ByVal
> e As System.EventArgs) Handles SgxButton1.Click
> MsgBox("Controllo ereditato")
> End Sub
questo ᅵ profondamente sbagliato, nella Form non sei in un controllo
ereditato ma se appunto nella Form... quindi verrᅵ sempre eseguito il
codice del click del tuo bottone, se vuoi sovrascrivere anche il
comportamento del tuo bottone devi utleriormente derivare da quello e
poi usare quello nuovo.
Io credevo che avendo inserito il riferimento al controllo nella
toolbox, quando trascino dalla toolbox alla form l'oggetto fosse già
un oggetto derivato.
Ma a questo punto brancolo nel buio...
come faccio ad inserire un controllo ereditato da sgxbutton ????
può essere che debba rinunciare ???
ho gia distrutto una tastiera ed un mouse lanciandoli contro il muro
sono esaurito
-_____-_____-
^^ ^^
_----_
You wrote on 20/07/2009 :
> Ma a questo punto brancolo nel buio...
> come faccio ad inserire un controllo ereditato da sgxbutton ????
>
esattamente come hai fatto per ereditare sgxbutton da button, fai la
stessa cosa per ereditare CutomButton da sgxbutton, poi piazzi
CustomButton nella toolbox e usi quello
> puᅵ essere che debba rinunciare ???
Non capisco perᅵ tutta questa necessitᅵ di ereditarietᅵ..
Anzitutto volevo dirti che per provare le funzionalità, sto
sovrascrivendo / estendendo l'evento onclick ma ci sono tanti altri
metodi e/o eventi che vorrei trattare in seguito nello stesso modo.
Mi scuso se ti ho fatto ripetere più di una volta alcuni concetti ma
come ho detto inizialmente sto appena iniziando a conoscere questo
ambiente e sto cercando di capirne la terminologia nonchè l'ubicazione
di determinate funzioni. Magari alcuni concetti che potrebbero
sembrare a te banali io in questo momento non so neppure dove si
trovano. Comunque inizio a muovere i primi passi e ti ringrazio per
l'aiuto.
PEr quanto riguarda il mio Thread come dicevo inizio a vedere qualcosa
di quanto mi aspetto.
HO modificato il codice così
Nel progetto LIBRERIA_DI_CLASSE ho scritto 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 LIBRERIA_DI_CLASSE
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
a questo punto il mio bottone inizia a funzionare come voglio, posso
estendere i metodi e le proprieta ecc.
Non so però se questa è una strada corretta per ottenere questo tipo
di comportamento.
Cercherò di approfondire l'argomento.
You wrote on 21/07/2009 :
> Non so perᅵ se questa ᅵ una strada corretta per ottenere questo tipo
> di comportamento.
concettualmente il metodo ᅵ corretto, non capisco perᅵ che cosa vuoi
ottenere in pratica o se lo stai facendo solo a fini di studio, in
generale okkio a fare questi esperimenti con i controlli visuali
Windows Forms perchᅵ moltissimi (quasi tutti probabilmente) non sono
veri controlli .net ma semplicemente dei wrapper dei controlli nativi
Win32 quindi non ᅵ detto che la tecnica che stai studiando sortisca
l'effetto desiderato... ma non sarebbe colpa tua.
>>okkio a fare questi esperimenti con i controlli visuali
In generale nei mio applicativo utilizzo sempre dei controlli derivati
da quelli standard dell'IDE es. SgxTextbox anzichè TextBox
I controlli hanno alcuni metodi e proprietà personalizzate che
reagiscono a seconda dell'utilizzo nell'applicativo.
Un esempio banale potrebbe essere quello dell'aspetto grafico dove
posso definire un array publico che puo essere impostato dall'utente
il quale vuole che i campi siano tutti con lo sfondo Fucsia ed il
testo Blu quindi in questo caso mi basta andare nel costruttore della
classe ed impostare
...
me.forecolor = myappplication.textboxforecolor
me.backcolor = myappplication.textboxbackcolor
...
Stesso discorso vale sui metodi dove ad esempio sul dblclick di un
SGXTextbox posso verificare alcune property personalizzate ad esempio
SEEKFrm e quindi lanciare una form che faccia il browse di una tabella
di dati ecc.
Quindi il mio SgxTextbox prevede in maniera oggettiva tutti i suoi
funzionamenti che verranno poi specializzati di volta in volta nelle
form semplicemente andando ad impostare le opportune properties
Ovviamente con controlli semplici quali bottoni, textbox, radiobutton,
commanbutton ecc le cose sono abbastanza semplici, quando si deve
ereditare una gridview o qualche controllo più complesso le cose
iniziano a complicarsi.
Ho tanto da fare ...
Ti ringrazio ancora per l'aiuto
Gianni Sassanelli
You wrote on 21/07/2009 :
> Ovviamente con controlli semplici quali bottoni, textbox, radiobutton,
> commanbutton ecc le cose sono abbastanza semplici, quando si deve
> ereditare una gridview o qualche controllo piᅵ complesso le cose
> iniziano a complicarsi.
>
> Ho tanto da fare ...
giusto un consiglio spassionato, io se fossi in te essendo algi inizi
farei cosᅵ:
- da un lato studierei il framework e il linguaggio (quello che
preferisci);
- dall'altro mollerei subito Windows Forms e mi buttrei a pesce su
Wpf... che ha un approccio che ti evita a monte quel giro che fai,
obbligatorio con Windows Forms, ma decisamente poco pratico.