Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
01/09/10 13:31
gl1963
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. :)

aaa
01/09/10 14:03
HeDo

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.
aaa
02/09/10 7:03
gl1963
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. :):):)

    Public Sub ResizeColListView(ByVal lnList As ListView)

        Dim wkII As Integer
        Dim wkJJ As Integer
        Dim wkLbl As New Label

        wkLbl.AutoSize = True

        For wkII = 0 To lnList.Columns.Count - 1
            wkLbl.Text = lnList.Columns(wkII).Text
            lnList.Columns(wkII).Width = (wkLbl.Width + 10)
        Next

        For wkII = 0 To lnList.Items.Count - 1
            wkLbl.Text = lnList.Items(wkII).Text.ToString
            If (wkLbl.Width + 10) > lnList.Columns(0).Width Then
                lnList.Columns(0).Width = (wkLbl.Width + 10)
            End If
            For wkJJ = 1 To lnList.Columns.Count - 1
                wkLbl.Text = lnList.Items(wkII).SubItems(wkJJ).Text.ToString
                If (wkLbl.Width + 10) > lnList.Columns(wkJJ).Width Then
                    lnList.Columns(wkJJ).Width = (wkLbl.Width + 10)
                End If
            Next
        Next

        wkLbl.Dispose()

    End Sub
aaa
02/09/10 7:13
HeDo

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: forum.masterdrive.it/visual-basic-net-tutorials-and-how-to-36/extension-methods-44007/

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

lwTest.ResizeColListView(3, 4);

aaa
02/09/10 7:32
gl1963
Per adesso grazie mille. Ora faccio un po' di prove.

Ciao 8-|8-|
aaa
10/09/10 7:39
gl1963
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 :

Public Class ClasseDllVB

    Dim wkValore1 As String = ""
    Dim wkValore2 As String = "stringa in sola lettura"
    Dim wkValore3 As String = ""

    Public Property Prop1String()

        Get
            Return wkValore1
        End Get

        Set(ByVal value)
            wkValore1 = value
        End Set

    End Property

    Public ReadOnly Property Prop2String()

        Get
            Return wkValore2
        End Get

    End Property

    Public WriteOnly Property Prop3String()

        Set(ByVal value)
            wkValore3 = value
        End Set

    End Property

    Public Sub Metodo1(ByVal Parametro1 As String, ByVal Parametro2 As Integer)

        Windows.Forms.MessageBox.Show("Metodo1 della DLL VB, Parametro1=" & Parametro1 & ", Parametro2=" & Parametro2.ToString)

    End Sub

    Public Function Metodo2() As String

        Windows.Forms.MessageBox.Show("Metodo2 della DLL VB, restituisce " & wkValore3 & " in minuscolo", "Messaggio", Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Information)

        Metodo2 = wkValore3.ToLower

    End Function

End Class


PROGRAMMA CHIAMANTE :
    Private Sub RichiamaDllVB()

        Dim wkNomeDll As String
        Dim wkNomeClasse As String

        Dim wkII As Int16
        Dim wkDLL As System.Reflection.Assembly
        Dim wkClasse As Object
        Dim wkProprieta As System.Reflection.PropertyInfo
        Dim wkMetodo As System.Reflection.MethodInfo
        Dim wkParametro() As System.Reflection.ParameterInfo
        Dim wkParametriDelMetodo() As Object
        Dim wkStringa As String

        wkNomeDll = "DllVB"
        wkNomeClasse = "ClasseDllVB"

        ' carica la DLL
        Try
            wkDLL = System.Reflection.Assembly.LoadFrom(wkNomeDll & ".dll")
        Catch ex As Exception
            MessageBox.Show("Errore caricamento DLL" & vbLf & ex.Message, wkNomeDll & ".Dll", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

        ' istanzia la classe
        wkClasse = wkDLL.CreateInstance(wkNomeDll & "." & wkNomeClasse)

        ' carica il metodo "Metodo1"
        Try
            wkMetodo = wkClasse.GetType.GetMethod("Metodo1")
        Catch ex As Exception
            MessageBox.Show("Errore lettura metodo (nome classe errato)" & vbLf & ex.Message, wkNomeDll & ".Metodo1", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

        ' visualizza nome e tipo dei parametri del metodo
        Try
            wkParametro = wkMetodo.GetParameters()
        Catch ex As Exception
            MessageBox.Show("Errore lettura parametri (nome metodo errato)" & vbLf & ex.Message, wkNomeDll & ".Metodo1", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try
        For wkII = 0 To wkParametro.Length - 1
            MessageBox.Show((wkII + 1).ToString & "° parametro : Nome=" & wkParametro(wkII).Name & ", Tipo=" & wkParametro(wkII).ParameterType.ToString)
        Next

        ' inizializza i parametri del metodo
        wkII = wkMetodo.GetParameters.Length - 1
        ReDim wkParametriDelMetodo(wkII)
        wkParametriDelMetodo(0) = "parametro stringa"
        wkParametriDelMetodo(1) = 12345

        ' esegue il metodo
        wkMetodo.Invoke(wkClasse, wkParametriDelMetodo)

        ' imposta la proprietà  "Prop3String"
        '   (variabile "wkValore3" all'interno della DLL)
        Try
            wkProprieta = wkClasse.GetType.GetProperty("Prop3String")
            wkProprieta.SetValue(wkClasse, "ABC", Nothing)
        Catch ex As Exception
            MessageBox.Show("Errore impostazione proprietà " & vbLf & ex.Message, wkNomeDll & ".Prop3String", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

        ' carica ed esegue il metodo "Metodo2" (funzione di tipo stringa che non ha parametri)
        '   (restituisce variabile "wkValore3" in minuscolo)
        Try
            wkMetodo = wkClasse.GetType.GetMethod("Metodo2")
            wkStringa = wkMetodo.Invoke(wkClasse, Nothing)
        Catch ex As Exception
            MessageBox.Show("Errore lettura metodo (nome classe errato)" & vbLf & ex.Message, wkNomeDll & ".Metodo2", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End Try

        ' la variabile "wkStringa" ora contiene "abc"
        MessageBox.Show(wkStringa)

    End Sub


Spero che sia abbastanza chiaro e che possa esserti utile

Ciao :)
aaa
10/09/10 7:45
HeDo

apprezzo molto :)
aaa