Autore Topic: Comunicare tra due Form  (Letto 1638 volte)

Offline elia

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Comunicare tra due Form
« il: 04 Aprile 2015, 18:55:40 »
Da mesi sto cercando di risolvere un problema frustrante al massimo. Facciamo un esempio:

Io ho due Form chiamati Form1 e Form2
Io in Form1 metto una ListBox e poi in Form2 metto una TextBox ed un bottone. Ecco, quando premo quel bottone, vorrei che il contenuto della TextBox sia aggiunto alla ListBox. Questo si potrebbe fare anche in una sola finestra, ma io voglio che sia fatto così tra due finestre.

Qualcuno mi sa aiutare????

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #1 il: 04 Aprile 2015, 19:25:16 »
Poniamo il caso di avere un progetto, dunque, avente due Form: uno principale (FMain) e l'altro secondario (Form1).

Nel Form principale porremo questo codice:
Codice: gambas [Seleziona]
Public lb As ListBox   ' Dichiara una variabile pubblica di tipo "ListBox". Essendo "pubblica", potremo richiamare e gestire tale variabile anche dal Form secondario (Form1)


Public Sub Form_Open()

  Form1.Show    ' Mostra il Form secondario
  
  With lb = New ListBox(Me)   ' Crea effettivamente la ListBox sul Form principale impostando alcune caratteristiche
    .W = 200
    .H = 200
    .X = 100
    .Y = 100
  End With

End


Nel Form secondario porremo quest'altro codice:
Codice: gambas [Seleziona]
Public Sub Form_Open()
  
  Me.Center   ' All'apertura del Form secondario lo piazza al centro dello schermo
  
End


Public Sub Button1_Click()

  FMain.lb.Add(TextBox1.Text)   ' Individua, ripercorrendo la gerarchia, la variabile di tipo ListBox per gestirla (assegnandole il testo presente nella TextBox)

End
« Ultima modifica: 04 Aprile 2015, 19:43:11 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline elia

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #2 il: 04 Aprile 2015, 19:26:49 »
In Gambas2 giusto???

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #3 il: 04 Aprile 2015, 19:36:44 »
In Gambas2 giusto???

Io opero in Gambas-3.... ormai Gambas-2 è obsoleto.  :-\

Ad ogni modo ritengo che debba funzionare anche in Gambas-2, essendo istruzioni basilari e semplici.

Prova.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #4 il: 04 Aprile 2015, 20:08:50 »
...se vuoi inserire a mano sul Form principale la ListBox, evitando così di crearla da codice, puoi usare - per la sua successiva gestione - una variabile "pubblica" di tipo ListBox, alla quale assegnerai la ListBox medesima.

Nel Form principale porremo questo codice:
Codice: gambas [Seleziona]
Public lb As ListBox   ' Dichiara una variabile pubblica di tipo "ListBox". Essendo "pubblica", potremo richiamare e gestire tale variabile anche dal Form secondario (Form1)


Public Sub Form_Open()

  Form1.Show    ' Mostra il Form secondario
 
  lb = ListBox1   ' Assegnamo alla variabile di tipo "ListBox" la variabile "ListBox1"

End


Nel Form secondario porremo quest'altro codice:
Codice: gambas [Seleziona]
Public Sub Form_Open()
 
  Me.Center   ' All'apertura del Form secondario lo piazza al centro dello schermo
 
End


Public Sub Button1_Click()

  FMain.lb.Add(TextBox1.Text)   ' Individua, ripercorrendo la gerarchia, la variabile di tipo "object" per gestirla (assegnandole il testo presente nella TextBox)

End




.....oppure, volendo, al posto della variabile di tipo ListBox puoi usare una variabile di tipo Object, alla quale assegnerai la ListBox medesima.
In sostanza la ListBox potrà essere gestita anche attraverso quella variabile di tipo Object.

Nel Form principale porremo questo codice:
Codice: gambas [Seleziona]
Public ob As Object   ' Dichiara una variabile pubblica di tipo "Object". Essendo "pubblica", potremo richiamare e gestire tale variabile anche dal Form secondario (Form1)


