Gambas-it

Gambas3 => Programmazione => Topic aperto da: tornu - 20 Dicembre 2014, 18:52:29

Titolo: [RISOLTO] Passaggio dati tra due Form
Inserito da: tornu - 20 Dicembre 2014, 18:52:29
Buonasera a tutti,
scusate se apro una discussione già trattata e ritrattata in varie forme, ma di tutte quelle che ho letto sul Forum
nessuna mi ha illuminato (salvo non aver capito come applicarla, in tal caso chiedo anticipatamente scusa) riguardo
una funzione "stupida" di passaggio dati tra due Form come quella che voglio ottenere io, ed essendomi a forza di provare
e riprovare incartato, chiedo un vostro aiuto.
Vi allego due esempi che vi fanno capire in modo eplicito quello che voglio ottenere.
L' esempio 1 funziona perfettamente (serve solo come spiegazione), a me serve implementare l'esempio 2 che non sono riuscito a far funzionare.

Titolo: Re: Passaggio dati tra due Form
Inserito da: vuott - 20 Dicembre 2014, 20:50:18
1) Nell'uso di funzioni da richiamare fra Classi e Moduli è opportuno attribuire un nome privo di trattino in basso.

Pertanto nella Classe Form2.class bisognerà modificare la funzione passdati() come segue:
Codice: gambas [Seleziona]
Private Sub passdati(string1 As String, string2 As String)

  Form1.PassaDati(string1, string2)
 
End


così, nella Classe Form1.class la funzione passa_dati() assumerà il nome: PassaDati()


2) nella funzione PassaDati() della Classe Form1.class il Form1 va richiamato attraverso la sua variabile di tipo Form1, dichiarata e creata nella Classe principale. La proprietà .Text del TextBox va utilizzata ripercorrendo l'intera gerarchia.
Pertanto questa funzione sarà così modificata:
Codice: gambas [Seleziona]
Public Sub PassaDati(dato1 As String, dato2 As String)
 
  FMain.Frm1.TextBox1.Text = dato1
  FMain.Frm1.TextBox2.Text = dato2

End



3) La dichiarazione della variabile di tipo Form1 va posta come Globale e Pubblica:
Codice: gambas [Seleziona]
Public Frm1 As Form1
Titolo: Re: Passaggio dati tra due Form
Inserito da: Picavbg - 20 Dicembre 2014, 22:53:02
scusate se apro una discussione già trattata e ritrattata in varie forme.......

Vi allego due esempi che vi fanno capire in modo eplicito quello che voglio ottenere.
L' esempio 1 funziona perfettamente (serve solo come spiegazione), a me serve implementare l'esempio 2 che non sono riuscito a far funzionare.

Il passaggio di dati fra due Form funziona sia in fase di chiamata del nuovo Form, sia al rientro da esso. Occorre però compilare la tabella dei parametri da passare. Il metodo è ampiamente dettagliato qui (http://www.gambas-it.org/smf/index.php?topic=1374.msg15709#msg15709).

Ho guardato il tuo Esempio2 ed ho notato che usi solo in parte il metodo spiegato nel suindicato link. Secondo me, riguardandolo, dovresti risolvere.
 :ciao:
Titolo: Re: Passaggio dati tra due Form
Inserito da: tornu - 21 Dicembre 2014, 00:05:07
Ho guardato il tuo Esempio2 ed ho notato che usi solo in parte il metodo spiegato nel suindicato link. Secondo me, riguardandolo, dovresti risolvere.
 :ciao:
Come ho premesso nel post di apertura sicuramente nel leggere i vari messaggi a riguardo, compreso quello che tu mi hai
indicato qualche passaggio mi è sfuggito o non ho ben compreso. Comunque con le indicazioni di vuott ho risolto.
Grazie
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 24 Dicembre 2014, 18:00:32
Ciao Tornu,
guardando un po al passato ho constatato che non è la prima volta che ti “picchi” con questi concetti. Questo mi ha permesso di comprendere che anche io non capivo. :)

Ho fatto un paio di esperimenti che sottopongo a te e a tutti gli uomini e donne di buona volontà per avere dei pareri così se vorrete potrete evitarci delle brutte figure con la stesura del libro.

Sembra proprio che le finestre siano delle classi speciali, infatti puoi aggiungere delle proprietà senza il bisogno di ereditarle. Anzi pare proprio che non si debbano ereditare.

Posto e allego due esempi, il secondo prende spunto da quanto suggerito da vuott, il primo ricorre come detto alle proprietà.

In tutti e due gli esempi occorre creare due finestre la FMain con due label riquadrate e testo centrale rinominate rispettivamente lblNome e lblCognome e un pulsante non rinominato (Button1).
La seconda finestra rinominata Form2 con due TextBox (1 e 2) e un Pulsante (Button1).

Questo il codice del primo esempio (per i principianti rammento che non bisogna cancellare questa scritta dal modulo di classe: ' Gambas class file):

Codice Finestra Fmain:
Codice: gambas [Seleziona]

' Esponendo queste proprietà consentiamo alle altre finestre
' di inviarci dei dati che possiamo controllare prima di esporli.
' NB: In qualunque modo noi cambieremo in futuro il controllo
' interno dei dati questo non inciderà sul passaggio stesso.

Property sNome As String
Property sCognome As String
Private $sNome As String
Private $sCognome As String


Public Sub _new()

End

Public Sub Form_Open()
  Me.Center
End


Private Function sNome_Read() As String
  
  ' Restituisce il valore controllato da Write.
  Return $sNome
 
End

Private Sub sNome_Write(Value As String)

  ' Legge il valore, lo controlla (!?) per poterlo restituire corretto
  If Value <> "" Then
    $sNome = Value
  Else
    $sNome = "#Dato mancante"
  Endif
  
End

Private Function sCognome_Read() As String

  Return $sCognome
  
End

Private Sub sCognome_Write(Value As String)

  If Value <> "" Then
    $sCognome = Value
  Else
    $sCognome = "#Dato mancante"
  Endif
  
End


Public Sub Button1_Click()
  
  ' La finestra in modalità dialogo (ShowDialog) o modale (ShowModal) stessa cosa significa che fino a quando non l'abbiamo chiusa
  ' non permetterà al programma di andare avanti. Questo metodo termina solo quando la finestra è chiusa, e il valore intero
  ' passato al metodo Close viene restituito.  
  
    Form2.ShowDialog    
    
    '' NB: Se noi passiamo una finestra non modale queste istruzioni
    '' non verranno eseguite.
    
    lblNome.Text = Me.sNome
    lblCognome.Text = Me.sCognome
    
End

Codice Finestra Form2:
Codice: gambas [Seleziona]

Public Sub Form_Open()
  
  Me.Center
  
End

Public Sub Button1_Click()

  Me.Close

End

Public Sub Form_Close()
  
' Usiamo il metodo Close per passare i dati comunque,
' anche in caso di chiusura della finestra.
 With FMain
  .sNome = TextBox1.Text
  .sCognome = TextBox2.Text
 End With
 
  
End

E questo il secondo esempio:

Codice finestra Fmain:

Codice: gambas [Seleziona]

Public Sub Form_Open()
  Me.Center
End

Public Sub Passameli(sNome As String, sCognome As String)
  
  lblNome.Text = sNome
  lblCognome.Text = sCognome
  
End

Public Sub Button1_Click()
  
  ' La finestra in modalità dialogo (ShowDialog) o modale (ShowModal) stessa cosa significa che fintanto che non l'abbiamo chiusa
  ' non permetterà al programma di andare avanti. Questo metodo termina solo quando la finestra è chiusa, e il valore intero
  ' passato al metodo Close viene restituito..

  ' La finestra in modalità normale (Show) è senza priorità.
  ' NB: Se la finestra già aperta è modale, allora la finestra verrà
  ' visualizzata comunque in modalità modale anche se chiamata con Show.
  
    'Form2.ShowDialog    
    Form2.Show
 
End

Questo il codice della finestra Form2:
Codice: gambas [Seleziona]


Private $sNome As String
Private $sCognome As String

Public Sub Form_Open()
  
  Me.Center
  
End



Private Sub Nome()

  ' Legge il valore della textbox, lo controlla (!?) per poterlo restituire corretto
  
  If TextBox1.Text <> "" Then
    $sNome = TextBox1.Text
  Else
    $sNome = "#Dato mancante"
  Endif
 
End


Private Sub Cognome()

  If TextBox2.Text <> "" Then
    $sCognome = TextBox2.Text
  Else
    $sCognome = "#Dato mancante"
  Endif
 
End

Public Sub Button1_Click()

    Me.Close

End

Public Sub Form_Close()  
    
    ' Usiamo il metodo Close per passare i dati comunque
    ' anche in caso di chiusura della finestra.
    
    ' Chiamiamo i metodi che controllano le textbox e
    ' restituiscono il valore alle variabili private
    Nome()
    Cognome()
    ' Passiamo direttamente il valore alle label
    ' della FMain attraverso il metodo pubblico.
    FMain.Passameli($sNome, $sCognome)
    
End

Lo so è un post molto lungo e visto gli allegati lo potevo risparmiare ma credo ci siano gamberetti timidi che prima di iscriversi vogliono capire un po quindi...

Ora però vado ad ubriacarmi e ad ingozzarmi... Buona Vigilia a Tutti.
 :ciao:
PS: Mi sono scordato di precisare che tu questo lo sai già fare, era che volevo metterlo giù per il libro. Se torno sobrio poi studio il tuo caso con quello che qui è stato già detto.
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 25 Dicembre 2014, 00:23:37
Ciao ragazzi,
essendo stato moderato col vino (neanche 4 quartini) vi posso aggiornare sul codice precedente per ottenere il passaggio di dati fra tre form (In effetti come giustamente dice il titolo il passaggio è fra 2 con coinvolta la FMain)  cambiando leggermente i progetti PassaggioFraFinestre_1 e  2 :
L'attuale FMain diventa Form1
Aggiungiamo una form al programma rinominandola Fmain facendola diventare Classe di avvio. Quindi scriviamo al suo interno questo codice:

Codice: gambas [Seleziona]

Public Frm1 As Form1


Public Sub Form_Open()  
    
  Frm1 = New Form1(FMain) As "Frm1"
  FMain.Title = "Form1"
  Me.Center
  
End


Poi solo in PassaggioFraFinestre_1 occorre:
La Form1 ex Fmain rimane invariata e nella Form2 andiamo a inserire nel metodo di chiusura
Codice: gambas [Seleziona]

With Fmain.Frm1 'al posto del solo With FMain


lasciando invariato il resto del codice.

Invece per PassaggioFraFinestre_2 occorre:
La Form1 ex Fmain rimane sempre invariata e nella Form2 andiamo a inserire sempre nel metodo di chiusura il riferimento Frm1 fra FMain e Passameli così:
Codice: gambas [Seleziona]

FMain.Frm1.Passameli($sNome, $sCognome)


Bene ora che mi sono svegliato vado a dormire.  :sleepy:
 :ciao:
PS: Malgrado lo credessi non ero poi così sobrio :).
Ti vorrei chiedere se mi puoi spiegare il motivo che ti spinge a “camuffare” una form per un'altra.
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 25 Dicembre 2014, 11:07:53
@ Gianluigi

