Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Moduli comuni a più programmi in VB 2008 Express Edition
Forum - C# / VB.NET - Moduli comuni a più programmi in VB 2008 Express Edition

Avatar
gl1963 (Normal User)
Newbie


Messaggi: 18
Iscritto: 01/09/2010

Segnala al moderatore
Postato alle 15:31
Mercoledì, 01/09/2010
Questo topic è stato chiuso dal moderatore

Salve a tutti.

Avrei la necessità di usare una serie di routines (Sub) in più di un programma.

Quando uso VB6 creo dei moduli .Bas in una cartella comune e li includo nei progetti. In questo modo se devo fare delle correzioni mi basta ricreare gli EXE relativi ai programmi che usano i moduli modificati.

Esiste la possibilità di fare la stessa cosa con VB 2008 Express Edition??
Ho visto che cliccando con il tasto destro sul nome progetto mi appare un menù con la voce "Aggiungi -> Elemento esistente", ma non è la stessa cosa in quanto il file che scelgo viene copiato nella cartella del progetto.

Spero di essere stato abbastanza chiaro; non è da molto che uso VB 2008 Express Edition quindi molte cose, anche se possono essere banali, non le so.

Grazie comunque a tutti in anticipo. :)



GiovanniLuigi
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2764
Iscritto: 21/09/2007

Up
1
Down
V
Segnala al moderatore
Postato alle 16:03
Mercoledì, 01/09/2010

devi incapsulare i componenti comuni in un assembly condiviso.
linki a tutti i progetti l'assembly e quando vuoi modificare le funzioni comuni ricompili solo l'assembly lasciando inalterati i progetti.


Ingegnere Informatico
https://ldlagency.it
PM
Avatar
gl1963 (Normal User)
Newbie


Messaggi: 18
Iscritto: 01/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 9:03
Giovedì, 02/09/2010
Scusa la mia ignoranza, ma per "assembly condiviso" intendi una DLL ??
Una delle "Sub" di cui parlavo ad esempio, mi ridimensiona le colonne di una ListView (vedi codice sotto) e non so se è richiamabile in una DLL.

Grazie, ciao. :):):)

Codice sorgente - presumibilmente VB.NET

  1. Public Sub ResizeColListView(ByVal lnList As ListView)
  2.  
  3.         Dim wkII As Integer
  4.         Dim wkJJ As Integer
  5.         Dim wkLbl As New Label
  6.  
  7.         wkLbl.AutoSize = True
  8.  
  9.         For wkII = 0 To lnList.Columns.Count - 1
  10.             wkLbl.Text = lnList.Columns(wkII).Text
  11.             lnList.Columns(wkII).Width = (wkLbl.Width + 10)
  12.         Next
  13.  
  14.         For wkII = 0 To lnList.Items.Count - 1
  15.             wkLbl.Text = lnList.Items(wkII).Text.ToString
  16.             If (wkLbl.Width + 10) > lnList.Columns(0).Width Then
  17.                 lnList.Columns(0).Width = (wkLbl.Width + 10)
  18.             End If
  19.             For wkJJ = 1 To lnList.Columns.Count - 1
  20.                 wkLbl.Text = lnList.Items(wkII).SubItems(wkJJ).Text.ToString
  21.                 If (wkLbl.Width + 10) > lnList.Columns(wkJJ).Width Then
  22.                     lnList.Columns(wkJJ).Width = (wkLbl.Width + 10)
  23.                 End If
  24.             Next
  25.         Next
  26.  
  27.         wkLbl.Dispose()
  28.  
  29.     End Sub



GiovanniLuigi
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2764
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 9:13
Giovedì, 02/09/2010

se la sub fa uso di variabili globali devi cambiare la tua impostazione, cioè devi passare alla sub tutte le variabili globali di cui fa uso, in questo modo la astrai dal contesto.

buona norma sarebbe incapsulare in delle classi di estensione le procedure che agiscono su quell'oggetto: http://forum.masterdrive.it/visual-basic-net-tutorials-and ...

