fsurfing,
Innanzitutto ti ringrazio della risposta! La vedo appena finisco di cenare.
Nel frattempo che ho postato la domanda mi sono fatto un giro sul web, e tra esempi, sorgenti, ecc. ho trovato la soluzione.
Sono euforico... e la spiego, nel caso servisse anche agli altri.
La soluzione è la creazione di un form MDI... ossia un form_padre, nel quale dentro ci sia un componente, chiamato Workspace, che visualizza i form_figli.
Per attivarlo bisogna andare sulla gestione componenti ed attivare gb.form.mdi (che richiede anche gb.settings).
A questo punto il gioco è semplicissimo. E vi spiego cosa ho fatto io:
1) Creazione del FMain (che sarà il nostro form MDI),
2) all'interno del FMain piazzeremo il componente Workspace (che sarà comparso tra gli "special"), e lo chiamiamo "mioWorkspace"
3) Disegniamo un altro form (che sarà uno dei figli), "Ffiglio1".
4) per far visualizzare "Ffiglio1" nel "mioWorkspace" dobbiamo lo istanziamo e lo aggiungiamo. Questo è il codice da inserire per esempio nel _new dell'FMain:
DIM mioform AS NEW Ffiglio1
mioWorkspace.add(mioform)
Ora non so bene tutto il resto... però è una figata! Inoltre, ci dovrebbe essere anche la toolbar da qualche parte. Continuo la ricerca...
Mi sono arenato su un punto...
Come faccio da FMain a gestire un componente di fr1, ossia l'istanza pubblica di Form1, che sta dentro il panel1 di FMain?
C'è un componente di fr1, ad esempio Label1.... Se io volessi da Fmain cambiare il .caption di questo label come faccio?
Se da un qualunque evento di FMain scrivo fr1.label1.caption = "modifica_label" il programma mi restituisce errore... Non capisco perché?
Questo è il codice dell'FMain, che contiene il "panel1" in cui compaiono "fr1" o "fr2", che, come è dichiarato nell'evento "Form_Open()" sono istanze del "Form1" e del "Form2".
Io voglio cambiare il testo del componente "label1" che si trova sia in "Form1" che in "Form2"... E pensavo che avendo istanziato sia "fr1" ed "fr2", automaticamente questi richiamassero anche tutti i sotto-oggetti (ossia i componenti dell'oggetto Form), con "fr1.Label1.Caption = '....' " ed "fr2.Label1.Caption = '....' "
L'errore che mi restituisce quando in run-time clicco sul "button1" o sul "button2" è: "Unknown symbol "Label1" in class "Form" (a riga 17 dell'FMain)
' Gambas class file
Public fr1 As Form
Public fr2 As Form
Public Sub _new()
End
Public Sub Form_Open()
fr1 = New Form1(Panel1) As "fr1"
fr2 = New Form2(Panel1) As "fr2"
nascondifrm
End
Public Sub Button1_Click()
nascondifrm
fr1.Visible = True
fr1.label1.caption = "Prova_Cambio_Caption"
End
Public Sub Button2_Click()
nascondifrm
fr2.Visible = True
fr2.label1.caption = "Prova_Cambio_Caption"
End
Public Sub form1_Click()
Button1_Click()
End
Public Sub form2_Click()
Button2_Click()
End
Public Sub nascondifrm()
Dim frmX As Form
For Each frmX In Panel1.Children
frmX.Visible = False
Next
End
PS: in Progetto --> Proprietà --> Opzioni --> "I controlli del form sono public" --> è settato su "NO".
Se setto "SI" mi da un errore a riga 9 dell'FMain... senza neppure far partire l'applicazione: "Form.Show" is badly overridden in class "Form1"
modifica l' intestazione così
Public fr1 As Form1
Public fr2 As Form2
Public fr3 As Form3
poi abilita nelle opzioni l'uso dei metodi public per i simboli dei moduli e i controlli dei form
fsurfing,
ho cambiato l'intestazione dell'Fmain in:
' Gambas class file
Public fr1 As Form1
Public fr2 As Form2
Public Sub _new()
End
Public Sub Form_Open()
fr1 = New Form1(Panel1) As "fr1"
fr2 = New Form2(Panel1) As "fr2"
nascondifrm
End
Ho settato "SI" sia l'opzione "I controlli del form sono 'public' ", sia l'opzione "I simboli dei moduli sono 'public' "...
Però mi da sempre lo stesso errore:
"Form.Show" is badly overridden in class "Form1" ...a riga 9 dell'FMain
Grazie Leo,
forse è proprio come dici. Mi ero incuriosito perché quel tipo di errore l'ho riscontrato anche in altre occasioni (ma a forza di fare prove non ricordo quali...). Però se dovesse ricapitare proverò a ricompilare il codice prima di eseguirlo.
Se invece dipendesse dal "file di testo" gambas, che succede su un progetto in corso di grosse dimensioni? C'è la possibilità di mettere ordine in quel file di testo? Cosa contiene?
@ Dex,
ho provato a scaricare il tuo sorgente, ma non riesco ad eseguirlo nè da g2 nè da g3. Il primo non mi visualizza nulla, come se il programma fosse in stand-by, su g3 invece (dopo aver aggiornato le form) mi da una serie di errori sulle variabili private, ecc. (c'era un errore su un solo "select case" e l'avevo già corretto).
@fsurfing,
intanto sto continuando sulla strada del concatenamento di un "form_figlio" all'interno di un panel nel "form_padre".
Il problema è che non so come fare per metterne uno "nipote"... ;D
Ti ricordi il form sul calcolo del codice_fiscale? Questo sarebbe il "form_nipote" che vorrei mettere in un panel_figlio del "form_figlio", che a sua volta finisce nel panel_padre del "form_padre".
Ho provato con la stessa tecnica di sopra, ossia dichiarando nel form_"figlio":
FMain --> è il "form_padre" (con dentro il "panel_padre")
Form1 --> è il "form_figlio" (con dentro il "panel_figlio") --> Fr1 è la sua istanza nell'FMain
FormCF --> il "form_nipote", con il codice fiscale... --> FrCF è la sua istanza nel Form1
In pratica, nel codice di Form1 ho scritto questo codice:
...e poi nell'evento Form_Open()
frCF = New FormCF(panel_figlio) As "frCF"
Il programma si avvia... ma quando visualizzo fr1 il "panel_figlio" è vuoto... ???
risolto...
Ho dichiarato tutto nell'FMain...
Public FrSon As FormFiglio
Public FrNip As FormNipote
Public Sub Form_Open()
FrSon = New FormFiglio(Me.pnlMain) As "FrSon"
FrNip = New FormNipote(FrSon.pnlson) As "FrNip"
End
Un'altra cosa...
Con questa tecnica vengono meno alcuni controlli... Ad esempio, nel form_nipote "codice fiscale" avevo usato dei comandi nell'evento Form_Open... ma non vengono attivati. Invece, trasferendoli in _new sì.
Ma il form istanziato non dovrebbe ereditare anche gli eventi? Quando visualizzo un form istanziato... non si verifica l'evento _Open?
[edit]
Ora capisco anche perché prima non mi visualizzava nulla... perché lo dichiaravo nell'evento Open del figlio... Ora ho riprovato a dichiararlo nell'evento _new e funziona anche così! Anzi così è meglio perché c'è più fluidità nel codice... ed i form sono più evidentemente concatenati tra loro (metti che mi dimentico che nel FormX avevo concatenato il FormY nel FormZ, ecc..). :D
[/edit]
Potresti gestirlo con gli eventi...
nel FrNip dichiari un evento che si scatena quando meglio credi, e volendo gli passi anche, che so, il codice fiscale. Nell'esempio scateno l'evento in una sub che richiami quando i dati inseriti per il codice fiscale ritornano un codice valido:
' Codice in FrNip
Event CodiceOk(Cf as String)
Public Sub CodiceValido()
Raise CodiceOk(CodiceFiscaleValido)
End
'Codice in Fmain
Public Sub FrNip_CodiceOk(Cf As String)
FrSon.GridBox1.LoadData(Tua Query & Cf)
End