In tutta questa discussione il cui titolo si riverisce, almeno così ho capito, al passaggio di dati fra Form che, secondo me, significa: passaggio di dati dal Form chiamante al Form chiamato e viceversa, a chiusura del form chiamato, non ricordo che detto dettaglio, molto importante, sia stato indicato compiutamente.
Se tu però devi affrontare l'argomento nel libro a cui accenni, sarebbe bene che approfondissi il concetto, in quanto senza il giusto metodo, non ordinario,  non è possibile ricevere di ritorno dal Form chiamato dati da riprendere per utilizzarli nel proseguimento del flusso di istruzioni successive alla chiamata del Form appena dismesso.
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 25 Dicembre 2014, 18:47:23
@Picavbg

Intanto grazie per il suggerimento,  :)
purtroppo forse anche a causa delle eccessive libagioni oltre che del mio scarso grado di comprendonio non ho capito appieno il tuo consiglio.
Ti stai riferendo ai dati di ritorno da Form2 a Form1? Oppure intendi che non si è parlato del passaggio di dati da Form1 a Form2?
Se comunque ti fa piacere potresti completare tu l'esempio da me postato con la parte mancante, non potrei che ringraziarti.

 :ciao:

PS: Certo che essere qui a parlare di Gambas anche a Natale la dice ... insomma non diciamolo in giro.
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: tornu - 25 Dicembre 2014, 19:23:21
Salve ragazzi,
in una pausa del magna magna e bevi bevi odierno, ho acceso il pc e dato uno sguardo al Forum e ho visto con piacere
che questo post si è ampliato con considerazioni interessanti.
Ciao Tornu,
guardando un po al passato ho constatato che non è la prima volta che ti “picchi” con questi concetti. Questo mi ha permesso di comprendere che anche io non capivo. :)
Si è vero, e tuttora il concetto non mi è chiaro completamente.

@ Gianluigi

In tutta questa discussione il cui titolo si riverisce, almeno così ho capito, al passaggio di dati fra Form che, secondo me, significa: passaggio di dati dal Form chiamante al Form chiamato e viceversa, a chiusura del form chiamato, non ricordo che detto dettaglio, molto importante, sia stato indicato compiutamente......
 :ciao:
Hai capito perfettamente ciò che chiedevo.

Ti vorrei chiedere se mi puoi spiegare il motivo che ti spinge a “camuffare” una form per un'altra.
Non ho capito, puoi essere più esplicito.

Provo a spiegare le "difficoltà/neccessità" in cui finora mi sono imbattuto:

1) Se devo passare dati tra due semplici Form, uno principale (impostata come classe di avvio) chiamante una secondaria dove elaboro dei dati che
    alla sua chiusura passo alla Form principale, non ho problemi in vari modi riesco ad ottenere il risultato.

2) Questo il caso per cui ho chiesto aiuto al Forum aprendo questo post:
    Una Form principale (impostata come classe di avvio), che fà da contenitore alla Form1 e alla Form2 richiamata dalla Form1 quando neccessario.
    La Form1 richiama la Form2 in cui inserisco/elaboro dei dati che alla sua chiusura deve passare alla Form1.Ora con il vostro aiuto sono riuscito ad
    ottenere ciò che volevo, però incuriosito da Pcavbg che mi ha indicato la possibilità di poter utilizzare il metodo sia in "andata" che in "ritorno" non
    sto riuscendo ad implementaro, anche leggendo il link da lui segnalatomi. Continuo a provare.

3) Dalla mia piccola esperienza penso di aver capito che finchè si tratta di due semplici Form "pulite" ci sono vari metodi abbastanza semplici per
    passare dati dall'una all'altra. La cosa si complica un pochino (almeno per me) quando le Form cominciano ad essere più di due e contengono
    Panel, TabStrip, ect... o Form "annidate" l'una dentro l'altra, ed in questi casi che le mie difficoltà cominciano.

P.S.: Naturalmente tutto ciò perchè non voglio assolutamente usare variabili globali, se non assolutamente neccessario.

Scusate la lungaggine....nel mentre ho cominciato a digerire.... :D
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 25 Dicembre 2014, 20:07:35
@Tornu

Finalmente ho capito! Scusa sai ma la mia poca pratica con Gambas me lo aveva impedito.
Oddio capito è un parolone ma ora credo di aver capito anche cosa mi diceva Picavbg.
Mo mi metto a studiare bene cosa dire, però così d'acchito direi che il primo esempio quello con le proprietà dovrebbe funzionare per tutte le esigenze
Comunque come detto vado a studiare però prendete il mio mo come domani, dopodomani... appena smaltito il tour de forse forse :D
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 25 Dicembre 2014, 23:50:02
Mi pare che ancora, pur essendo andati avanti coi ragionamenti e lo studio del materiale citato, non sia chiaro come costringere la form chiamata a restituire dati alla Form chiamante e come recepire detti dati quando la Form chiamante riprenderà il controllo del ciclo elaborativo.
Diciamo subito che il Form chiamante non deve essere necessariamente il FMain, ma può essere anche uno successivo, dipendente o meno dalla FMain. Il trucco per ottenere lo scambio dati sta nel tipo dati della variabile da passare al Form chiamato. Se i dati da passare e da ricevere indietro sono più di uno conviene costituire un array di un numero imprecisato di elementi. Essi saranno valorizzati al momento della chiamata e probabilmente non saranno di natura omogenea, percò:
Codice: [Seleziona]
Dim vDati As New Variant[]   

