+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Passare un riferimento form ad un modulo

  1. #1
    bertelli.davide non è in linea Scolaretto
    Obiettivo: Apertura di più istanze di un form.


    Maschera "Main menu"
    Pulsante di comando "Open form client", nome elemento "Comando1", evento click:

    Private Sub Comando1_Click()
         mod_Main.OpenAClient (Form_Client)
    End Sub
    
    Modulo "mod_Main"

    Option Compare Database
    Public clnClient As New Collection
    
    Function OpenAClient(ByVal myFrm As Form)
       
        Dim frm As Form
    
        'Apre una nuova istanza, la visualizza e definisce la proprietà Caption.
        Set frm = New myFrm
        frm.Visible = True
        frm.Caption = frm.hwnd & ", aperto il " & Now()
    
        'Aggiunge la nuova istanza alla collection.
        clnClient.Add Item:=frm, Key:=CStr(frm.hwnd)
    
        Set frm = Nothing
    
    End Function
    
    In esecuzione al pressionare il pulsante di comando "Open form client"
    Messaggio di errore:
    Errore di run time 13
    tipo non corrispondente.

    che sto sbagliando?

    Grazie
    Ultima modifica di AntonioG; 06-08-2021 19:51  Motivo: I TAG CODE PER IL CODICE

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Se avessi citato anche la fonte originale da cui hai copiato e, modificato in modo errato il codice sarebbe stato più semplice, anche perchè nel codice originale mi pare fosse scritto giusto...!
    http://allenbrowne.com/ser-35.html

    Ipotiziamo che la tua Maschera si chiami [Impiegati], la MultiIstanza si ottiene gestendo una NUOVA ISTANZA dell'Oggetto specifico non usando un'istanza già esistente...!
    Dim frm As FORM_Impiegati
    Set frm = New FORM_Impiegati
    ...
    
    Quindi non puoi passare un'Istanza e pensare di Creare su questa una nuova Istanza...
    L'istanza la crei a partire dall'oggetto Fisico che è la Form Impiegati, accessibile da VBA con FORM_Impiegati.

    Per capirci se tu avessi una Classe chiamata [cls1] ed una sua Istanza [mC1] dove
    Dim mC1 As cls1
    Set mC1= New cls1
    
    Se devi creare la mC2 non parti dalla mC1... ma sarà
    Dim mC2 As cls1
    Set mC2= New cls1
    
    Per le Form è la medesima cosa, quindi la tua funzione dovrebbe essere più facilmente modificata così
    Function OpenAClient() as Long
        Dim frm As Form
        Set frm = New Form_Impiegati
        frm.Visible = True
        frm.Caption = frm.Hwnd & ", opened " & Now()
        clnClient.Add Item:=frm, Key:=CStr(frm.Hwnd)
        OpenAClient=frm.Hwnd
        Set frm = Nothing
    End Function
    
    Ultima modifica di @Alex; 09-08-2021 10:22 
    ℹ️ Leggi di più su @Alex ...

  3. #3
    bertelli.davide non è in linea Scolaretto
    Grazie Alex,
    Quello che hai scritto è molto chiaro.

    Evidentemento non ho esposto a dovere il mio problema.

    Vediamo se riesco.....

    Immagina una form di menu principale da dove posso aprire, attraverso l'evento click di un controllo treview, aprire uno dei 30 form possibili e che potrebbe essere necessario aprirne altri contemporaneamente e magari dello stesso form.
    Le possibilità che intuisco sarebbero:
    1 ) ripetere la stessa funzione che mi apre una nuova istanza del form 30 volte dove sostanzialmente cambierebbe solo il nome del form;
    2) Creare una funzione in un modulo (di classe?) che come parametro preveda il form (Oggetto) che si vuole aprire.

    Grazie in anticipo

  4. #4
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Se hai 10 Classi differenti e devi istanziarne potenzialmente 10 differenti devi ricorrere al MultiCasting.

    Questo è un tipico esempio di come puoi realizzare la cosa:
    Function OpenAClient(ByVal myFrm As Form)
        
        Dim frm As Form
     
        Select Case True
            Case TypeOf myFrm Is Form_Maschera1:  Set frm = New Form_Maschera1
            Case TypeOf myFrm Is Form_Maschera2:  Set frm = New Form_Maschera2
            Case TypeOf myFrm Is Form_Maschera3:  Set frm = New Form_Maschera3
        End Select
        frm.Visible = True
        frm.Caption = frm.hwnd & ", aperto il " & Now()
     
        'Aggiunge la nuova istanza alla collection.
        clnClient.Add Item:=frm, Key:=CStr(frm.hwnd)
     
        Set frm = Nothing
     
    End Function
    
    ℹ️ Leggi di più su @Alex ...

  5. #5
    bertelli.davide non è in linea Scolaretto
    Temevo che fosse questa l'unica soluzione.

    Grazie infinite

  6. #6
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Quote Originariamente inviato da bertelli.davide Visualizza il messaggio
    Temevo che fosse questa l'unica soluzione.

    Grazie infinite
    Non è una cosa da "Temere"... è la soluzione tecnica corretta... quindi ottima.
    ℹ️ Leggi di più su @Alex ...

  7. #7
    bertelli.davide non è in linea Scolaretto
    Concordo Alex......

    Ora però sono alle prese con un'altro problema....
    Ho sostituito:
    Select Case True
    Case TypeOf FormToOpen Is Form_Varianti: Set frm = New Form_Varianti
    Case TypeOf FormToOpen Is Form_Varianti_Dettaglio: Set frm = New Form_Varianti_Dettaglio
    End Select

    Con:
    Public Function OpenForm (FormToOpen as string) as long
    Dim frm As Form
    Select Case True
    Case FormToOpen = "Form_Varianti": Set frm = New Form_Varianti
    Case FormToOpen = "Form_Varianti_Dettaglio": Set frm = New Form_Varianti_Dettaglio
    end select
    frm.Filter = "Id = 3"
    frm.Visible = True
    clnForms.Add Item:=frm, Key:=CStr(frm.Hwnd)
    OpenForm=frm.hwnd
    Set frm = Nothing

    La funzione OpenForm mi ritorna l'handle del nuovo form. Questo mi serve per chiudere prima il "FormChild" giusto e poi il "FormPadre".
    Fino a qui funziona tutto.
    Quello che mi sembra che venga ignorato è "frm.Filter = "Id = n"" poichè si apre la maschera sempre sul primo record e non su quello impostato sul filtro.

    Grazie

    Risolto.... frm.Recordset.FindFirst "Id=3"
    Funziona ma non sono sicuro del metodo!
    Ultima modifica di bertelli.davide; 12-08-2021 02:18 

  8. #8
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Non è la stessa cosa... FindFirst non FIltra ma si sposta al Record indicato, quindi poi hai tutti i records disponibili.
    Filter Filtra, ma se non lo attivi con FILTERON=TRUE dopo averlo impostato non funziona.
    ℹ️ Leggi di più su @Alex ...

  9. #9
    bertelli.davide non è in linea Scolaretto
    Ora provo......

    Tieni presente che ho lo stesso problema con le proprietà:
    frm.AllowAdditions = False(True)
    frm.AllowDeletions = False(True)
    frm.AllowEdits = False(True)
    frm.DataEntry = False(True)

    Ancora grazie

  10. #10
    bertelli.davide non è in linea Scolaretto
    Si funziona....compresi gli allows...

    Grazie infinite

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Fare riferimento a checkbox di una form in stringa sql query
    Da Fedeciprova nel forum Visual Basic .Net
    Risposte: 11
    Ultimo Post: 29-04-2016, 14:54
  2. Riferimento ad un UserControl da un modulo di classe
    Da John Hawk nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 27-04-2012, 19:58
  3. Risolto: Passare form ad una sub
    Da giuseppe88 nel forum Visual Basic .Net
    Risposte: 13
    Ultimo Post: 07-10-2010, 13:33
  4. [VB6]Passaggio variabile da form a modulo
    Da Drake88 nel forum Visual Basic 6
    Risposte: 12
    Ultimo Post: 19-05-2008, 21:02
  5. Riferimento a Form con variabile
    Da blackrabbit nel forum Microsoft Word
    Risposte: 2
    Ultimo Post: 20-04-2007, 15:53