PDA

View Full Version : [Visual Basic 2010] - Inizio adesso


lucausa75
20-08-2010, 14:05
Salve ragazzi,

ho programmato per molti anni in VB6 e da poco mi sto avvicinando a VB2010.
Prima di tutto volevo chiedervi se esiste la possibilità di scaricare degli esercizi a difficolta progressiva in modo da farmi pratico sull'utilizzo dei controlli, proprietà e metodi vari.

Volevo anche chiedere cosa significa questa check box che mi si presenta durante la fase di salvataggio di un progetto in VB2010:

http://img686.imageshack.us/img686/2693/59028668.th.png (http://img686.imageshack.us/i/59028668.png/)

e poi perchè l'icona è cambiata: vedi passaggio da 1 a 2

http://img267.imageshack.us/img267/240/55398730.th.png (http://img267.imageshack.us/i/55398730.png/)


Grazie 1000!

Kralizek
20-08-2010, 17:39
allora, come in vb6 esistono i progetti. in aggiunta esistono le soluzioni che sono progetti collegati tra di loro.

quella checkbox ti permette di salvare tutto il codice da te prodotto in una cartella unica per la soluzione :)

per la seconda immagine: l'ambiente cambia automaticamente l'icona associata al file se capisce che la classe contenente deriva in qualche modo da Form.

lucausa75
20-08-2010, 17:45
quella checkbox ti permette di salvare tutto il codice da te prodotto in una cartella unica per la soluzione :)
E' necessaria selezionarla?
Se all'inizio l'avevo selezionata c'è modo adesso di eliminare tutto ciò che questa selezione mi aveva creato?

Questa la sequenza delle cartelle createmi:

http://img841.imageshack.us/img841/7203/20082010201529.th.png (http://img841.imageshack.us/i/20082010201529.png/)



per la seconda immagine: l'ambiente cambia automaticamente l'icona associata al file se capisce che la classe contenente deriva in qualche modo da Form.
Per questa ho risolto rinominando correttamente la classe col nome del form

...cmq passare da VB6 a VB2010 è davvero molto duro :muro:

MarcoGG
20-08-2010, 22:28
E' necessaria selezionarla?


No, anzi. Quasi sempre, per non dire SEMPRE, ti conviene aver predisposto già una cartella con nome significativo del progetto, perciò se oltre a quello gli confermi che vuoi una directory per la solution, alla fine ti ritrovi la tua cartella con all'interno un altra cartella che contiene i files di progetto. Abbastanza inutile come cosa...


...cmq passare da VB6 a VB2010 è davvero molto duro :muro:


Eh, e pensa a quanta gente ancora considera VB6 e VB.NET come zuppa & pan bagnato. :D
E' la sensazione che provano 99 sviluppatori VB6 su 100, ma poi vedrai che non riuscirai più a tornare a VB6. ;)

lucausa75
21-08-2010, 07:20
No, anzi. Quasi sempre, per non dire SEMPRE, ti conviene aver predisposto già una cartella con nome significativo del progetto, perciò se oltre a quello gli confermi che vuoi una directory per la solution, alla fine ti ritrovi la tua cartella con all'interno un altra cartella che contiene i files di progetto. Abbastanza inutile come cosa...

Quindi non la seleziono più :D

Cmq sto notando adesso che non la seleziono mi crea solo una cartella con tutti i files del progetto (e questo è OK) e un file con estensione .sln (Microsoft Visual Studio Solution) :confused: :

http://img717.imageshack.us/img717/3779/21082010090214.th.png (http://img717.imageshack.us/i/21082010090214.png/)


...E' la sensazione che provano 99 sviluppatori VB6 su 100, ma poi vedrai che non riuscirai più a tornare a VB6. ;)

Questa sensazione la ho già da ora che è da due giorni che ho messo mani a VB2010 :D

MarcoGG
21-08-2010, 08:53
Cmq sto notando adesso che non la seleziono mi crea solo una cartella con tutti i files del progetto (e questo è OK) e un file con estensione .sln (Microsoft Visual Studio Solution) :confused: :


Esatto. La Solution è un concetto nuovo rispetto a VB6.
Possono esistere Soluzioni multi-progetto. Ad esempio potresti decidere di avere un progetto principale "Programma_1", corredato da 2 progetti-satellite, "Libreria_1" e "Libreria_2", che di fatto potrebbero essere 2 dll di cui "Programma_1" fa uso...

Nella realtà però considera che la maggioranza delle Soluzioni sono mono-progetto, e nessuno vieta di creare una soluzione separata per ogni progetto che si desidera sviluppare, che sia .exe, .dll, ecc.

Il file .sln è proprio il punto di partenza, come in VB6 lo è "Progetto1.vbp". In soldoni, quello su cui fare doppio-click per aprire tutto in un colpo solo, Classi, Forms, Moduli... ;)

lucausa75
21-08-2010, 11:57
Esatto. La Solution è un concetto nuovo rispetto a VB6.
Possono esistere Soluzioni multi-progetto. Ad esempio potresti decidere di avere un progetto principale "Programma_1", corredato da 2 progetti-satellite, "Libreria_1" e "Libreria_2", che di fatto potrebbero essere 2 dll di cui "Programma_1" fa uso...