in questo modo, immaginando che l'oggetto della tua ResizeColListView sia appunto una ListView di nome lwTest, potrai scrivere:

lwTest.ResizeColListView(3, 4);



Ingegnere Informatico
https://ldlagency.it
PM
Avatar
gl1963 (Normal User)
Newbie


Messaggi: 18
Iscritto: 01/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 9:32
Giovedì, 02/09/2010
Per adesso grazie mille. Ora faccio un po' di prove.

Ciao 8-|8-|


GiovanniLuigi
PM
Avatar
gl1963 (Normal User)
Newbie


Messaggi: 18
Iscritto: 01/09/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 9:39
Venerdì, 10/09/2010
Ciao.
Riguardo alla tua risposta dell'altro giorno sugli "Assembly condivisi" ho fatto questa prova:
1) ho creato una DLL
2) ho scritto un programma dove ho inserito il riferimento alla DLL usando la voce
   Progetto -> Proprietà -> Riferimenti -> Aggiungi -> Sfoglia
3) ho istanziatdo una variabile di tipo: NomeDLL.NomeClasse
4) ho richiamato il metodo usando il comando NomeVariabile.NomeMetodo(Parametro)

Non so se questo è esattamente quello che mi avevi spiegato tu, ma funziona e per questo ti ringrazio ancora tantissimo.:hail:

Colgo l'occasione per inviarti di seguito un piccolo esempio per richiamare una DLL senza però inserire il riferimento nel progetto

CLASSE DLL :

Codice sorgente - presumibilmente VB.NET

  1. Public Class ClasseDllVB
  2.  
  3.     Dim wkValore1 As String = ""
  4.     Dim wkValore2 As String = "stringa in sola lettura"
  5.     Dim wkValore3 As String = ""
  6.  
  7.     Public Property Prop1String()
  8.  
  9.         Get
  10.             Return wkValore1
  11.         End Get
  12.  
  13.         Set(ByVal value)
  14.             wkValore1 = value
  15.         End Set
  16.  
  17.     End Property
  18.  
  19.     Public ReadOnly Property Prop2String()
  20.  
  21.         Get
  22.             Return wkValore2
  23.         End Get
  24.  
  25.     End Property
  26.  
  27.     Public WriteOnly Property Prop3String()
  28.  
  29.         Set(ByVal value)
  30.             wkValore3 = value
  31.         End Set
  32.  
  33.     End Property
  34.  
  35.     Public Sub Metodo1(ByVal Parametro1 As String, ByVal Parametro2 As Integer)
  36.  
  37.         Windows.Forms.MessageBox.Show("Metodo1 della DLL VB, Parametro1=" & Parametro1 & ", Parametro2=" & Parametro2.ToString)
  38.  
  39.     End Sub
  40.  
  41.     Public Function Metodo2() As String
  42.  
  43.         Windows.Forms.MessageBox.Show("Metodo2 della DLL VB, restituisce " & wkValore3 & " in minuscolo", "Messaggio", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Information)
  44.  
  45.         Metodo2 = wkValore3.ToLower
  46.  
  47.     End Function
  48.  
  49. End Class



PROGRAMMA CHIAMANTE :
Codice sorgente - presumibilmente VB.NET

  1. Private Sub RichiamaDllVB()
  2.  
  3.         Dim wkNomeDll As String
  4.         Dim wkNomeClasse As String
  5.  
  6.         Dim wkII As Int16
  7.         Dim wkDLL As System.Reflection.Assembly
  8.         Dim wkClasse As Object
  9.         Dim wkProprieta As System.Reflection.PropertyInfo
  10.         Dim wkMetodo As System.Reflection.MethodInfo
  11.         Dim wkParametro() As System.Reflection.ParameterInfo
  12.         Dim wkParametriDelMetodo() As Object
  13.         Dim wkStringa As String
  14.  
  15.         wkNomeDll = "DllVB"
  16.         wkNomeClasse = "ClasseDllVB"
  17.  
  18.         ' carica la DLL
  19.         Try
  20.             wkDLL = System.Reflection.Assembly.LoadFrom(wkNomeDll & ".dll")
  21.         Catch ex As Exception
  22.             MessageBox.Show("Errore caricamento DLL" & vbLf & ex.Message, wkNomeDll & ".Dll", MessageBoxButtons.OK, MessageBoxIcon.Error)
  23.             Exit Sub
  24.         End Try
  25.  
  26.         ' istanzia la classe
  27.         wkClasse = wkDLL.CreateInstance(wkNomeDll & "." & wkNomeClasse)
  28.  
  29.         ' carica il metodo "Metodo1"
  30.         Try
  31.             wkMetodo = wkClasse.GetType.GetMethod("Metodo1")
  32.         Catch ex As Exception
  33.             MessageBox.Show("Errore lettura metodo (nome classe errato)" & vbLf & ex.Message, wkNomeDll & ".Metodo1", MessageBoxButtons.OK, MessageBoxIcon.Error)
  34.             Exit Sub
  35.         End Try
  36.  
  37.         ' visualizza nome e tipo dei parametri del metodo
  38.         Try
  39.             wkParametro = wkMetodo.GetParameters()
  40.         Catch ex As Exception
  41.             MessageBox.Show("Errore lettura parametri (nome metodo errato)" & vbLf & ex.Message, wkNomeDll & ".Metodo1", MessageBoxButtons.OK, MessageBoxIcon.Error)
  42.             Exit Sub
  43.         End Try
  44.         For wkII = 0 To wkParametro.Length - 1
  45.             MessageBox.Show((wkII + 1).ToString & "° parametro : Nome=" & wkParametro(wkII).Name & ", Tipo=" & wkParametro(wkII).ParameterType.ToString)
  46.         Next
  47.  
  48.         ' inizializza i parametri del metodo
  49.         wkII = wkMetodo.GetParameters.Length - 1
  50.         ReDim wkParametriDelMetodo(wkII)
  51.         wkParametriDelMetodo(0) = "parametro stringa"
  52.         wkParametriDelMetodo(1) = 12345
  53.  
  54.         ' esegue il metodo
  55.         wkMetodo.Invoke(wkClasse, wkParametriDelMetodo)
  56.  
  57.         ' imposta la proprietà  "Prop3String"
  58.         '   (variabile "wkValore3" all'interno della DLL)
  59.         Try
  60.             wkProprieta = wkClasse.GetType.GetProperty("Prop3String")
  61.             wkProprieta.SetValue(wkClasse, "ABC", Nothing)
  62.         Catch ex As Exception
  63.             MessageBox.Show("Errore impostazione proprietà " & vbLf & ex.Message, wkNomeDll & ".Prop3String", MessageBoxButtons.OK, MessageBoxIcon.Error)
  64.             Exit Sub
  65.         End Try
  66.  
  67.         ' carica ed esegue il metodo "Metodo2" (funzione di tipo stringa che non ha parametri)
  68.         '   (restituisce variabile "wkValore3" in minuscolo)
  69.         Try
  70.             wkMetodo = wkClasse.GetType.GetMethod("Metodo2")
  71.             wkStringa = wkMetodo.Invoke(wkClasse, Nothing)
  72.         Catch ex As Exception
  73.             MessageBox.Show("Errore lettura metodo (nome classe errato)" & vbLf & ex.Message, wkNomeDll & ".Metodo2", MessageBoxButtons.OK, MessageBoxIcon.Error)
  74.             Exit Sub
  75.         End Try
  76.  
  77.         ' la variabile "wkStringa" ora contiene "abc"
  78.         MessageBox.Show(wkStringa)
  79.  
  80.     End Sub



Spero che sia abbastanza chiaro e che possa esserti utile

Ciao :)


GiovanniLuigi
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2764
Iscritto: 21/09/2007

Up
0
Down
V
Segnala al moderatore
Postato alle 9:45
Venerdì, 10/09/2010

apprezzo molto :)


Ingegnere Informatico
https://ldlagency.it
PM