Public Sub Form_Open()

  Form1.Show    ' Mostra il Form secondario
  
  ob = ListBox1   ' Assegnamo alla variabile di tipo "Object" la variabile "ListBox1"

End


Nel Form secondario porremo quest'altro codice:
Codice: gambas [Seleziona]
Public Sub Form_Open()
  
  Me.Center   ' All'apertura del Form secondario lo piazza al centro dello schermo
  
End


Public Sub Button1_Click()

  FMain.ob.Add(TextBox1.Text)   ' Individua, ripercorrendo la gerarchia, la variabile di tipo "object" per gestirla (assegnandole il testo presente nella TextBox)

End
« Ultima modifica: 04 Aprile 2015, 21:02:27 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #5 il: 04 Aprile 2015, 20:21:49 »
.....alcuni programmatori non amano le variabili di tipo "Pubblico", preferendo così il passaggio di dati attraverso la chiamata di sub-routine.

Se fai parte di tale schiera, puoi utilizzare quest'altro codice.

Nel Form principale porremo questo codice:
Codice: gambas [Seleziona]
Public Sub Form_Open()

  Form1.Show   ' Mostra il Form secondario

End


Public Procedure RiceveDati(dati As String)   ' Impostiamo la sub-routine atta a ricevere i dati provenienti dal Form secondario
 
  ListBox1.Add(dati)
 
End

...ma, come vedi, qualcosa di "Pubblico" anche in questo caso deve esserci.  ;D

Nel Form secondario porremo quest'altro codice:
Codice: gambas [Seleziona]
Public Sub Form_Open()
 
  Me.Center   ' All'apertura del Form secondario lo piazza al centro dello schermo
 
End


Public Sub Button1_Click()
 
  FMain.RiceveDati(TextBox1.Text)   ' Individua, ripercorrendo la gerarchia, ed invoca la sub-routine per passarle i dati di tipo stringa

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #6 il: 04 Aprile 2015, 20:43:28 »
md9327 e milio suggerirebbero senz'altro anche l'uso di un oggetto Observer e l'istruzione Event, con il quale appunto "osservare" la sollevazione di un Evento speciale da parte del Form secondario, quando si clicca sul Button per passare i dati.

Nel Form principale porremo questo codice:
Codice: gambas [Seleziona]
Public Sub Form_Open()  
  
  Dim ob As Observer

  Form1.Show   ' Mostra il Form secondario

  ob = New Observer(Form1) As "osserva"   ' Pone sotto osservazione il Form secondario e lo attribuisce ad un "Gruppo", rendendo così gestibili i suoi eventi.  
  
End


Public Sub osserva_InviaDati(dati As String)  ' Questa sub-routine verrà sollevata dall'istruzione "Event" del Form secondario
  
  ListBox1.Add(dati)
  
End



Nel Form secondario porremo quest'altro codice:
Codice: gambas [Seleziona]
Event InviaDati(s As String)


Public Sub Form_Open()
  
  Me.Center
  
End


Public Sub Button1_Click()

  Raise InviaDati(TextBox1.Text)   ' Solleva l'evento nella sub-procedura presente nel Form principale

End
« Ultima modifica: 06 Aprile 2015, 19:58:13 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #7 il: 04 Aprile 2015, 20:51:30 »
....ma, ovviamente, puoi sostituire la Classe Observer con Object.Attach().

Quindi nella Classe del Form Principale il codice sarà semplicemente così:
Codice: gambas [Seleziona]
Public Sub Form_Open()

   Form1.Show

   Object.Attach(Form1, Me, "osserva")   ' Come "Observer", anche questa istruzione attribuisce il Form secondario (Form1) ad un "Gruppo", rendendo così gestibili i suoi eventi.

End


Public Sub osserva_InviaDati(dati As String)
 
  ListBox1.Add(dati)
 
End