Nella realtà però considera che la maggioranza delle Soluzioni sono mono-progetto, e nessuno vieta di creare una soluzione separata per ogni progetto che si desidera sviluppare, che sia .exe, .dll, ecc.

Il file .sln è proprio il punto di partenza, come in VB6 lo è "Progetto1.vbp". In soldoni, quello su cui fare doppio-click per aprire tutto in un colpo solo, Classi, Forms, Moduli... ;)


Wow MarcoGG ma sei il guru..:D
Ti faccio adesso due domande:

1) Se cancello il file .sln il mio progetto funziona cmq?
2) Il progetto si avvia lanciando il file .vbproj o il file .sln?

Grazie ancora...

MarcoGG
21-08-2010, 12:14
1) Se cancello il file .sln il mio progetto funziona cmq?
2) Il progetto si avvia lanciando il file .vbproj o il file .sln?

Grazie ancora...


1) Domanda curiosa. Perchè mai dovresti farlo ? :stordita:
Assolutamente NO. Non lo fare. Non metterti a pasticciare adesso con i files di progetto. Sei all'inizio e non è proprio il caso.
E non cercare strane "analogie" tra Visual Studio 6 e VS 2010 ! Sono IDE profondamente diversi...

2) Come già detto sopra, lanci tutto a partire dal file soluzione .sln.

Ci sono tante, ma tante di quelle cose che devi ancora scoprire, molto più importanti. Anche se può sembrarti che VB 2010 crei davvero molti files, anche solo per un "Hello World", sicuramente molti più files di un analogo progetto VB6, per ora fai atto di fede, e vai oltre - mio giovane padawan -... :D :D

lucausa75
21-08-2010, 17:25
Salve ragazzi,
ancora una domanda:

se cancello tutto dalla sezione relativa il codice (2) l’icona del forma assume una forma strana (1) e fino a qui nessun problema ma mi chiedo come fare affinchè il codice riappaia?

http://img831.imageshack.us/img831/5690/21082010181941.th.png (http://img831.imageshack.us/i/21082010181941.png/)

Public Class frmMain


End Class

Poi volevo sapere come si fa a fare apparire l'utilissima finesta Immediate :confused:

MarcoGG
21-08-2010, 17:39
Ti stai ponendo problemi strani. Ma posso anche capire, visto che sei "traviato" da VB6. In VB 2010, e in generale in VB.NET post-VB6, devi per forza accettare il fatto che stai usando un linguaggio al 100% OO.

Perchè dovresti cancellare quelle righe, non l'ho capito, ma qui una Form è una Classe, che eredita da System.Windows.Forms.Form.

Tutto il codice che VS genera quando crei un nuovo progetto WinForms, lo devi prendere com'è e non toccarlo.

MarcoGG
21-08-2010, 17:45
Poi volevo sapere come si fa a fare apparire l'utilissima finesta Immediate :confused:

Menu Debug / Finestre / Controllo Immediato.

lucausa75
21-08-2010, 17:51
Ti stai ponendo problemi strani. Ma posso anche capire, visto che sei "traviato" da VB6. In VB 2010, e in generale in VB.NET post-VB6, devi per forza accettare il fatto che stai usando un linguaggio al 100% OO.

Perchè dovresti cancellare quelle righe, non l'ho capito, ma qui una Form è una Classe, che eredita da System.Windows.Forms.Form.

Tutto il codice che VS genera quando crei un nuovo progetto WinForms, lo devi prendere com'è e non toccarlo.

:ave:

lucausa75
21-08-2010, 18:01
Menu Debug / Finestre / Controllo Immediato.

...mi perdo nei meandri di VB2010 ma cmq mi piace e anche tanto! ;)

Come si traduce il vecchio App.path di VB6?

Questa è una cosa su cui ci sto sbattendo da tempo; ad esempio se con VB6 dovevo collegarmi ad un database chiamato Clienti.mdb all'interno di C:\Users\Admin\Desktop\VB\Autorun bastava usare App.path che puntava alla cartella C:\Users\Admin\Desktop\VB\Autorun ed il gioco era fatto; adesso invece vedo che la maggior parte delle istruzioni Application.Qualcosa puntano alla directory bin:

http://img405.imageshack.us/img405/6830/immaginegtk.th.png (http://img405.imageshack.us/i/immaginegtk.png/)

Significa che dovrei mettere il mio database dentro bin? :confused:

GameKeeper
21-08-2010, 18:45
Io solitamente aggiungo al progetto i file a cui devo accedere dall'applicazione in modo che poi vengano automaticamente copiati nella cartella bin\Debug o bin\Release quando compili...
Ad esempio se provi a cliccare con il tasto dx sull'icona del progetto e poi fai aggiungi elemento esistente potrai aggiungere un file. Una volta aggiunto il file al progetto potrai visualizzarne le proprietà e una di queste serve proprio a fare in modo che venga copiato durante la compilazione... Dovresti riuscirci facilmente ;)

lucausa75
21-08-2010, 18:54
Io solitamente aggiungo al progetto i file a cui devo accedere dall'applicazione in modo che poi vengano automaticamente copiati nella cartella bin\Debug o bin\Release quando compili...
Ad esempio se provi a cliccare con il tasto dx sull'icona del progetto e poi fai aggiungi elemento esistente potrai aggiungere un file. Una volta aggiunto il file al progetto potrai visualizzarne le proprietà e una di queste serve proprio a fare in modo che venga copiato durante la compilazione... Dovresti riuscirci facilmente ;)

