@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:
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
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.
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.