Dim iSwReturn as integer


Il secondo passo importante è quello di richiamare il costruttore della nuova classe FormX da chiamare:
Codice: [Seleziona]
  FrmX = New FormX(vDati)

seguito dalla classica istruzione di chiamata della Form, rispettando il seguente formato:
Codice: [Seleziona]
 iSwReturn = Frm7.showmodal()
dove iSwReturn conterrà un valore numerico utile per l'eventuale scelta successiva della funzione da sviluppare al rientro dal Form chiamato
In quest'ultima istruzione risiede la chiave risolutiva del meccanismo di andata e ritorno dei dati, perchè, al ritorno dal Form chiamato, l'array di partenza, vDati, conterrà non più i valori ceduti al programma chiamato, bensì quelli che quest'ultimo avrà modificato o anche aggiunto a quelli iniziali.

Supponiamo perciò di avere fornito due campi  coi seguenti valori
$Strimia = "andata"
iNum = 111
vDati.add($Strimia)
vDati.add(iNum)


Supponiamo ancora che il Form chiamato, nel corso della sua esecuzione, abbia modificato il contenuto di vDat[0] ed abbia aggiunto un valore booleano come terzo campo. Al rientro dalla chiamata del FormX l'array sarà così costituito:
vDati[0] = "ritorno"
vDati[1] = 111
vDati[2] = 0      'False
La prima istruzione dopo quella di chiamata della FormX sarà:
Codice: [Seleziona]
Select  Case iSwReturn
   Case 0
       print vDati[0]
   Case 1
       print vDati[1]
   Case 2
       print vDati[2]
End Select
Quello che occorre sviluppare dentro FormX è facile da intuire. Non credo perciò che valga la pena di illustrarlo.

Spero di avere dato il giusto aiuto per un corretto uso del metodo che ho imparato a suo tempo ed assimilato grazie alla paziente guida di md9327.
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 26 Dicembre 2014, 01:10:05
@Picavbg

Non so cosa mi è girato di guardare questa discussione prima di andare a dormire dopo essermi visto Downton Abbey (avete poco da sfottere a me piace molto :P).
Io mi scuso tanto con te ma non ho capito come il tuo codice si incastri con il mio.

Allego un programma che sulla falsariga di quanto richiesto da Tornu scambia i dati fra le TextBox di due form incorporati nella main form.

Ho usato le proprietà per garantire l'incapsulamento e la riutilizzabilità.

Vista l'ora impossibile riprenderò l'interessantissima discussione domani.
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: tornu - 26 Dicembre 2014, 17:25:50
Mi pare che ancora, pur essendo andati avanti coi ragionamenti e lo studio del materiale citato, non sia chiaro come costringere la form chiamata a restituire dati alla Form chiamante e come recepire detti dati quando la Form chiamante riprenderà il controllo del ciclo elaborativo.............
Ciao Picavbg,
sì hai ragione, almeno a me non è ancora del tutto chiaro. Sto cercando di applicare il metodo da te descritto, ma ho bisogno ancora di alcune
delucidazioni.

Il secondo passo importante è quello di richiamare il costruttore della nuova classe FormX da chiamare:
Codice: [Seleziona]
  FrmX = New FormX(vDati)

seguito dalla classica istruzione di chiamata della Form, rispettando il seguente formato:
Codice: [Seleziona]
 iSwReturn = Frm7.showmodal()
dove iSwReturn conterrà un valore numerico utile per l'eventuale scelta successiva della funzione da sviluppare al rientro dal Form chiamato.
In quest'ultima istruzione risiede la chiave risolutiva del meccanismo di andata e ritorno dei dati, perchè, al ritorno dal Form chiamato, l'array di partenza, vDati, conterrà non più i valori ceduti al programma chiamato, bensì quelli che quest'ultimo avrà modificato o anche aggiunto a quelli iniziali.
Non ho capito l'utilità della variabile iSwReturn puoi essere più dettagliato.
La Form chiamata riceverà i dati dell'array con il metodo _new, ho capito bene?
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 26 Dicembre 2014, 17:50:15
Accidenti,
da quello che dice Tornu a Picavbg ne deduco che il programma da me postato e che scambia dati in andata e ritorno fra due finestre incorporate nella Fmain non è quello desiderato?
Scusate ma allora occorre che vi spiegate meglio tutti.  :-\

Ne avevo creato un altro che scambiava dati fra tre diverse finestre ma a questo punto lascio perdere perché è evidente che non ho capito un tubo.

 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: tornu - 26 Dicembre 2014, 18:37:42
Accidenti,
da quello che dice Tornu a Picavbg ne deduco che il programma da me postato e che scambia dati in andata e ritorno fra due finestre incorporate nella Fmain non è quello desiderato?
Scusate ma allora occorre che vi spiegate meglio tutti.  :-\

Ne avevo creato un altro che scambiava dati fra tre diverse finestre ma a questo punto lascio perdere perché è evidente che non ho capito un tubo.

 :ciao:


Ciao Gianluigi,
se ti scarichi i due esempi che ho postato nel messaggio di apertura, lasciando perdere l'esempio1 che ho inserito solo
per spiegare ciò che intendevo ottenere, e apri l'esempio2 capirai dal semplice codice contenuto cosa intendevo per passaggio dati.
Così come da me postato vedrai che i dati inseriti nel Form2 non passano al Form1. Con le indicazioni suggerite da vuott quell'esempio
ad esso è funzionante, se vuoi provarlo modificalo con le istruzioni di vuott.
Visto che successivamente avete ampliato la discussione e con le indicazioni di Picavbg si può ottenere lo stesso risultato ma sicuramente
in modo più funzionale con la possibilità di passaggio dati in "andata" e "ritorno" e l'utilizzo di array stò cercando di implementare il metodo
da lui suggerito.
Comunque anche gli esempi da te postati possono tornare sempre utili (....non si butta via mai niente)  ;)
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 26 Dicembre 2014, 19:17:08
@Tornu

Io il tuo programma l'ho scaricato tanto che se ti scarichi quello che ho postato io, due post sopra questo rispondendo a Picavbg ti accorgi che tengo proprio conto di quanto da te postato e successivamente scritto. O meglio quello che io ho capito.
Evidentemente però non ho capito e quindi sono a chiederti: Visto che intanto l'ho fatto puoi vedere quello qui postato che scambia fra tre finestre e dirmi cosa non fa che tu vorresti invece facesse?
Grazie
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: tornu - 26 Dicembre 2014, 20:14:00
Ho scaricato e provato il tuo esempio, ma non si applica all'esigenza per cui io ho aperto questa discussione.
Tu hai creato una Form che fà da contenitore ad altre tre Form sempre attive che vengono inizializzate all'avvio
del programma dalla FMain e scambiano dati tra di loro.
La mia esigenza è diversa , e non credo che possa applicare il tuo codice.
Provo a sintetizzartela in modo schematico (magari il mio esempio o quello da me scritto nei precedenti post non sono eplicativi).

1) Avvio il programma visualizzando una Form vuota (nel mio caso FMain) che automaticamente visualizza al suo interno la prima Form (Form1)
   e che fa sempre (FMain non viene mai chiusa) da contenitore alle altre Form che vengono richiamate/visualizzate solo se eccessario
   da oggetti o procedure.
2) Per mia neccessità (nel caso in discussione) quando richiamo per esempio dalla Form1 la Form2, la Form1 viene chiusa.
3) Quando richiamo la Form2 si possono verificare tre casi:
    caso1: La Form1 non passa dati alla Form2, ma deve prelevarli da essa, chiudendo la Form2 deve passare i dati prelevati alla Form1.
    caso2: La Form1 alla sua chiusura passa dei dati alla Form2, nel quale vengono elaborati., chiudendo la Form2 i dati modificati passano alla
              Form1
    caso3: La Form1 alla sua chiusura passa dati alla Form2, i dati passati dovranno essere modificati prelevando i nuovi dati da una Form che si
              aprirà in modalità ShowModal (lasciando la Form2 attiva) chiusa la quale i dati vengono inseriti nella Form2....ect...
La casistica secondo che programmi realizzi può essere anche molto più complessa, ma capita la logica (quello che stò tentando io) la si può applicare
a qualsiasi neccessità come dice Picavbg.
Spero di averti spiegato in modo più comprensibile l'esigenza, avevo postato l'esempio2 proprio perchè spiegarlo a parole mi senbra più complicato.
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 26 Dicembre 2014, 23:33:01
Non ho capito l'utilità della variabile iSwReturn puoi essere più dettagliato.
La Form chiamata riceverà i dati dell'array con il metodo _new, ho capito bene?
L'array valorizzato nella Form chiamante (da questo momento FormX1) coi dati da passare alla Form chiamata (da questo momento FormX2) viene acquisito dal costruttore della FormX2, cioe dalla classe _new di quest'ultima. Una volta costruita la FormX2, l'esecuzione del contatore di istruzioni ritorna sulla FormX1 che esegue la chiamata in modalità Showmodal. Tuttavia è necessario indicare come destinataria del valore numerico di ritorno una variabile di tipo integer, esattamente come si fa quando si richiama una funzione:
Codice: [Seleziona]
iSwReturn = FrmX2.showmodal()
Detto meccanismo permette di avere ritornato non solo iSwReturn, ma anche i dati dell'array modificati in tutto o in parte dalla FormX2. Attenzione però perchè l'array preso in carico dalla FormX2 dovrà, qualora occorra, essere modificato al suo interno. Infatti il suo aggiornamento non è automatico.
Come succeda che al rientro dalla FormX2, l'array valorizzato nella FormX1 risulti modificato non è dato saperlo perchè nessuna guida di Gambas lo chiarisce, però ciò succede solo utilizzando il metodo di chiamata in showmodal descritto sopra. Se si prova ad eseguirlo nella maniera tradizionale, anche dopo avere richiamato il costruttore (_new), l'array conterrà sempre i valori di partenza, senza le modifiche apportate nella FormX2.

Spero che abbia chiarito tutti i tuoi dubbi.  ;D
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: tornu - 30 Dicembre 2014, 00:24:22
Grazie Picavbg, concetto esposto con molta chiarezza ed applicato con successo.  :ok:

Ora mi viene in mente un'altra domanda (l'appetito vien mangiando...) sempre inerente il concetto di passaggio dati.
Poniamo che il nostro progetto sia un gestionale, abbiamo una Form "Ricerca Anagrafica Clienti" che come puoi ben
capire sarà richiamata da vari punti del programma Emmissione Fatture, DDT, Ordini, ect... e quindi dovrà passare
uno o più dati alla Form chiamante, con i concetti da te espressi posso passare al costruttore _new un dato
tramite variabile o più dati con un array, ma come faccio a scindere quale è la Form chiamante e passargli i dati?

La prima cosa che mi è venuta al volo è quella di aggiungere un'altra variabile in caso di passaggio tramite variabili
o un'altro dato all'interno dell'eventuale array da usare come flag di identificazione della Form chiamante, è la strada
corretta o ci sono altri metodi?
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 30 Dicembre 2014, 11:02:21
Grazie Picavbg, concetto esposto con molta chiarezza ed applicato con successo.  :ok:

Ora mi viene in mente un'altra domanda (l'appetito vien mangiando...) sempre inerente il concetto di passaggio dati.
Poniamo che il nostro progetto sia un gestionale, abbiamo una Form "Ricerca Anagrafica Clienti" che come puoi ben
capire sarà richiamata da vari punti del programma Emmissione Fatture, DDT, Ordini, ect... e quindi dovrà passare
uno o più dati alla Form chiamante, con i concetti da te espressi posso passare al costruttore _new un dato
tramite variabile o più dati con un array, ma come faccio a scindere quale è la Form chiamante e passargli i dati?

La prima cosa che mi è venuta al volo è quella di aggiungere un'altra variabile in caso di passaggio tramite variabili
o un'altro dato all'interno dell'eventuale array da usare come flag di identificazione della Form chiamante, è la strada
corretta o ci sono altri metodi?

La chiamate di un Form tramite il parametro showmodal pone il Form chiamato  in stato di dipendenza rispetto al Form chiamante. Ciò significa che mentre è attivo, il Form chiamante resta in stand-by, in attesa che il Form chiamato gli restituisca il controllo delle operazioni di elaborazione. Te lo dimostra il fatto che se tu clicchi sul Form chiamante, visibile sotto quello attivo (il chiamato ), non ottieni alcun effetto. Quindi il Form chiamante potrà ritornare attivo solamente dopo che il Form chiamato avrà eseguito la sua brava Close e nel caso specifico della chiamata eseguita nella modalità su cui stiamo ragionando dovrà restituire anche un valore. Riporto, anche se ridondante, la chiamata fatta dal Form chiamante:
Codice: [Seleziona]
FrmX = New FormX(vDati)
iSwReturn = FrmX2.showmodal()

Nel Form chiamato all'esecuzione della:
Codice: [Seleziona]
 Me.Close(x)   ' dove x costituisce i valore destinato a iSwReturn
come avrai certamente utilizzato, il Form chiamato cessa il suo status di attivo che viene ripreso dal Form chiamante con l'istruzione successiva a quella della chiamata. Essa dovrebbe essere quella di riconoscimento del contenuto di iSwReturn. E' anche il momento di rilevare del contenuto aggiornato dell'array che hai passato al momento della chiamata.

Non vedo perciò alcuna necessità di passare dati dal chiamato al chiamante in maniera diversa da quella appena descritta più dettagliatamente.
Se ci rifletti con lo showmodal hai realizzato un pseudo-incapsulamento. Non è proprio un incapsulamento perchè non è completamente automatico, ma si avvale della chiamata preliminare del costruttore _new.
 ;D
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 30 Dicembre 2014, 11:52:54

La chiamate di un Form tramite il parametro showmodal pone il Form chiamato  in stato di dipendenza rispetto al Form chiamante. Ciò significa che mentre è attivo, il Form chiamante resta in stand-by, in attesa che il Form chiamato gli restituisca il controllo delle operazioni di elaborazione. Te lo dimostra il fatto che se tu clicchi sul Form chiamante, visibile sotto quello attivo (il chiamato ), non ottieni alcun effetto. Quindi il Form chiamante potrà ritornare attivo solamente dopo che il Form chiamato avrà eseguito la sua brava Close e nel caso specifico della chiamata eseguita nella modalità su cui stiamo ragionando dovrà restituire anche un valore. Riporto, anche se ridondante, la chiamata fatta dal Form chiamante:
Codice: [Seleziona]
FrmX = New FormX(vDati)
iSwReturn = FrmX2.showmodal()

Nel Form chiamato all'esecuzione della:
Codice: [Seleziona]
 Me.Close(x)   ' dove x costituisce i valore destinato a iSwReturn
come avrai certamente utilizzato, il Form chiamato cessa il suo status di attivo che viene ripreso dal Form chiamante con l'istruzione successiva a quella della chiamata. Essa dovrebbe essere quella di riconoscimento del contenuto di iSwReturn. E' anche il momento di rilevare del contenuto aggiornato dell'array che hai passato al momento della chiamata.

Non vedo perciò alcuna necessità di passare dati dal chiamato al chiamante in maniera diversa da quella appena descritta più dettagliatamente.
Se ci rifletti con lo showmodal hai realizzato un pseudo-incapsulamento. Non è proprio un incapsulamento perchè non è completamente automatico, ma si avvale della chiamata preliminare del costruttore _new.
 ;D

Attenzione perché quanto qui sostieni è corretto solo nel caso di form esterno.
Se al contrario, come inizialmente postato da Tornu noi inglobiamo il form chiamato nel form chiamante, noi non avremo il comportamento tipo della finestra di dialogo ma un normale show e quindi quanto qui sostieni viene a cadere, tranne che otterremo lo stesso i dati corretti.
Poi per quanto io ne possa capire visto che solo ora mi interesso di OOP, riguardo l'incapsulamento qui siamo agli antipodi.
Naturalmente sempre per quanto io ne possa capire tu con questo sistema dai un contenitore, pieno in parte o vuoto che sia, e lo consegni all'altro oggetto che ne faccia ciò che gli pare prima di restituirtelo cambiato.
Esattamente l'opposto dell'incapsulamento che infatti consiglia l'uso delle proprietà che è il sistema per ricevere il valore da altri controllare (di nascosto) se è corretto e quindi implementarlo.
Si lo so che questo è comunque demandato al programmatore ma questo è l'attrezzo e il sistema migliore per poter ottenere detto incapsulamento.
Poi dovremmo anche tener conto del polimorfismo, vale a dire come si presentano gli oggetti abitualmente a noi.
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 30 Dicembre 2014, 14:59:56
@ GianLuigi

Scusami, ma non capisco cosa vuoi dire.
Per quanta riguarda la chiamata di un Form  con showmodal il Form chiamato non è un Form esterno. Esso è direttamente dipendente del Form chiamante e mentre il chiamato è attivo il Form chiamante va sicuramente in stand-by.
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 30 Dicembre 2014, 15:47:15
@ GianLuigi

Scusami, ma non capisco cosa vuoi dire.
Per quanta riguarda la chiamata di un Form  con showmodal il Form chiamato non è un Form esterno. Esso è direttamente dipendente del Form chiamante e mentre il chiamato è attivo il Form chiamante va sicuramente in stand-by.
 :ciao:

Quando Tornu ha aperto la discussione ha postato due esempi il primo funzionante come dimostrazione di quanto voleva ottenere e il secondo quello vero che non faceva quanto da lui sperato.
Vuott ha trovato subito la soluzione, però a mio modestissimo parere in modo diciamo così non conforme ai canoni teologici della programmazione orientata agli oggetti.  :)
Quanto da Tornu richiesto era lo scambio di informazioni fra una finestra Fmain, una finestra Form1 incorporata in Fmain e una Form2.
Se noi ci atteniamo a questo e insieme usiamo il metodo da te indicato “ereditato” da md9327, metodo che se non erro dovrà essere così applicato (almeno io l'ho provato in questo modo e funziona):

Codice: gambas [Seleziona]
Frm1 = New Form1(vParametri, Fmain)


a questo punto anche se mostriamo la Frm1 in modalità modale (dialogo) non otterremo quanto otterremmo dal tuo codice se non incorporassimo la Frm1 e la chiamassimo con ShowModal().
Volevo dire questo quando mi sono riferito a “Form esterno” rispetto al Form incorporato.

Intendiamoci io non sono lo sciamano addetto alla reliquia della Prima Proprietà, il mio intento è solo comprendere bene per poter bene indirizzare giovani gamberetti.
Pertanto non posso che ringraziarti del tuo cortesissimo interessamento.
Sai come in tante altre cose la programmazione ci offre molte vie alla meta ma io credo che alcune siano migliori di altre, non intendo più dirette o con minore occupazione di memoria, intendo complessivamente più consone.
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 30 Dicembre 2014, 18:19:52
@ Gianluigi

Non so da quanto tempo tu di dedichi alla OOP, personalmente, dopo avere approcciato qualcosa in VB, ai vecchi tempi antecedenti all'incontro con Linux, ho cominciato ad addentrarmi un pò nel bosco di tale ambiente dopo avere fatto i primi passi con Gambas. Ho appreso alcune sue caratteristiche con la pratica di sviluppo del programma  che mi interessava di più. Le conoscenze teoriche sono la conseguente deduzione  delle applicazioni pratiche delle varie istruzioni e metodi, sia dirette che indirette, attraverso le costruttive discussioni affrontate e vissute in questo nostro magnifico Forum.
Sicuramente porto con me ancora molte lacune, soprattutto in argomenti come incapsulamento, ereditarietà, poliformismo, metodi nascosti ...

Penso però anche che insistendo su queste nostre riflessioni possiamo darci tutti una mano a superare ostacoli e capire concetti ancora nebulosi. È giusto pertanto che ne continuiamo a parlare, anche facendo riferimenti ad appunti ed informazioni presenti nella grande biblioteca di Internet.
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: vuott - 30 Dicembre 2014, 19:39:39
... in modo diciamo così non conforme ai canoni teologici della programmazione orientata agli oggetti.  

...ma questo principio può valere soltanto in un ambito meramente didattico.
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 30 Dicembre 2014, 20:34:41
@Picavbg
Sono d'accordo con te in tutto e per tutto. Anche se il “possiamo darci tutti una mano” mi sa che è un tutti un po tanto ristretto.
Aggiungo solo una riflessione a quanto dici per me la programmazione orientata agli oggetti non è un dio, un totem e vedo che non lo è per lo stesso Minisini che infatti l'ha inglobata in Gambas solo in parte.
Io ad esempio penso che difficilmente avrei occasione di usare l'ereditarietà, se mi serve una classe più estesa non vedo il motivo di farne una più striminzita per poi doverla allargare, a meno che non si tratti di esigenze future allo stato attuale non esistenti e manco prevedibili. Quindi utile solo in prospettiva futura. Intendiamoci comunque un'opportunità in più per la nostra programmazione.
Poi il concetto seppur interessantissimo del riutilizzo del codice lo vedo un po tanto difficile da mettere in pratica. Io certamente se penso una classe la penso per quel particolare problema e la creerò per quel singolo problema senza starmi tanto a scervellare se poi potrò usarla per altro o addirittura per tutto e potrei continuare così su altri aspetti.
La cosa per me veramente importante di questa astrazione è la disciplina che ti puoi imporre nel tentare di creare una applicazione armoniosa fatta tutta di mattoncini intercambiabili come una costruzione Lego. Questo si che io trovo veramente geniale, se si riesce a creare un programma in cui nessuna classe dipende da elaborazioni fatte in altre classi il gioco è fatto.
Avremo un debug semplicissimo perché potremo escludere dall'errore via via ogni oggetto che darà risultati coerenti. Se un domani dovremo aggiungere qualcosa ad una classe basta intervenire solo li e se l'interfaccia non deve cambiare il gioco della manutenzione diventa decisamente semplice.
Bene se sei ancora sveglio ti saluto.

@vuott
Come vedi da quanto scritto a Picavbg sono d'accordo anche con te, non sono certamente un fanatico di questa astrazione.
Però, per quanto detto, trovo che cercare di rendere indipendente ogni classe sia un'ottima cosa. Un'applicazione ben congegnata con classi indipendenti difficilmente affonderà proprio come una nave con buone paratie stagne.

 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Top Fuel - 30 Dicembre 2014, 22:15:05
Vuott ha trovato subito la soluzione, però a mio modestissimo parere in modo diciamo così non conforme ai canoni teologici della programmazione orientata agli oggetti.  :)

Il mio (altrettanto) modestissimo parere è che non è obbligatorio essere un talebano della OOP e seguire al 100% la Bibbia del Programmatore ad Oggetti se una soluzione alternativa permette di risolvere un problema.
Anche Francesco Balena (sappiamo tutti e 2 chi è) quando scriveva su Computer Programming diceva chiaro e tondo di essere uno che non andava tanto per il sottile se trovava una soluzione che migliorava/velocizzava un certo algoritmo, compreso l'utilizzo dei famigerati Goto/Gosub (e posso dimostrartelo) perciò penso che l'utilizzo di qualche variabile globale o qualche cazzabubolo non strettamente OOP non credo che faccia implodere il Sistema Solare in un buco nero. ;D
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 30 Dicembre 2014, 23:58:23
@TopFuel
ma dai quale talebano delle OOP, come ho ampiamente detto io sto tentando di capirci qualcosa.
Butto li delle cose e vedo se poi qualcuno salta su dalla cadrega.  :)
Però insisto per quanto riguarda la disciplina della classe incapsulata, questa la trovo davvero utile.
Hai praticamente un faro che ti guida ovunque, una volta abituati ad usarlo tutto dovrebbe essere più semplice.
Inizialmente può apparire complicato ma se lo si analizza bene e ci si costringe ad usarlo diventa semplice e in seguito dovresti avere meno grattacapi.
Uso il condizionale perché le mie per ora sono solo prove sperimentali che non hanno ancora subito il battesimo del fuoco anzi neanche quello della compilazione.
Io noto una cosa che si ripete continuamente in modo similare; chi arriva da esperienze VB/VBA come me tende a creare in Linux con Gambas il clone di quanto aveva già fatto in Windows.
Proprio prima di Natale ho ricevuto una mail da un ex cliente che mi chiedeva, essendo la precedente defunta, un parere su quale stampante fosse più adatta da usare per “il suo eccellente programma... un modello che possa adattarsi alle caratteristiche del suo software...”.
Come vedi anche io avrei qualcosa da clonare ma non ci penso neanche ad usare Gambas come ho usato VBA senza prima adattarmi a Lui.
Il discorso che tu fai ha la sua valenza io ad esempio nel succitato software, o in altro di pari difficoltà ora non ne sono sicuro, ho usato i salti con le etichette però successivamente riguardando il codice mi sono accorto che avevo fatto una cosa inutile che potevo facilmente evitare oltre tutto scrivendo meno codice. Poi che cosa significa velocizzare dipende dal tipo di software io ad esempio quel poco che ho fatto era tutto software che interagiva con l'user pertanto la velocità contava praticamente zero.
Il mio modesto pensiero è questo fare programmazione è difficile, farla bene lo è ancora di più se utilizzi un metodo, o un sistema vedi tu, ti rendi la vita più facile. Lo devi fare per te stesso mica per gli altri.
Riguardo il mitico Balena se ti leggi il super tomo di .net 1300 pagine circa temo stenteresti a riconoscerlo.
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 31 Dicembre 2014, 00:43:56
@ Gianluigi
Benissimo, allora, a parte le disquisizioni di carattere tecnico, volendo tornare all'oggetto dell'argomento corrente, tu dici:
Citazione
Quando Tornu ha aperto la discussione ha postato due esempi il primo funzionante come dimostrazione di quanto voleva ottenere e il secondo quello vero che non faceva quanto da lui sperato.
Vuott ha trovato subito la soluzione

Secondo me, sebbene sia una soluzione pratica,  quello non è un passaggio di dati ma è semplicemente una valorizzazione di una variabile appartenente ad un altro Form.

Ho riguardato il tuo esempio:
Codice: [Seleziona]
Frm1 = New Form1(vParametri, Fmain) 
ma non ho capito il secondo campo nella lista dei parametri (Fmain) passati alla Form1.
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 31 Dicembre 2014, 12:14:47
@ Gianluigi
Benissimo, allora, a parte le disquisizioni di carattere tecnico, volendo tornare all'oggetto dell'argomento corrente, tu dici:
Citazione
Quando Tornu ha aperto la discussione ha postato due esempi il primo funzionante come dimostrazione di quanto voleva ottenere e il secondo quello vero che non faceva quanto da lui sperato.
Vuott ha trovato subito la soluzione

Secondo me, sebbene sia una soluzione pratica,  quello non è un passaggio di dati ma è semplicemente una valorizzazione di una variabile appartenente ad un altro Form.

Qui occorre intendersi quindi ti chiedo si tratta solo di "semantica" oppure intendi qualcosa di più specifico?

Citazione
Ho riguardato il tuo esempio:
Codice: [Seleziona]
Frm1 = New Form1(vParametri, Fmain) 
ma non ho capito il secondo campo nella lista dei parametri (Fmain) passati alla Form1.
 :ciao:

Ti allego una piccolissima dimostrazione che credo sia più esplicativa, così mi dici come avresti fatto tu e ci capiamo meglio.
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: tornu - 06 Gennaio 2015, 19:55:23
Le vostre disquisizioni (comunque interessantissime) tra usare un metodo o un'altro, rispettare
i canoni della programmazione o meno, approcci didattici o professionali, non hanno migliorato
la mia comprensione (mi scuso, sicuramente per colpa mia) nell'utilizzare il miglior metodo
per passare dati da una Form ad un'altra. Al momento non sono riuscito ad applicare il metodo
di bidirezionalità indicato da Picavbg.

@ Gianluigi
Non ho capito l'utilità del tuo ultimo esempio che hai allegato in risposta a Picavbg.

Piccolo inciso rispetto ai vostri ultimi post:
Sono del parere (mio modestissimo punto di vista) che nella realizzazione di programmi siano essi per uso
didattico o professionale sarebbe giusto approciarli sempre con il modo più corretto e funzionale possibile,
naturalmente incide non poco anche l'esperienza e conoscenza del programmatore.
Apprezzo molto quando qualcuno tra i più esperti sul Forum spiega la differenza tra un metodo e un'altro,
o quando usarne uno al posto dell'altro a seconda del risultato che si vuol ottenere.
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 07 Gennaio 2015, 01:00:34
Ti allego una piccolissima dimostrazione che credo sia più esplicativa, così mi dici come avresti fatto tu e ci capiamo meglio.

Ho guardato il pochissimo codice che contiene il programmino d'esempio che hai allegato al tuo ultimo post, codice che avevo già letto in un tuo post precedente. Ho provato ad eseguirlo ma pare che sia stato scritto con una versione di Gambas più recente della mia, quindi non l'ho potuto provare. Guardando però il codice, In esso ho riscontrato due cose:
- Mi pare di capire che vuoi incorporare la FMain nella Form1, visto che passi alla Form1 la FMain come parametro, ma la FMain comprende la FMain.class e la FMain.Form. Non so se puoi passare col parametro Fmain sia l'una che l'altro. Non conosco Gambas così a fondo.
- La tua chiamata di Form1

Codice: [Seleziona]
Frm1 = New Form1(sParametri, FMain)
Frm1.Show

è eseguita in maniera che la Form1 sia perfettamente indipendente dalla FMain e ciò significa che tu puoi spostarti dall'una all'altra sia col Mouse che dai tasti scorciatoia senza dovere obbligatoriamente chiudere la Form1. Quindi mi pare che non riesci ad ottenere quell'inglobamento che vorresti. Inoltre, anche se richiami il costruttore della Form1, la successiva Form1.show non potrà mai e poi mai ricevere alcun effetto prodotto all'interno della Form1, sia perchè hai usato un metodo diverso da quello modale, sia perchè non hai indicato la variabile numerica dove fare pervenire il valore di ritorno a carico dell'istruzione di chiusura della Form1.

L'unica modalità per subordinare la Form1 alla FMain è quella di eseguire una chiamata di tipo modale. In questo modo il Form1, seppur non incorpori FMain, risulta dipendente da esso e FMain non è più disponibile per un suo utilizzo fino a quando la Form1 non sarà chiusa. Per ottenere poi il ritorno di un valore numerico occore fare la chiamata, come ho già detto più volte, esclusivamente con la seguente modalità:
Codice: [Seleziona]
Frm1 = New Form1(sParametri)    'dove includerai tutte le variabili che vorrai passare a Form1  per manipolarle
iNum = Frm1.Show

la Form 1 di contro utilizzarà il contenuto della sParametri ed al momento cella chiusura restituirà un valore, anche formale, ma soprattutto restituira l'array modificato coi nuovi valori che avrà determinato durante l'elaborazione di sua competenza:
Codice: gambas [Seleziona]

Private vParam As New String[]

Public Sub _new(vParamInp As Variant[])
vParam = vParamInp
End

Public Sub PulsMod_Click()
 vParam[1] = "fine prova"
End

Public Sub PulsEsci_Click()
'-----------------------------------------
Me.Close(0)     'Questo è il momento in cui il Form1 finisce il suo lavoro e si chiude la relativa finestra. A FMain viene restituito il valore 0, ma l'array sParametri risulta pure modificato nel suo 2° elemento.
End

Ora ho indicatoi chiaramente anche le istruzioni salienti da inserire nella Form1.class.

Insisto col dire che è l'unica modalità per passare in andata e ritorno dei parametri fra due Form, di cui il Form chiamato deve essere in dipendenza modale rispetto al chiamante.
 ;)
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 07 Gennaio 2015, 01:10:52
Sono del parere (mio modestissimo punto di vista) che nella realizzazione di programmi siano essi per uso
didattico o professionale sarebbe giusto approciarli sempre con il modo più corretto e funzionale possibile,
naturalmente incide non poco anche l'esperienza e conoscenza del programmatore.
Apprezzo molto quando qualcuno tra i più esperti sul Forum spiega la differenza tra un metodo e un'altro,
o quando usarne uno al posto dell'altro a seconda del risultato che si vuol ottenere.

Ricorda che la programmzione non è un binario a percorso obbligato. Puoi sempre trovare percorsi, magari tortuosi, che ti portano alla fine sempre allo stesso risultato. Ogni programmatore costruisce un proprio metodo di lavoro, a seconda del suo grado di visibilità di un problema o di una meta da raggiungere. Praticamente l'importante è ottenere il risultato finale corretto. Sul metodo poi si possono fare ragionamenti ed affinamenti logistici a dismisura, ma quello che conta è il risultato finale. Con ciò non voglio dire che il programmatore A che riesce ad ottenere il risultato in 5" ed il programmatore B che invece ci riesce dopo avere fatto lavorare il suo programma per 2 giorni consecutivi, abbiano prodotto entrambi risultati accettabili. In casi del genere c'è sicuramente qualche cantonata di mezzo.  :D
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: vuott - 07 Gennaio 2015, 10:41:19
Ricorda che la programmzione non è un binario a percorso obbligato. Puoi sempre trovare percorsi, magari tortuosi, che ti portano alla fine sempre allo stesso risultato. Ogni programmatore costruisce un proprio metodo di lavoro, a seconda del suo grado di visibilità di un problema o di una meta da raggiungere. Praticamente l'importante è ottenere il risultato finale corretto. Sul metodo poi si possono fare ragionamenti ed affinamenti logistici a dismisura, ma quello che conta è il risultato finale.
Condivido pienamente !
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 07 Gennaio 2015, 21:48:10
@Vuott
Come ho già scritto, ribadisco che anch'io credo che il programmatore è padronissimo di scrivere il codice come meglio gli aggrada. Ciò non toglie che si possa discutere di cosa è meglio per ognuno di noi.

@Picavbg
Sostieni che avevo già postato questo codice? Posso chiederti dove?
E poi scusa ma fermarsi davanti all'incompatibilità di versione e non provare un codice così breve che poteva far capire cosa intendevo dire/dimostrare...
Ricordo a me stesso che basta fare doppio click sulla cartella del progetto con spuntata l'opzione di Visualizza > Mostra file nascosti e fare doppio click sul file .src e poi visualizzare i file .class (quelli con icona la tazzina del caffè) col tasto destro del mouse per aprirli con l'editor di testo.
Basta copiare e fare le semplicissime form et voilà.
Comunque tranquillo non ti sei perso niente.

@Tornu
Come puoi ben comprendere è quasi impossibile o è molto difficile capire cosa sia che esattamente un altra persona voglia ottenere dal proprio codice.
Uno può offrire uno spunto dal proprio punto di vista per quel poco che ha compreso.
Qui si trattava comunque di cosa già risolta ne ho voluto parlare proprio perché ne dobbiamo poi scrivere nel libro.
E' quindi nata questa disquisizione con Picavbg che ha dato il suo suggerimento dicendo che se si parla di dati scambiati fra finestre non si può prescindere da quanto insegnato da md9327.
Ora siccome sembra che io non sappia di cosa stiamo parlando esemplifico in modo minimale quanto io ho compreso del suddetto insegnamento:
Per provare questo codice occorre creare un progetto grafico QT avente la Fmain con un button1 e una Form1 con una textlabel1 e un button1.
Questo il codice della Fmain:

Codice: [Seleziona]
Public Sub Form_Open() 
  Me.Center
End

Public Sub Button1_Click()

  Dim iRitorno, i As Integer
  Dim sParametri As New String[]
  Dim Frm1 As Form1
 
 ' Inserisco un paio di voci da inviare a form1
  sParametri.Add("Voce 1 da FMain")
  sParametri.Add("Voce 2 da FMain")
  ' Passo i parametri attraverso il costruttore di classe.
  ' NB: Per passare e ottenere valori da altre form devo utilizzare
  ' degli oggetti le array string[] sono oggetti (classi).
  ' Quindi potrei utilizzare altri tipi di classi array.
  Frm1 = New Form1(sParametri)
  ' Ottengo l'integer dalla form1
  ' Apro la form1 come dialogo o modale (stessa cosa)
  ' altrimenti non posso ottenere i valori di ritorno.
  iRitorno = Frm1.ShowDialog()
  ' Ottengo i valori di ritorno
  Print iRitorno
  For i = 0 To sParametri.Max
    Print sParametri[i]
  Next
 
End

Questo il codice della Form1

Codice: [Seleziona]
Private $bOk As Boolean = False
Private $iRitorno As Integer
Private $sParametriForm1 As String[]

Public Sub _new(sParametri As String[]) 

  Dim i As Integer
  Dim s As String
 
  ' Ottengo i parametri copiandoli in una nuova array
  $sParametriForm1 = sParametri 
  For i = 0 To $sParametriForm1.Max
    s &= $sParametriForm1[i] & "<BR>"
  Next 
  ' Mostro i parametri nella textlabel
  TextLabel1.Text = s
 
End


Public Sub Button1_Click() 
  ' Abilito la chiusura della finestra solo da
  ' button1 per poter passare il valore alla FMain
  $bOk = True
  ' Cambio la seconda voce e aggiungo una voce
  $sParametriForm1.Remove(1)
  $sParametriForm1.Add("Voce Cambiata da Form 1", 1) 
  ' Aggiungo una nuova voce.
  $sParametriForm1.Add("Nuova voce da Form 1", 2)
  ' Valore integer di ritorno a FMain.
  Me.Close(10)   

End

Public Sub Form_Close()
  ' Per impedire di non avere il valore integer di ritorno (in questo caso 10).
  ' Se invece vogliamo sapere se la finestra è stata chiusa non da pulsante
  ' (a parte che non avremmo variazioni di dati, ritorno degli stessi alla FMain ecc.)
  ' commentate o cancellate questo codice e se la finestra viene chiusa dalla
  ' X riceverete indietro l'intero Zero.
  If $bOk = False Then
    Message("Occorre agire sul pulsante <B>Sostituisco Aggiungo Chiudo</B> per chiudere la finestra regolarmente.")
    Stop Event
  Endif 
 
End

Mi sono accorto che nel codice di “Array_di_passaggio” questa parte non è spiegata bene, penso che ora confrontando i due codici tu possa meglio comprendere.

Codice: [Seleziona]
Public Sub Form_Open()  
 
  Dim iRitorno As Integer
  Dim sParametri As New String[]
  Dim Frm1 As Form1
 
 ' Aggiungo una voce
  sParametri.Add("FM")
  Frm1 = New Form1(sParametri, FMain)
 
  ' Questa voce comunque tu la scrivi (o no) non serve a nulla!
  Frm1.ShowModal()
  ' Show o ShowModal non servono in quanto se incorpori il form1 in FMain
  ' non si avrà il ritorno del codice alla chiusura
  ' se invece non si incorpora form1 in fmain allora
  ' occorre aprire in modale per avere il ritorno.
  Print "Eseguito fino a qui"
End

Io credo che il passaggio di dati fra finestre attraverso il costruttore (_New) non faccia al caso tuo, come del resto neanche gli altri modi qui trattati, a meno che non trovi un compromesso all'idea di partenza.
Se devi per forza chiudere una finestra quando ne apri un altra e quella che deve ricevere i dati deve  essere incorporata o ti sei fatto bastare il suggerimento di vuott altrimenti puoi prendere in considerazione la classe Application e fare come si faceva una volta in Access (un ritorno alle variabili pubbliche comunque, che poi non è che sono il diavolo e a volte...).

PS: Il codice con “gambas code” non funziona bene l'ho cambiato sperando in meglio col vecchio sistema.

 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 07 Gennaio 2015, 22:48:57
@Picavbg
Sostieni che avevo già postato questo codice? Posso chiederti dove?

Ho riguradato il codice che hai trascritto nei post precedenti e mi sono accorto di avere preso un abbaglio. Si vede che quandfo ho scritto l'ultimo mio post, data l'ora, ero già  :sleepy:
perciò ti chiedo scusa e mi ritiro da questa discussione.
Ciao.
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: vuott - 07 Gennaio 2015, 23:16:37
Ciò non toglie che si possa discutere di cosa è meglio per ognuno di noi.


E chi lo nega ?
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 07 Gennaio 2015, 23:34:39
...
perciò ti chiedo scusa e mi ritiro da questa discussione.
Ciao.

Non vedo di cosa tu mi debba chiedere scusa, ma visto come chiudi non vorrei averti offeso e quindi ti chiedo scusa pure io, anche per me a tarda ora le cose non riescono un granché.
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 07 Gennaio 2015, 23:35:58
... e scuse pure a vuott

:(
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 10 Gennaio 2015, 22:13:38
@  Gianluigi

Non so se ti possa ancora servire, però oggi, riguardando appunti miei della vita trascorsa con Gambas, ho riscontrato un appunto che riguarda la discussione Form che contiene al suo interno altri form. Potresti provare a leggere qui (http://www.gambas-it.org/smf/index.php?topic=1434.msg16252#msg16252)
 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 11 Gennaio 2015, 21:11:04
@Picavbg
Certo che mi serve, molto interessante grazie.
Forse potrebbe ispirare Tornu per un'eventuale variazione nella costruzione della sua applicazione.
Io mi ero attenuto ai suoi desiderata o meglio credevo di essermici attenuto quando ho iniziato ad inglobare le finestre nella FMain.
Gambas offre veramente tantissime soluzioni in primis Workspace che forse è il modo più “Gambas” ma io sono ancora troppo poco esperto per indicare un modo preferibile ad altro e come dici giustamente tu l'importante è che vada bene e funzioni per quello che vuoi ottenere.
Una cosa però mi sento di dire visto che md9327 e milio ne fanno ampio uso, le Workspace ho intenzione di studiarmele per benino.
Come tu puoi insegnarmi le finestre di dialogo risolvono mille problemi, ma non sempre vanno bene, la finestra principale di un'applicazione un minimo complessa avrà quasi sicuramente necessità di visualizzare al suo interno altre finestre, trovare un modo efficiente per risolvere questa basilare necessità appare non semplicissimo e riceve parecchi pareri discordi.  :rolleyes:

 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Picavbg - 11 Gennaio 2015, 23:33:57
Mi fa piacere di esserti stato utile. Purtroppo su Workspace non posso dirti di più, perché a suo tempo ho raccolto la nota senza però avere il tempo di provarne gli effetti.
Agli inizi del mio rapporto con questa nostra comunità, raccoglievo le note stampate di tutte le discussioni che mi sembravano interessanti. Era una buona abitudine che purtroppo nel tempo ho perso. Ogni tanto, quando devo affrontare una difficoltà nuova o lontana nel tempo, le rispolvero e, riguardandole, capisco se mi possono aiutare o no.  Infatti, come hai detto tu altrove, non sempre le ricerche funzionano: infatti è difficilissimo indovinare la parola chiave di ricerca.
 ;D
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: vuott - 11 Gennaio 2015, 23:53:47
...le Workspace ho intenzione di studiarmele per benino.


Un piccolo accenno è fatto qui:

http://www.gambas-it.org/wiki/index.php?title=Uso_della_Classe_WorkSpace
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 12 Gennaio 2015, 22:28:38
Un piccolo accenno è fatto qui:
http://www.gambas-it.org/wiki/index.php?title=Uso_della_Classe_WorkSpace

Grazie vuott, veramente notevole la tua conoscenza di Gambas.
Riguardo le WorkSpace così a prima vista mi hanno un po deluso credevo fossero diverse però non le conosco ancora, vedremo.
Tu nei tuoi programmi le hai mai usate?
 :ciao:
PS: Prima ho detto un'inesattezza mi pareva che md9327 le avesse usate in pgDesigner ma mi sbagliavo, chiedo venia.
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: vuott - 13 Gennaio 2015, 00:32:13
Riguardo le WorkSpace...
Tu nei tuoi programmi le hai mai usate?


No, non mi è ancora capitato.   :-\
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: tornu - 14 Gennaio 2015, 22:46:43
Buonasera a tutti,
scusate se rompo ancora, continuando a cercare di capire un metodo per passare questi benedetti dati da una Form
ad un'altra, fermo restando la costruzione del progetto così come da me applicata nell'esempio 2 postato all'inizio
di questa discussione, è non avendo trovato soluzioni nei suggerimenti (comunque interessanti) che mi avete dato
nelle varie risposte, evidenziando sempre il fatto che non escludo una mia mancanza di comprensione degli stessi,
proseguo con il metodo iniziale comprese le correzione datemi da vuott. Vi allego un'altro esempio sulla falsa riga
del primo ma se guardate il codice della Form3 capirete al volo dovo ora mi sono inchiodato.
Vi ringrazio anticipatamente per qualsiasi suggerimento migliorativo che mi vorrete dare.
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: vuott - 15 Gennaio 2015, 03:03:01
Vi allego un'altro esempio sulla falsa riga del primo ma se guardate il codice della Form3 capirete al volo dovo ora mi sono inchiodato.

Si presenta l'errore "Invalid object" alla sub-procedura InvioDati() della Classe Form3.class, riferendosi all'oggetto rappresentato dalla variabile FMain.Frm1 .

Ciò accade, poiché la pressione sul tasto "Form2" - posto su Form1 - causa la chiusura/distruzione di detto Form FMain.Frm1. Se dopo ciò si preme il tasto "Ritorno" del Form 3, viene invocata la predetta sub-procedura che a sua volta richiama così un oggetto non più valido, poiché chiuso in precedenza.

...proporrei di usare il metodo Me.Hide anziché Me.Close :-X
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 15 Gennaio 2015, 14:20:56

...proporrei di usare il metodo Me.Hide anziché Me.Close :-X

+ 1  :ok:

E forse alla luce di questo suggerimento riconsiderare alcuni esempi...

 :ciao:
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: tornu - 15 Gennaio 2015, 22:23:43
Si presenta l'errore "Invalid object" alla sub-procedura InvioDati() della Classe Form3.class, riferendosi all'oggetto rappresentato dalla variabile FMain.Frm1 .

Ciò accade, poiché la pressione sul tasto "Form2" - posto su Form1 - causa la chiusura/distruzione di detto Form FMain.Frm1. Se dopo ciò si preme il tasto "Ritorno" del Form 3, viene invocata la predetta sub-procedura che a sua volta richiama così un oggetto non più valido, poiché chiuso in precedenza.

...proporrei di usare il metodo Me.Hide anziché Me.Close :-X
Ciao vuott, sapevo che si sarebbe generato l'errore da te indicato, pensavo che indicandovi di leggere il codice della Form3 avreste
capito la difficoltà in cui mi sono imbattuto, non avevo aggiunto altre spiegazioni per non dilungare troppo il post, scusatemi.
Cerco di spiegarlo in modo più chiaro.
1) Dalla Form1 invio dati alla Form3 che modifico o ne inserisco nuovi e devono tornare alla Form1, chiudendo la Form3, è questo funziona.
2) Dalla Form2 invio dati alla Form3 che modifico o ne inserisco nuovi  e devono tornare alla Form2, chiudendo la Form 3, e qui non sono come fare
   (vedere codice commentato in Form3 indicato dai punti interrogativi)


+ 1  :ok:

E forse alla luce di questo suggerimento riconsiderare alcuni esempi...

 :ciao:
Quali...


Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 15 Gennaio 2015, 23:36:48

Quali...


Ad esempio questo...
Titolo: Re: [RISOLTO] Passaggio dati tra due Form
Inserito da: Gianluigi - 16 Gennaio 2015, 16:57:08
In effetti l'applicazione che ti ho inviato è un po stramba nell'uso delle proprietà inoltre gli “As “hFinestra_n”” sono inutili come inutile è la proprietà boleana, rimane il fatto che secondo me funziona bene.
Qui allego anche quella (quasi) alla “Picavbg” ho cercato anche di intitolarla alla sua maniera...  ;D