...di grandissimo aiuto il tuo consiglio.

Quindi se ho capito bene conviene mettere inizialmente i miei file che in questo caso 3 dentro la cartella bin\Debug o bin\Release così quando li aggiungo al progetto basta puntare a una di quelle due directory a seconda di dove li ho messi.

1) Da cosa dipende la scelta di bin\Debug e bin\Release?
2) Nelle proprietà di questi file dove trovo la voce che imposti dove venga copiato durante la compilazione?
3) Come richiamo il percorso di questi file in fase di stesura di codice?
...in poche parole nel caso di bin\Debug o bin\Release la notazione corretta è: Application.XXXXX

Grazie 1000 ancora per il supporto! :D

GameKeeper
21-08-2010, 19:31
No in realtà non devi copiare i file dentro bin\Debug o bin\Release perchè, se impostato a modo, ci pensa il compilatore a farlo! Se clicchi su un file nella finestra del progetto, vedrai che appariranno le sue proprietà nell'apposita finestra (in genere in basso a destra sotto alla vista del progetto). La prima opzione se non sbagli si chiama proprio "Copia nella directory di output" o simile. Se la imposti su copia sempre, ogni volta che compili il file viene copiato nella cartella di output, se invece metti copia se più recente la copia avviene solo se il file in questione è più recente di quello già copiato nella cartella di output (ad esempio se lo modifichi poi verrà ricopiato).
bin\Debug e bin\Release sono le 2 cartelle di output: la prima viene utilizzata durante le operazioni di debug (quindi in genere quando premi il tasto "play" in visual basic) mentre la seconda conterrà i file di output utilizzabili tranquillamente senza necessità di debugger o altre cose simili ed è la cartella di output quando usi l'opzione "Compila soluzione" nel menù Debug.
Spero di essere stato chiaro, altrimenti chiedimi pure spiegazioni! :D

MarcoGG
21-08-2010, 20:42
Come si traduce il vecchio App.path di VB6?


Application.StartupPath, che in fase di debug punta alla bin/Debug.
In ogni caso punterà sempre alla cartella da cui viene lanciato l'exe o per essere più precisi, dal file eseguibile in cui risiede il punto di ingresso dell'Applicazione. Dal momento che Application.StartupPath manca dll'ultimo back-slash, per poterlo usare a scopo pratico dovrai aggiungerlo :

Application.StartupPath & "\"


Questa è una cosa su cui ci sto sbattendo da tempo; ad esempio se con VB6 dovevo collegarmi ad un database chiamato Clienti.mdb all'interno di C:\Users\Admin\Desktop\VB\Autorun bastava usare App.path che puntava alla cartella C:\Users\Admin\Desktop\VB\Autorun ed il gioco era fatto; adesso invece vedo che la maggior parte delle istruzioni Application.Qualcosa puntano alla directory bin:
...
Significa che dovrei mettere il mio database dentro bin? :confused:


Esatto. Se vuoi che la tua Application faccia uso di un DB Access locale, che dovrà stare sempre nella medesima directory dell'eseguibile, userai Application.StartupPath & "\" e in fase di debug metterai il file Access in bin\Debug.

E poi alcune considerazioni te le devo fare, perchè stasera sono in vena di spiegare e vedo che stai immancabilmente cadendo nella classica tentazione irresistibile di chi chiede : "In VB6 facevo così - come faccio in VB.NET ?"

Microsoft viene incontro ai bisogni del povero ex-VB6 che si sente un po' spaesato. Se vai nell'esplora soluzioni e dai un'occhiata alle proprietà del progetto ( in questo caso Progetto, NON Soluzione ), noterai che nei Riferimenti / Spazi dei nomi importati, il primo fra tutti è un certo "Microsoft.VisualBasic".
Tutto ciò è insieme un bene, e un male.
Un bene, perchè ti consente di usare praticamente il 90%, se non di più, dei costrutti tipici di VB6, garantendo a chi è pigro un passaggio abbastanza "indolore".
Un male, perchè tu, che sei agli inizi, non potrai distinguere ciò che è davvero VB.NET ( che non ha nulla a che fare con VB6, a parte una mera somiglianza sintattica ), da ciò che VB.NET tollera, se viene ancora scritto "alla-VB6".

Esempio. Voglio una MsgBox che mi informi sulla lunghezza di una stringa.

In VB.NET posso scrivere :
Dim stringa As String = "ciao"
MsgBox(Len(stringa))
e nessuno si incazza, ma prova a togliere il segno di spunta a Microsoft.VisualBasic dallo "Spazi dei nomi importati" e con grande sorpresa noterai che ora il debugger da errore su MsgBox e su Len, definendoli "nomi non dichiarati".

Riscrivi tutto così :
Dim stringa As String = "ciao"
Microsoft.VisualBasic.MsgBox(Microsoft.VisualBasic.Len(stringa))
Nessun errore.

Adesso riscrivi così :
Dim stringa As String = "ciao"
MessageBox.Show(stringa.Length)
Ecco, QUESTO è il vero VB.NET.

Ti starai chiedendo : ma come ?! stringa.Length ?
Esatto. In VB6 la stringa era un tipo. In VB.NET è un oggetto.
Con tutte le conseguenze che scoprirai... ;)

