Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 25
  1. #11
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    203
    mmmm forse ho capito...dico FORSE

    cmq se il sonno me lo consente intanto proco con il cast...in caso con il tuo ultimo consiglio!

    tnks

  2. #12
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Originariamente inviato da S0nic
    mmmm forse ho capito...dico FORSE

    cmq se il sonno me lo consente intanto proco con il cast...in caso con il tuo ultimo consiglio!

    tnks
    l'errore che ti da, è dato dal fatto che il tuo form non espone il textBox1... probabilmente usi le proprietà generiche di Form (che ovviamente non comprende textbox1).


  3. #13
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    203
    Originariamente inviato da U235
    l'errore che ti da, è dato dal fatto che il tuo form non espone il textBox1... probabilmente usi le proprietà generiche di Form (che ovviamente non comprende textbox1).

    sai che così funziona ?!

    codice:
    Public Sub Start(ByVal MyForm As Object) Implements [Interface].Extension.Start
    
            Dim Button1 As New Button
    
            Button1.Location = New Point(87, 100)
            Button1.Size = New Size(75, 21)
            Button1.Text = "Button1"
            Button1.Visible = True
    
            MyForm.Controls("GroupBox1").Controls.Add(Button1)
    
        End Sub
    che ne pensi ?

  4. #14
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Originariamente inviato da S0nic
    sai che così funziona ?!

    codice:
    Public Sub Start(ByVal MyForm As Object) Implements [Interface].Extension.Start
    
            Dim Button1 As New Button
    
            Button1.Location = New Point(87, 100)
            Button1.Size = New Size(75, 21)
            Button1.Text = "Button1"
            Button1.Visible = True
    
            MyForm.Controls("GroupBox1").Controls.Add(Button1)
    
        End Sub
    che ne pensi ?
    certo , però così non stai tipicizzando, rischi errori...
    dovrai fare lo stesso per tutti i controlli, quindi se un domani cambi un nome ad un controllo, ti ritrovi a dover riscrivere tutti i plugin...

    secondo me, ti conviene impostarla un po diversamente


  5. #15

  6. #16
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Originariamente inviato da S0nic
    leggi quì: http://forum.html.it/forum/showthread/t-987380.html

    4° post
    Ciao, dicevi a me?
    intendevi il post di alka?
    in ogni caso l'ho letto, ma non ho capito perchè l'hai linkato

  7. #17
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    203
    si dicevo a te..

    l'ho linkato xkè li ho notato
    che si potrebbe attivare quella proprierà
    x bypassare tutto il tracchiggio del Controls

  8. #18
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Originariamente inviato da S0nic
    si dicevo a te..

    l'ho linkato xkè li ho notato
    che si potrebbe attivare quella proprierà
    x bypassare tutto il tracchiggio del Controls
    a beh ok, ma in ogni caso dentro il plugin non hai modo di vedere ne i campi pubblici ne le proprietà pubbliche aggiunte, se non importi in qualche modo il tipo del tuo form nell'interfaccia comune (extender), che esso sia sottoforma di interfaccia o di classe abstract o classe normale (che dovrai far ereditare al tuo form).

    comunque secondo me ti conviene far restituire da Start un tipo control e aggiungerlo dal codice del form.

  9. #19
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    203
    si ci avevo pensato...però
    io ho optato per i plugin in modo da non dover più modificare il programma principale

    però se passo su "Start" un controllo anche come optional
    in alcuni casi (se non erro) mi troverò costretto sempre a modificare il programma principale
    quando dovrò specificarlo...

  10. #20
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    Originariamente inviato da S0nic
    si ci avevo pensato...però
    io ho optato per i plugin in modo da non dover più modificare il programma principale

    però se passo su "Start" un controllo anche come optional
    in alcuni casi (se non erro) mi troverò costretto sempre a modificare il programma principale
    quando dovrò specificarlo...
    certo, ma non volevo dirti di non usare i plugin, volevo solo consigliarti un modo per evitare che modificando il programma principale, poi ti ritrovi a dover modificare anche tutti plugin.

    nel tuo scenario, stai ponendo nella dll i nomi dei controlli, e richiami quest'ultimi con i nomi all'interno del plugin compilato, oltretutto, lo stai facendo chiamando il nome del controllo direttamente tra i controlli del form, (se non ricordo male) in caso un controllo sia dentro un'altro controllo (es. dentro un tabcontrol) che sta nella form, richiamato direttamente tra i controlli diretti del form, ti genererebbe un errore in runtime perchè dovrestri chiamare prima il tabcontrol (che è quello che contiene il controllo che cerchi di chiamare), ecco perchè io ho usato il metodo .Find("nomeControllo",true) nell'esempio di prima per cercare il groupBox (true indica di cercare all'interno dei controlli del form).
    quindi ti basta spostare un controllo nel programma principale e scalarlo magari di livello (metterlo dentro un'altro controllo) o cambiare nome ad un controllo ecc. che ti ritroveresti a dover riscrivere anche i plugin.

    se invece tipicizzi, in caso di modifica, il tipo sarà sempre quello che determini tu nei membri che ereditano (nel form) dal tipo impostato nella dll comune che carica anche il plugin.

    ti faccio un esempio riportato alla tua situazione :

    DLL comune sia al plugin sia alla form :
    codice:
    Imports System.Windows.Forms
    
    Public Interface IExtender
        Sub Start(ByVal PropertyForm As IPropertyForm)
    End Interface
    
    Public Interface IPropertyForm
        Property Control As Control
        Property GroupBox1 As GroupBox
    End Interface
    qui ho voluto inserire 2 interfacce, la prima (IExtender) serve a chiamare dal form il metodo che crea un controllo e lo inserisce nel form stesso (anche se continuo a dire che sarebbe meglio pensarla in maniera differente ) ovvero Start, questo accetta un parametro di tipo IPropertyForm (la seconda interfaccia) che determina in questo caso in quali controlli verrà inserito il controllo creato. ho inserito 2 proprietà, la prima, GroupBox1, si riferisce direttamente ad un tipo GroupBox, che potrai tranquillamente implementare ed eventualmente sostituire dalla form SENZA dover riscrivere il plugin, il secondo, Control, l'ho inserito come prova di concetto, infatti se tu un domani dovessi decidere che i controlli dei tuoi plugin debbano andare in un TabControl (ad esempio), sarà sufficiente cambiare l'implementazione di tale proprietà del form SENZA modificare il plugin (ho usato la base Control appositamente per fare in modo che si possa usare qualsiasi controllo)

    ora ti mostro il plugin vero e proprio :

    codice:
    Imports TestDLLComune
    Imports System.Windows.Forms
    Imports System.Drawing
    
    Public Class Plugin1
        Implements IExtender
    
        Sub Start(ByVal PropertyForm As IPropertyForm) Implements IExtender.Start
    
            Dim Button1 As New Button
            Button1.Location = New Point(87, 100)
            Button1.Size = New Size(75, 21)
            Button1.Text = "Button1"
            Button1.Visible = True
            PropertyForm.GroupBox1.Controls.Add(Button1)
    
        End Sub
    
    End Class
    
    Public Class Plugin2
        Implements IExtender
    
        Sub Start(ByVal PropertyForm As IPropertyForm) Implements IExtender.Start
    
            Dim Button1 As New Button
            Button1.Location = New Point(87, 100)
            Button1.Size = New Size(75, 21)
            Button1.Text = "Button1"
            Button1.Visible = True
            PropertyForm.Control.Controls.Add(Button1)
    
        End Sub
    
    End Class
    come potrai notare, ci sono 2 plugin in realtà in questa stessa dll, questo solo per mostrarti come utilizzando la proprietà control (nella Plugin2) io ottengo lo stesso risultato della prima, ma inserendo il button prodotto in un controllo scelto dentro l'implementazione di IPropertyForm da parte del form, nel caso specifico ho voluto usare sempre un groupBox (groupBox2), ma avrei potuto mettere qualsiasi controllo(TabControl, Panel ecc.).

    ora la form :

    codice:
    Imports TestDLLComune
    Imports System.Reflection
    Imports System.IO
    
    Public Class Form1
        Implements IPropertyForm
    
        Public Property GroupBox1 As GroupBox Implements IPropertyForm.GroupBox1
            Get
                Return Me.GroupBoxTest
            End Get
            Set(ByVal value As GroupBox)
                Me.GroupBoxTest = value
            End Set
        End Property
    
        Public Property Control As Control Implements IPropertyForm.Control
            Get
                Return Me.GroupBox2
            End Get
            Set(ByVal value As Control)
                Me.GroupBox2 = value
            End Set
        End Property
    
        Sub New()
            InitializeComponent()
            Dim asm As Assembly
            For Each pluginDLL As String In Directory.EnumerateFiles(Application.StartupPath, "*.dll")
                asm = Assembly.LoadFile(pluginDLL)
                Dim typeList As Type() = asm.GetTypes().Where(Function(p) p.GetInterfaces().Contains(GetType(IExtender))).ToArray()
                For Each Type As Type In typeList
                    Dim pl As IExtender = Activator.CreateInstance(Type)
                    pl.Start(Me)
                Next
            Next
        End Sub
    End Class
    qui ho usato la reflection per creare un istanza di ogni classe trovata in ogni assembly che implementi l'interfaccia IExtender che risiede nella stessa cartelle dell'eseguibile. per ogni istanza creata viene chiamato il metodo start che crea il controllo e lo aggiunge al form passato come parametro, ovviamente il controllo creato viene inserito nel controllo stabilito dall'implementazione della IPropertyForm implentata dalla form.

    fammi sapere se ti è tutto chiaro.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.