Nel Form secondario il codice resterà identico al caso precedentemente visto con Observer:
Codice: gambas [Seleziona]
Event InviaDati(s As String)  
 
 
Public Sub Form_Open() 
   
 Me.Center 
   
End 
 
 
Public Sub Button1_Click() 
 
 Raise InviaDati(TextBox1.Text)   ' Solleva l'evento nella sub-procedura presente nel Form principale 
 
End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #8 il: 05 Aprile 2015, 03:04:19 »
......potresti esperire anche la sollevazione di un evento specifico del Form principale al cambio della sua proprietà .Title ed assegnando alla proprietà .Tag del Form il valore da passare alla ListBox.
Questo però modificherà il titolo della finestra principale, ma con qualche accortezza (per esempio ponendo uno spazio iniziale ed finale) potresti renderlo non evidente.


Quindi nella Classe del Form Principale il codice sarà semplicemente così:
Codice: gambas [Seleziona]
Public Sub Form_Open()  

  Form1.Show

End


Public Sub Form_Title()   ' Quando viene cambiato la proprietà ".Title" del Form principale si scatena questo evento

  ListBox1.Add(Me.Tag)    ' Si assegna alla "ListBox" il contenuto della proprietà ".Tag" del Form principale

End



Nel Form secondario porremo quest'altro codice:
Codice: gambas [Seleziona]
Public Sub Form_Open()
 
  Me.Center
 
End

Public Sub Button1_Click()

  With FMain
    .Tag = TextBox1.Text
    .Title = " titolo "         ' Qui va il titolo della finestra (Form) principale con la semplice aggiunta di uno spazio all'inizio ed uno alla fine
  End With

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline elia

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #9 il: 05 Aprile 2015, 14:16:11 »
GRZ, Mi hai dato già molto più di quello che mi serviva. GRZ TANTE. CIAO :)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #10 il: 05 Aprile 2015, 19:57:55 »
Vorrei solo aggiungere relativamente all'ultima possibilità mostrata sopra che, se non vuoi utilizzare la modifica del titolo del Form principale, analogamente puoi utilizzare un oggetto qualsiasi, generato ma non definito nelle sue dimensioni, come nell'esempio che segue.

Nella Classe del Form Principale il codice sarà:
Codice: gambas [Seleziona]
Public ta As TextArea


Public Sub Form_Open()

  ta = New TextArea(Me) As "ta"
  
  Form1.Show()

End


Public Sub ta_Change()   ' Quando viene cambiato la proprietà ".Text" della TextArea, si scatena questo evento  
  
  ListBox1.Add(ta.Text)    ' Si assegna alla "ListBox" il contenuto della proprietà ".Text" della TextArea
  
End



Nel Form secondario porremo quest'altro codice:
Codice: gambas [Seleziona]
Public Sub Form_Open()  
      
  Me.Center  
      
End  
      
      
Public Sub Button1_Click()  
      
     FMain.ta.Text =TextBox1.Text
      
End
« Ultima modifica: 07 Aprile 2015, 11:12:04 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.151
  • Tonno verde
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #11 il: 06 Aprile 2015, 11:31:41 »
Ciao elia,
se non sono indiscreto, e naturalmente se non vuoi rispondermi fa lo stesso, mi puoi dire il motivo per cui usi Gambas2?
Già che ci sono ti indico questa discussione sui passaggi tra form a cui ho partecipato.
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #12 il: 06 Aprile 2015, 17:49:01 »
Interessante anche questa discussione nel forum spagnolo:

http://www.gambas-es.org/viewtopic.php?t=4506
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline elia

  • Gamberetto
  • *
  • Post: 25
    • Mostra profilo
Re: Comunicare tra due Form
« Risposta #13 il: 11 Maggio 2015, 17:50:29 »
Grazie Ragazzi, mi ha avete dato tante se non troppe informazioni sulla discussione ;D
Vi Ringrazio e ho aggiornato gambas2 a gambas3. Ora sto molto meglio ;D
Ciao