lucausa75
22-08-2010, 09:11
GameKeeper e MarcoGG,

ottima spiegazione: grazie di vero cuore!
Adesso tutto è più chiaro.

Questo ciò che ho impostato:

http://img72.imageshack.us/img72/7518/68691245.th.png (http://img72.imageshack.us/i/68691245.png/)


http://img839.imageshack.us/img839/6631/2bis.th.png (http://img839.imageshack.us/i/2bis.png/)


P.S. Ma avete mai pensato a scrivere una guida? :D
Siete molto preparati...

MarcoGG
22-08-2010, 09:45
...
Questo ciò che ho impostato:
...


Beh sì, se a te piace così.
Ma non è affatto necessario star lì a tirarsi nel progetto tutti i files secondari di cui l'applicazione ha bisogno a runtime.
Personalmente anzi la trovo una pratica dannosa. Io nei files di progetto voglio sempre vedere solo le Classi, i Moduli, e le risorse strettamente necessarie ( al massimo tollero files di testo e icone per le Forms... ) .
In parole povere il codice sorgente.
Immagina un progetto con 100 classi, che nell'explorer sono mischiate con file immagine, video, icone, file audio,... Visivamente un macello. :doh:
Questa, almeno, è la mia filosofia.
Puoi sempre aggiungere manualmente i file di cui l'applicazione può aver biosogno, e farvi accesso dinamicamente da codice ( Application.StartupPath... ), meglio ancora se in apposite sottocartelle : \bin\Debug\icone\, bin\Debug\video\, bin\debug\suoni\, ecc... Molto più pulito e ordinato, e te ne accorgerai quando farai applicazioni più complesse.

lucausa75
22-08-2010, 09:55
Beh sì, se a te piace così.
Ma non è affatto necessario star lì a tirarsi nel progetto tutti i files secondari di cui l'applicazione ha bisogno a runtime.
Personalmente anzi la trovo una pratica dannosa. Io nei files di progetto voglio sempre vedere solo le Classi, i Moduli, e le risorse strettamente necessarie ( al massimo tollero files di testo e icone per le Forms... ) .
In parole povere il codice sorgente.
Immagina un progetto con 100 classi, che nell'explorer sono mischiate con file immagine, video, icone, file audio,... Visivamente un macello. :doh:
Questa, almeno, è la mia filosofia.
Puoi sempre aggiungere manualmente i file di cui l'applicazione può aver biosogno, e farvi accesso dinamicamente da codice ( Application.StartupPath... ), meglio ancora se in apposite sottocartelle : \bin\Debug\icone\, bin\Debug\video\, bin\debug\suoni\, ecc... Molto più pulito e ordinato, e te ne accorgerai quando farai applicazioni più complesse.

OK condivido il tuo punto di vista ma adesso dopo che ho messo i miei file dentro bin\Debug è normale che mi ritrovo i files nella cartella principale oltre che dentro bin\Debug e bin\Release (se seleziono l'opzione "COPY IF NEWER")?

http://img825.imageshack.us/img825/4732/22082010104336.th.png (http://img825.imageshack.us/i/22082010104336.png/)

E' normale che come full path dei singoli file trovo questo?

http://img835.imageshack.us/img835/1838/22082010105216.th.png (http://img835.imageshack.us/i/22082010105216.png/)

Grazie e perdonami per la valanga di domande a cui stai dando sempre risposte chiare ;)

MarcoGG
22-08-2010, 10:12
OK condivido il tuo punto di vista ma adesso dopo che ho messo i miei file dentro bin\Debug è normale che mi ritrovo i files nella cartella principale oltre che dentro bin\Debug e bin\Release (se seleziono l'opzione "COPY IF NEWER")?


Certo che sì. VS crea una copia di quei files nella cartella principale, dove risiedono i sorgenti dell'applicazione. E poi li copia nuovamente ( ma solo "if newer", appunto ) ad ogni compilazione in Debug e Release.
Debug e Release non contengono sorgenti, ma eseguibili. E gli eseguibili di Debug non sono gli stessi di Release, perchè quelli in Debug contengono informazioni aggiuntive utili al debugger, e sono mediamente più lenti dei Release.


E' normale che come full path dei singoli file trovo questo?


Sì, perchè in solution explorer tu vedi il contenuto della cartella principale, ossia i sorgenti, e NON di Debug, nè di Release.

Vedi, tutta questa cinesata te la risparmiavi tranquillamente ad esempio creandoti una cartella bin\Debug\risorse\. E poi :
bin\Debug\risorse\video\
bin\Debug\risorse\icone\
bin\Debug\risorse\suoni\
ecc...
ed evitando di mischiare nell'explorer i file sorgenti con le risorse esterne.
Poi, uomo avvisato...
;)

lucausa75
22-08-2010, 10:24
Vedi, tutta questa cinesata te la risparmiavi tranquillamente ad esempio creandoti una cartella bin\Debug\risorse\. E poi :
bin\Debug\risorse\video\
bin\Debug\risorse\icone\
bin\Debug\risorse\suoni\
ecc...
ed evitando di mischiare nell'explorer i file sorgenti con le risorse esterne.
Poi, uomo avvisato...
;)

...alla fine ho optato per questa tua soluzione che condivido e mi piace ;)

