Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Visual Basic 6 - controlli su un form multi istanza
Forum - Visual Basic 6 - controlli su un form multi istanza - Pagina 3

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Carlo (Member)
Guru


Messaggi: 1314
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:16
Martedì, 10/03/2020
Goblin, non so se il tuo esempio possa essere utile a iz1kbp, spero di si, poi lui ci dirà. :-?

Ho comunque scritto un esempio in VB6 che dovrebbe risolvere, le multi istanze, che potrebbe permettere di riciclare i vecchi codici VB6.
L'esempio è terra terra, va sviluppato in base alle esigenze, mostra solo come aprire più istanze dello stesso programma. Ad ogni apertura la nuova istanza si autoassegna un nuovo ID e usa questo ID per salvare lo stato del programma in un file testo univoco solo per quell'ID, nell'esempio lo stato del programma è rappresentato dal contenuto testo di una Text.
Puoi usare il codice VB6, devi aggiungere il riferimento MICROSOFT SCRIPTING RUNTIME, mettere una label, un bottone e una text nel form:

Codice sorgente - presumibilmente VB.NET

  1. Dim ComunicazioneID As String ' percorso e nome del file che contiene l'ultimo ID
  2. Dim NomeDelProgramma As String ' nome dell'eseguibile
  3. Dim StatoID As String ' percorso e nome del file composto con l'ID
  4. Dim ID As Integer ' ID attuale
  5. Dim Fso As New FileSystemObject 'necessita riferimento MICROSOFT SCRIPTING RUNTIME
  6.  
  7. Private Sub Command1_Click()
  8.     ' salvo il testo in textbox, ma tu salverai lo stato del tuo pannello
  9.     ' il nome del file sarà univoco perché composto con l'ID
  10.     Open StatoID For Output As #3
  11.     Print #3, Text1.Text
  12.     Close #3
  13. End Sub
  14.  
  15. Private Sub Form_Load()
  16.  
  17.    ' trovo il nome dell'exe
  18.    NomeDelProgramma = App.EXEName & ".exe"
  19.    
  20.    'nella directory dell'exe creo un file dove ci sarà salvato l'ultimo ID
  21.     ComunicazioneID = App.Path & "\ComunicazioneID.txt"
  22.    
  23.     ' controllo se il programma è in esecuzione
  24.      If App.PrevInstance = True Then
  25.         ' programma in esecuzione assegno un ID progressivo
  26.         If Fso.FileExists(ComunicazioneID) Then
  27.             Open ComunicazioneID For Input As #1
  28.             Input #1, leggi
  29.             Close #1
  30.             ' aggiungo 1 all'ID presente nel file
  31.             If IsNumeric(leggi) Then
  32.                 ID = leggi + 1
  33.             End If
  34.             ' risalvo con l'ID aggiornato
  35.             Open ComunicazioneID For Output As #2
  36.             Print #2, ID
  37.             Close #2
  38.             ' aggiorno le variabili in accordo con l'ID creato
  39.             StatoID = App.Path & "\StatoID" & Trim(Str(ID)) & ".txt"
  40.             Label1.Caption = StatoID
  41.             Form1.Caption = "ID = " & ID
  42.         End If
  43.     Else
  44.         ' nessun altra istanza del programma in esecuzione, ID = 1
  45.         ' sovrascrivo o creo un file che contiene 1
  46.         Open ComunicazioneID For Output As #2
  47.         ID = 1
  48.         Print #2, ID
  49.         Close #2
  50.         ' aggiorno le variabili in accordo con l'ID creato, 1 la prima volta
  51.         StatoID = App.Path & "\StatoID" & Trim(Str(ID)) & ".txt"
  52.         Label1.Caption = StatoID
  53.         Form1.Caption = "ID = " & ID
  54.     End If
  55.     ' controllo se con l'ID corrente esiste già un salvataggio
  56.     If Fso.FileExists(StatoID) Then
  57.         ' se esite lo leggo
  58.         Open StatoID For Input As #1
  59.         Input #1, leggi
  60.         Close #1
  61.         ' lo mostro nella textbox
  62.         Text1.Text = leggi
  63.     End If
  64.    
  65. End Sub



in allegato progetto completo in VB6


Carlo ha allegato un file: MIXERluci.zip (6749 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 10/03/2020 alle 17:52


in programmazione tutto è permesso
PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 17:51
Martedì, 10/03/2020
Testo quotato

Postato originariamente da Carlo:

Goblin, non so se il tuo esempio possa essere utile a iz1kbp, spero di si, poi lui ci dirà. :-?




Questo lo ignoro pure io ... il demo che ho imbastito è in base alle info che "mi sembra" di aver capito, ma dopo aver visto il tuo codice ... credo di non aver capito niente :om::om:
La logica che ho seguito è registrare, in una lista, una sequenza di click su una "tastiera virtuale" (bottoni) e salvarla con un nome... id... quello che volete, in modo da averla a disposizione per le future tastiere, e sino a qui tutto resta in memoria, dunque è relativamente semplice si hanno i vari puntatori ai relativi bottoni, quando vado a scrivere queste sequenze nel file .dat oltre al nome dello schema e alla sequenza di bottoni ho salvato i "componenti" bottoni selezionati, in questo modo quando viene richiamata la sequenza è più semplice eseguire i vari comandi in quanto si conosce "l'istanza" da dove arriva il comando.
G.


Ibis redibis non morieris in bello
PM Quote
Avatar
iz1kbp (Normal User)
Rookie


Messaggi: 26
Iscritto: 29/02/2020

Segnala al moderatore
Postato alle 18:19
Martedì, 10/03/2020
Ciao Carlo, Ciao Goblin...
un attimo, stiamo andado fuori dal seminato.
provo a fare un piccolo esempio e poi lo posto...;)