lucausa75
23-08-2010, 09:30
Carissimi,
ho un problema con le matrici di controlli (come mi manca qui il buon VB6 :cry: ).

Nel mio form ho 6 RadioButton che voglio associare in matrice e al click su ciascuna debbo ricevere una Message Box col rispettivo valore della Text.

Questo che ho realizzato: è corretto?

Public Class frmSysInfo
Dim optInfo(5) As RadioButton
Dim StringaInfo As String = String.Empty

Private Sub InizializzazioneOptionButton()
optInfo(0) = Me.optInfo0
optInfo(1) = Me.optInfo1
optInfo(2) = Me.optInfo2
optInfo(3) = Me.optInfo3
optInfo(4) = Me.optInfo4
optInfo(5) = Me.optInfo5
End Sub

Private Sub optInfo0_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optInfo0.CheckedChanged, optInfo1.CheckedChanged, optInfo2.CheckedChanged, optInfo3.CheckedChanged, optInfo4.CheckedChanged, optInfo5.CheckedChanged
If DirectCast(sender, RadioButton).Checked = True Then
StringaInfo = DirectCast(sender, RadioButton).Text
MessageBox.Show(StringaInfo)
End If
End Sub


Private Sub frmSysInfo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
InizializzazioneOptionButton()
End Sub
End Class

optInfo0, optInfo1, optInfo2, optInfo3, optInfo4, optInfo5 sono le RadioButton nel mio form mentre optInfo(0), optInfo(1), optInfo(2), optInfo(3), optInfo(4), optInfo(5) sono i nome dei controlli raggruppati in matrice.

Se volessi ricevere la MessageBox al form load cliccando sulla terza RadioButton cosa riga di codice dovrei aggiungere al Form_Load?

Grazie 1000!

MarcoGG
23-08-2010, 10:27
ho un problema con le matrici di controlli (come mi manca qui il buon VB6 :cry: ).


In VB.NET le matrici di controlli non esistono più. Esistono innumerevoli tecniche alternative, e personalmente trovo sia meglio così.


Nel mio form ho 6 RadioButton che voglio associare in matrice e al click su ciascuna debbo ricevere una Message Box col rispettivo valore della Text.


Una tecnica molto interessante, con 4 righe di codice ?
Anzitutto, dal momento che queste 6 radio sono Opzioni di un qualcosa, perchè non usare un sotto-contenitore in cui raggrupparle ?
Prendo una GroupBox ( le hanno inventate apposta... ) e la chiamo "opzioni", e ci metto le 6 radio. A questo punto il codice Form è questo :

Public Class Form1

Private Sub OpzioniClick()

For Each R As RadioButton In opzioni.Controls
If R.Checked = True Then MsgBox(R.Name)
Next

End Sub

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

For Each R As RadioButton In opzioni.Controls
AddHandler R.Click, New EventHandler(AddressOf OpzioniClick)
Next

End Sub

End Class

Se invece vuoi aggiungere via codice le radio ad un tuo "array_opzioni_radio", ti basterà sostituire qui :

For Each R As RadioButton In array_opzioni_radio

In ogni caso i container sono già rappresentazioni grafiche ( e ricche di eventi, che un array non ha ! ) di array di controlli, perciò perchè non usarle ?

;)

lucausa75
23-08-2010, 11:28
In VB.NET le matrici di controlli non esistono più. Esistono innumerevoli tecniche alternative, e personalmente trovo sia meglio così.



Una tecnica molto interessante, con 4 righe di codice ?
Anzitutto, dal momento che queste 6 radio sono Opzioni di un qualcosa, perchè non usare un sotto-contenitore in cui raggrupparle ?
Prendo una GroupBox ( le hanno inventate apposta... ) e la chiamo "opzioni", e ci metto le 6 radio. A questo punto il codice Form è questo :

Public Class Form1

Private Sub OpzioniClick()

For Each R As RadioButton In opzioni.Controls
If R.Checked = True Then MsgBox(R.Name)
Next

End Sub

Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

For Each R As RadioButton In opzioni.Controls
AddHandler R.Click, New EventHandler(AddressOf OpzioniClick)
Next

End Sub

End Class

Se invece vuoi aggiungere via codice le radio ad un tuo "array_opzioni_radio", ti basterà sostituire qui :

For Each R As RadioButton In array_opzioni_radio

In ogni caso i container sono già rappresentazioni grafiche ( e ricche di eventi, che un array non ha ! ) di array di controlli, perciò perchè non usarle ?

;)


...ottima idea questa della GroupBox che equivale al vecchio controllo Frame del VB6 giusto?

Al momento vorrei abbandonarla questa opzione e vorrei rimanere sulla linea di ciò che ho fatto nel mio codice postato prima.

Secondo te c'è un modo di risalire all'index della RadioButton cliccata o debbo dichiararmi a monte le variabili che saranno riempite ad ogni click sulla relativa RadioButton?

MarcoGG
23-08-2010, 12:11
...ottima idea questa della GroupBox che equivale al vecchio controllo Frame del VB6 giusto?


E' più o meno la stessa cosa, concettualmente, ma ci andrei cauto con "equivale"... :D
Fai solo un semplice confronto tra gli eventi messi a disposizione da un Frame VB6 con questo GroupBox.


Secondo te c'è un modo di risalire all'index della RadioButton cliccata o debbo dichiararmi a monte le variabili che saranno riempite ad ogni click sulla relativa RadioButton?


Semplice. Come ho già spiegato prima :

Public Class Form1

Private optInfo(5) As RadioButton

Private Sub OpzioniClick()

For Each R As RadioButton In optInfo
If R.Checked = True Then MsgBox(Array.IndexOf(optInfo, R))
Next

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

optInfo(0) = Me.optInfo0
optInfo(1) = Me.optInfo1
optInfo(2) = Me.optInfo2
optInfo(3) = Me.optInfo3
optInfo(4) = Me.optInfo4
optInfo(5) = Me.optInfo5

For Each R As RadioButton In optInfo
AddHandler R.Click, New EventHandler(AddressOf OpzioniClick)
Next

End Sub

End Class

e sei a cavallo. ;)

lucausa75
23-08-2010, 14:18
E' più o meno la stessa cosa, concettualmente, ma ci andrei cauto con "equivale"... :D
Fai solo un semplice confronto tra gli eventi messi a disposizione da un Frame VB6 con questo GroupBox.



Semplice. Come ho già spiegato prima :

Public Class Form1

Private optInfo(5) As RadioButton

Private Sub OpzioniClick()

For Each R As RadioButton In optInfo
If R.Checked = True Then MsgBox(Array.IndexOf(optInfo, R))
Next

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

optInfo(0) = Me.optInfo0
optInfo(1) = Me.optInfo1
optInfo(2) = Me.optInfo2
optInfo(3) = Me.optInfo3
optInfo(4) = Me.optInfo4
optInfo(5) = Me.optInfo5

For Each R As RadioButton In optInfo
AddHandler R.Click, New EventHandler(AddressOf OpzioniClick)
Next

End Sub

End Class

e sei a cavallo. ;)

...il tuo discorso non fa una piega ma vorrei capire bene il significato delle istruzioni evidenziate in seguito dalle frecce:

For Each MyRadioButton In optInfo
==>If MyRadioButton.Checked = True Then MsgBox(Array.IndexOf(optInfo, MyRadioButton))
Next MyRadioButton

For Each MyRadioButton In optInfo
==>AddHandler MyRadioButton.Click, New EventHandler(AddressOf OpzioniClick)
Next MyRadioButton

GameKeeper
23-08-2010, 14:20
Immagina un progetto con 100 classi, che nell'explorer sono mischiate con file immagine, video, icone, file audio,... Visivamente un macello.

Infatti in genere una delle prime cose che si fanno nell'impostazione del progetto è proprio quella di organizzare per bene i vari file del progetto in cartelle in modo da avere tutto in ordine... Ad esempio in questo caso io farei (in Visual Basic) una cartelle per le risorse dentro la quale sistemare questi file... O almeno io preferisco fare così, poi è chiaro che ognuno ha le proprie abitudini... ;)

lucausa75
23-08-2010, 14:23
Infatti in genere una delle prime cose che si fanno nell'impostazione del progetto è proprio quella di organizzare per bene i vari file del progetto in cartelle in modo da avere tutto in ordine... Ad esempio in questo caso io farei (in Visual Basic) una cartelle per le risorse dentro la quale sistemare questi file... O almeno io preferisco fare così, poi è chiaro che ognuno ha le proprie abitudini... ;)

...diciamo che fino ai tempi di VB6 era mia consuetudine operare in questo modo; adesso con l'avvento di VB2010 (capire cosa significhino le cartelle bin\debug e bin\release è stao critico) piano piano diventerà normale nuovamente :D

Grazie cmq per i vostri preziosi insegnamenti!

MarcoGG
23-08-2010, 16:41
For Each MyRadioButton In optInfo
==>If MyRadioButton.Checked = True Then MsgBox(Array.IndexOf(optInfo, MyRadioButton))
Next MyRadioButton

For Each MyRadioButton In optInfo
==>AddHandler MyRadioButton.Click, New EventHandler(AddressOf OpzioniClick)
Next MyRadioButton

1. Array è la classe System.Array, che mette a disposizione diversi metodi per manipolare gli array. Inutile dire che il supporto agli array e la facilità con cui si possono gestire in VB.NET non ha nulla a che fare con VB6...
Perciò Array.IndexOf(optInfo, MyRadioButton) significa : io ti passo l'array e l'elemento che cerco e tu mi restituisci l'IndexOf, letteralmente "l'indice-di...". Più intuitivo di così.

2. Per ogni radio nell'array optInfo aggiungi un handler, che ascolti l'evento .Click, e per quel particolare evento punti-a ( Address-Of ) una particolare routine ( tipicamente un metodo della stessa classe Form ) destinata a contenere il codice da eseguire ogni volta che l'evento viene scatenato.
Un "Handler", senza tirare in ballo paroloni, è come se tu dicessi all'applicazione di mettersi in ascolto su un particolare evento.
Quando crei un pulsante da GUI, lo metti sulla Form, e ci fai doppio-click, VB genera il codice :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

End Sub

Button1_Click non è l'handler. L'handler è già definito senza che tu ne veda il codice ed in ascolto di default su ogni nuovo oggetto GUI creato, con tutti gli eventi associati.
Button1_Click è il nome del metodo che VB "si inventa", come io mi sono inventato il mio "Private Sub OpzioniClick()", e lo associa all'handler di Button1, per l'evento click ( handler che già esiste ), con quel "Handles Button1.Click".

Cambia pure il nome del metodo associato all'handler :
Private Sub Premi_Button1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

MsgBox("hai premuto Button1")

End Sub
e infatti funziona lo stesso.

Se invece elimini la clausola Handles, diventa un metodo qualsiasi slegato da ogni handler, e non funzionerà più.

In VB6 è tutto molto più ermetico e meno flessibile :
Private Sub Command1_Click()

MsgBox "hai premuto Command1"

End Sub
In questo caso non sono tollerate modifiche di alcun genere.

Forse mi sono dilungato un po', ma spero di aver esaurito il concetto.

lucausa75
24-08-2010, 06:38
MarcoGG sei stato chiarissimo.

Questa della Sub OpzioniClick

Private Sub OpzioniClick()

For Each R As RadioButton In optInfo
If R.Checked = True Then MsgBox(Array.IndexOf(optInfo, R))
Next

End Sub

è un'altra cosa che volevo chiederti; infatti se clicco in qualsiasi di quelle RadioButton che ho messo in matrice mi viene visualizzata la MsgBox ma non vedo alcun riferimento di quella sub nell'evento Click di queste RadioButton :confused:

MarcoGG
24-08-2010, 08:37
se clicco in qualsiasi di quelle RadioButton che ho messo in matrice mi viene visualizzata la MsgBox ma non vedo alcun riferimento di quella sub nell'evento Click di queste RadioButton :confused:


Ma come no ? :doh: :D
Prima mi dici che sono stato chiarissimo, e poi mi dai questa mazzata ? :D

Dal momento che abbiamo aggiunto al Form Load questo codice :
For Each R As RadioButton In optInfo
AddHandler R.Click, New EventHandler(AddressOf OpzioniClick)
Next
è come se avessimo associato al Click di ciascuno di quei RadioButton, il metodo "OpzioniClick()". Solo che l'abbiamo fatto via codice, senza dover fare doppio-click su ognuno dei RadioButton in design, e andare a scrivere nel metodo collegato all'evento Click di ciascuno.

"AddressOf OpzioniClick" è come se tu facessi doppio-click in design su ogni radio e nell'evento Click scrivessi "OpzioniClick", ossia :

Private Sub optInfo0_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles optInfo0.Click

OpzioniClick()

End Sub

Private Sub optInfo1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles optInfo1.Click

OpzioniClick()

End Sub

e così via fino ad optInfo5.

Kralizek
24-08-2010, 08:45
com'é il codice per optInfo5 ? :D

lucausa75
24-08-2010, 09:00
Ma come no ? :doh: :D
Prima mi dici che sono stato chiarissimo, e poi mi dai questa mazzata ? :D

Dal momento che abbiamo aggiunto al Form Load questo codice :
For Each R As RadioButton In optInfo
AddHandler R.Click, New EventHandler(AddressOf OpzioniClick)
Next
è come se avessimo associato al Click di ciascuno di quei RadioButton, il metodo "OpzioniClick()". Solo che l'abbiamo fatto via codice, senza dover fare doppio-click su ognuno dei RadioButton in design, e andare a scrivere nel metodo collegato all'evento Click di ciascuno.

"AddressOf OpzioniClick" è come se tu facessi doppio-click in design su ogni radio e nell'evento Click scrivessi "OpzioniClick", ossia :

Private Sub optInfo0_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles optInfo0.Click

OpzioniClick()

End Sub

Private Sub optInfo1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles optInfo1.Click

OpzioniClick()

End Sub

e così via fino ad optInfo5.

...per carità non voglio darti alcuna mazzata! :D
Adesso ho capito; mi sono sfuggite quelle righe di codice nel Form_Load
Grazie ancora cmq!

lucausa75
24-08-2010, 09:02
com'é il codice per optInfo5 ? :D

Private Sub optInfo5_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles optInfo5.Click

OpzioniClick()

End Sub


Ho vinto quacchecosa? :D

Ragazzi credete con questo VB2010 mi sento un principiante :fagiano: ma grazie ai vostri aiuto sto imparando ad entrare nel circolo vizioso! :D

MarcoGG
24-08-2010, 09:57
com'é il codice per optInfo5 ? :D

No, non ti ci mettere anche tu... :bsod:

Kralizek
24-08-2010, 12:34
Private Sub optInfo5_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles optInfo5.Click

OpzioniClick()

End Sub


Ho vinto quacchecosa? :D

Ragazzi credete con questo VB2010 mi sento un principiante :fagiano: ma grazie ai vostri aiuto sto imparando ad entrare nel circolo vizioso! :D

poi un giorno proverai ad aggiungere il ";" a fine riga, ti verrá detto che stai programmando in C#, e sará tutto piú bello!

ho passato il mio 1000mo post senza festeggiare :(

MarcoGG
24-08-2010, 15:52
poi un giorno proverai ad aggiungere il ";" a fine riga, ti verrá detto che stai programmando in C#, e sará tutto piú bello!


Eh sì ! Sai che goduria... :p

lucausa75
25-08-2010, 09:42
Salve ragazzi,

nel file allegato trovate il sorgente della mia applicazione ovviamente scritta in VB2010 grazie ai vostri consigli.

Trovate anche due procedure in rosso sostituite da quelle sottostanti e volevo capire se il tutto è stato fatto correttamente o c'è da fare qualche correzione

Grazie ancora!

MarcoGG
25-08-2010, 12:54
Non ho ancora VB 2010.
Facevi prima a postare il codice su cui hai dubbi...

lucausa75
25-08-2010, 13:09
Non ho ancora VB 2010.
Facevi prima a postare il codice su cui hai dubbi...


Ciao il file .zip contiene un file .rtf per cui non è necessario avere VB2010 nel proprio PC.

Volevo solo capire se la struttura delle sub fosse stata fatta in maniera corretta ;)

MarcoGG
25-08-2010, 13:26
Da una lettura molto rapida direi che è tutto a posto. Poi, trattandosi di un'applicazione davvero molto semplice, non ci sono molti spunti per dare dritte e consigli :

1. In pratica hai dichiarato Private tutte le Sub e Function che non hanno nulla a che vedere con l'interfaccia grafica della Classe Form, il che, trattandosi di applicazione mono-Form, non è che sia un errore. Ma è buona regola slegare il codice essenzialmente di interazione con i controlli-Form, da tutto il resto...

2. Ad esempio ho visto un For molto stile-VB6 :
Dim i As Integer
...
For i = 0 To ...
...
Next i

In VB.NET può essere più compatto :

For i As Integer = 0 To ...
...
Next

Ma sono finezze. Per il resto dovrei provarlo...

P.S.: Ah, e fai bene attenzione ai tipi numerici ! Un Integer di VB6 NON è un Integer di VB.NET !

lucausa75
25-08-2010, 13:36
Da una lettura molto rapida direi che è tutto a posto. Poi, trattandosi di un'applicazione davvero molto semplice, non ci sono molti spunti per dare dritte e consigli :

1. In pratica hai dichiarato Private tutte le Sub e Function che non hanno nulla a che vedere con l'interfaccia grafica della Classe Form, il che, trattandosi di applicazione mono-Form, non è che sia un errore. Ma è buona regola slegare il codice essenzialmente di interazione con i controlli-Form, da tutto il resto...

2. Ad esempio ho visto un For molto stile-VB6 :
Dim i As Integer
...
For i = 0 To ...
...
Next i

In VB.NET può essere più compatto :

For i As Integer = 0 To ...
...
Next

Ma sono finezze. Per il resto dovrei provarlo...

P.S.: Ah, e fai bene attenzione ai tipi numerici ! Un Integer di VB6 NON è un Integer di VB.NET !


...cmq direi che sono proprio sulla retta via giusto? :D

Vorresti che ti invio tutto il sorgente così non appena installi VB2010 lo provi?

MarcoGG
26-08-2010, 08:33
Sì beh, intendevo "provarlo" nel senso di vedere se va in errore in particolari condizioni. Ho già il mio "system information" scritto in VB 2008 cmq... ;)

lucausa75
26-08-2010, 09:19
Sì beh, intendevo "provarlo" nel senso di vedere se va in errore in particolari condizioni. Ho già il mio "system information" scritto in VB 2008 cmq... ;)


...una curiosità.

Per creare i pacchetti di installazione cosa usi?

Io vorrei usare Cyberinstaller...che ne dici/dite?

MarcoGG
26-08-2010, 10:47
Dallo stesso Visual Studio è possibile.
Nuovo Progetto / Altri tipi di progetto / Installazione e distribuzione / ...

Personalmente ho usato a volte il wizard di VS, altre volte vari tools di terze parti. Non ce n'è uno a cui mi sono "affezionato"... CyberInstaller non l'ho mai provato.
Ma più che altro per i miei progetti mi muovo nella direzione esattamente opposta, ossia, per varie ragioni oggettive e soggettive che non sto ad elencare, faccio di tutto per farne a meno. Sono un fan delle applicazioni no-install, insomma. ;)

lucausa75
26-08-2010, 11:04
[QUOTE=MarcoGG;32919597]Dallo stesso Visual Studio è possibile.
Nuovo Progetto / Altri tipi di progetto / Installazione e distribuzione / ...QUOTE]


Non posso utilizzare questa funzionalità perchè ho VB2010 Express e non Visual Studio ;)

Cmq sto provando ad utilizzare Cyberinstaller Studio che già ho usato con VB6 e magari vi posto una guida ;)

lucausa75
04-09-2010, 08:33
Salve ragazzi,
alla fine ho optato per InstallShield ;)

lucausa75
05-09-2010, 08:55
Salve ragazzi,

come faccio ad eliminare queste due voci nella Solution Explorer del mio progetto?

Vedi immagine allegata:

http://img26.imageshack.us/img26/1561/catturaol.th.png (http://img26.imageshack.us/i/catturaol.png/)

Grazie 1000!

lucausa75
08-10-2010, 09:02
Menu Debug / Finestre / Controllo Immediato.

...ricordo che nel buon VB6 se ad esempio volevo controllare il valore di una variabile (che ad esempio si chiama Contatore) in corrispondenza ad un Break Point bastava scrivere all'interno della finestra immediate:

? Contatore, dare invio e ti veniva visualizzato il valore corrispondente; in VB2010 questo non funziona.

C'è una sintassi diversa da utilizzare?

Grazie