Ultima modifica effettuata da iz1kbp il 10/03/2020 alle 21:26
PM Quote
Avatar
iz1kbp (Normal User)
Rookie


Messaggi: 26
Iscritto: 29/02/2020

Segnala al moderatore
Postato alle 21:12
Martedì, 10/03/2020
Ciao Carlo, Ciao Goblin
ho fatto questo piccolo esempio in vb6 per far capire il mio problema in maniera piu pratica.
Ho due form , uno da duplicare con al'interno due comandi (2 pulsante e 2 label, il pulsante semplicemente scrive un numero nella label), ed uno master che deve creare copie del precedente ,inoltre al suo interno cè un pulsante che deve far partire la procedura del bottone 1 che si trovera nel form duplicato numero 1 (ma potrebbe esser il 2 o altri).
Il mio problema è che il comando di questo bottone
NewPage(1).Command1_Click
non fa partire nessuna procedura e non da nessun errore...semplicemente non fa nulla.

Leggendo in giro qualcuno parla di moduli di classe...ma sinceramente non li ho mai usati e non so come funzionano.

Mi potete dare delle dritte?
Mario


iz1kbp ha allegato un file: MultiInst.zip (3456 bytes)
Clicca qui per scaricare il file
PM Quote
Avatar
iz1kbp (Normal User)
Rookie


Messaggi: 26
Iscritto: 29/02/2020

Segnala al moderatore
Postato alle 22:32
Martedì, 10/03/2020
RISOLTO.

Leggendo un vecchio manuale di vb6 ho letto una cosa interessante sulle multi istanze: la proprieta TAG dei form.

ho riscritto parte del codice postato prima , nella form LANCIO.
Ora man mano che creo i form li indiizzo con il tag in modo da renderli univochi e reperibili anche come controlli.

Dal form principale,in questo caso, ho voluto comandare i controlli del form riaperto per la terza volta.Cambiando il numero del frm.tag indirizzo l'istanza che volgio e leggo lo stato del controllo sull'istanza scelta.

E' stata dura....ma ce l'ho fatta! ora devo modificareil mio programma con questa procedura...ma penso che sia abbastanza semplice (forse)!

comuque grazie a tutti.:k::k:

questo il codice cambiato nel form LANCIO


Private Sub cmdNew_Click()
Dim myForm As Form
    Set myForm = New frmMain 'Creo nuova istanza del form
    With myForm
        .Tag = Pages
        .Show
        .Caption = ">> numero tag" & Pages
        Pages = Pages + 1
    End With
    Set myForm = Nothing 'pulisci i ltutto
End Sub

Private Sub Command1_Click()
Dim frm As Form
    For Each frm In Forms
        If frm.Tag = "3" Then 'lvoglio interagire con il terzo form aperto...ma puo essere anche una'altro....
            frm.Text1 = "ciao"  ' scrivo
            frm.Text2 = "ok2"  ' idem cs
            frm.Command1_Click  ' qui comando il controllo da "remoto"
           frmlancio.Label1 = frm.Text1.Text ' qui vado a catturare il testo di una label e la riporto nella principale
            Exit For
        End If
    Next frm
End Sub

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1314
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 23:25
Martedì, 10/03/2020
l'errore lo avevi fatto perché cancellavi la matrice che conteneva i form, il tuo vecchio codice funziona, guarda l'allegato :asd:
scegli tu quale ti piace di più. :asd:
il tag è una proprietà di tutti i controlli non solo del form. :asd:


Carlo ha allegato un file: MultiInst.zip (8511 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 11/03/2020 alle 14:37


in programmazione tutto è permesso
PM Quote
Avatar
iz1kbp (Normal User)
Rookie


Messaggi: 26
Iscritto: 29/02/2020

Segnala al moderatore
Postato alle 8:57
Mercoledì, 11/03/2020
Grazie Carlo,
si...molto piu snello!!

Ho visto ora...si,il tag è comune ma non l'ho mai usato e ne ignoravo l'esistenza e l'uso.
Chissa quante altre proprieta esisteno gia ma io me le sono autocostruite ,complicandomi la vita,ignorandone l'esistenza.
Si chiama esperienza...
grazie a tutti.

:k::k::k::k:;)

Mario

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo