Autore Topic: Form indicizzato e variabili pubbliche  (Letto 1780 volte)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Form indicizzato e variabili pubbliche
« il: 14 Novembre 2010, 00:02:58 »
Da quando sto usando il WorkSpace ho imparato che è buona prassi (anzi essenziale) indicizzare le Form figlie... al fine di avere tante copie identiche, ma ognuna distinta dall'altra dall'indice. Per indicizzare la forma uso il _new(idprogressivo as integer). Quindi avrò frm(0), frm(1), frm(2), ecc...

A questo punto però mi è sorto un problema: se apro una sub_form (in showmodal) e voglio farla interagire con le variabili pubbliche della frm(x)... devo nella form in showmodal richiamare le variabili pubbliche (che sono diventate anche loro indicizzate). Come faccio nella form in showmodal a risalire all'indice della frm(x)?

Intanto ho aggirato il problema dichiarando le variabili globali in un modulo a parte, così non ho problemi sia nella frm(x) che nella form_in_showmodal, ma se volessi evitare questo aggiramento come dovrei ragionare?  ???

PS: all'inizio le variabili pubbliche le avevo dichiarate direttamente nel form_in_showmodal... ma quando lo chiudevo per tornare all'frm(x) venivano distrutte anche loro e quindi non mi restituiva nulla... Unica soluzione era dare la proprietà .persistent = true al form_in_showmodal, ma non mi piaceva proprio...  :nono:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Form indicizzato e variabili pubbliche
« Risposta #1 il: 14 Novembre 2010, 00:50:27 »
Posteresti uno spezzone di codice che indica come indicizzi i form perchè non mi è ben chiaro l'uso che ne fai....

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form indicizzato e variabili pubbliche
« Risposta #2 il: 14 Novembre 2010, 01:19:26 »
Questa è la Sub richiamata dal click del pulsante "aggiungi ricetta", nel WorkSpace...

Codice: vb.net [Seleziona]

Private Sub nuovaricetta()
Dim id As Integer
  If Me.wrkRicette.Children.Count > 0 Then
    id = CInt(Replace(Me.wrkRicette.Children[Me.wrkRicette.Children.Max].Name, "Ricetta_", "")) + 1 ' --> è l'id dalla seconda ricetta in poi
  Else
    id = 0 ' --> è l'id della prima ricetta inserita
  Endif
  Ricetta = New FRicetta(id) As "Ricetta"
  Me.wrkRicette.Add(Ricetta)
  Me.wrkRicette.Children[id].Name = "Ricetta_" & id
  Me.wrkRicette.Children[id].Title = "Ricetta_" & (id + 1) ''ricordare che il Title della ricetta è +1 rispetto al Name...
End



Mentre nel form FRicetta dichiaro il _new così:

Codice: vb.net [Seleziona]

Public Sub _new(progressivo As Integer)
...
...


Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Form indicizzato e variabili pubbliche
« Risposta #3 il: 14 Novembre 2010, 19:14:22 »
mmh....così come lo hai postato capisco il codice ma non riesco a capire dove tu abbia bisogno di aiuto....

Non capisco cosa voglia dire per te la frase "se apro una sub_form" e tutto il resto del messaggio...dovresti essere un pò più chiaro altrimenti non capisco.....

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form indicizzato e variabili pubbliche
« Risposta #4 il: 14 Novembre 2010, 19:36:09 »
Codice: vb.net [Seleziona]
Ricetta = New FRicetta(id) As "Ricetta"


Nel workspace inserisco tante Ricetta... Ricetta(0), Ricetta(1), Ricetta(2), ecc... che sono istanze indicizzate (spero si dica così...) di FRicetta.

Ognuna di queste istanze dichiara delle variabili pubbliche (Nome, Cognome, ecc.).

In ognuna Ricetta(x) c'è un pulsante per far aprire una finestrella (in showmodal, quella che ho chiamato sub_form...). Come faccio dalla finestrella a richiamare la variabile pubblica della Ricetta(x) che l'ha aperta?

Cioè... come faccio a far sapere alla finestrella quale è l'indice x della Ricetta(x) che l'ha aperta?

Spero di essere stato più chiaro di prima, perché mi rendo conto che da ignorante in materia uso dei termini impropri...  :-[

PS: intanto ho risolto usando delle variabili globali... dichiarate in un Modulo a parte... che vengono richiamate sia da Ricetta(x) che dalla finestrella. Però vorrei capire come far dialogare direttamente le due form, senza passare per il modulo.
« Ultima modifica: 14 Novembre 2010, 19:37:55 da perseo »

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Form indicizzato e variabili pubbliche
« Risposta #5 il: 14 Novembre 2010, 19:46:07 »
Da quanto dici pare che ti sfugga l'uso di _new()

Quando passi un parametro a new, non crei un form con un indice diverso ma semplicemente gli passi un parametro all'atto della creazione come faresti con una normale funzione più o meno.....quindi se tu crei un form e passi come parametro un intero, questo intero non influisce sulle variabili e sulle proprietà del form a meno chè tu non faccia in modo, tramite codice, che ciò accada...spero di essermi spiegato....se questa cosa ti è chiara allora possiamo vedere il modo di risolvere la questione altrimenti staremo qui e cercheremo di capirla insieme.... ;)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form indicizzato e variabili pubbliche
« Risposta #6 il: 14 Novembre 2010, 20:08:45 »
Grazie mille Ceskho!

Io credevo che con questa dichiarazione:
Codice: [Seleziona]
Ricetta = New FRicetta(id) As "Ricetta" 

Io pensavo che l' "id" fosse l'indice di Ricetta...

E poi nel _new di FRicetta... mettevo lo stesso parametro, che nel mio caso è un Integer... così:
Codice: [Seleziona]
Public Sub _new(numero As Integer)

A questo punto ho supposto che anche le variabili pubbliche dichiarate in ogni Ricetta(id)... se richiamate altrove, dovevano essere indicizzate con lo stesso (id)...
E ho supposto che in un form esterno per richiamare la variabile pubblica Cognome di Ricetta(id) dovesse fare qualcosa del tipo:

TextBox_della_form_esterna = Cognome(id)

Ma a quanto pare mi sono perso...  :rolleyes:

Quindi... perché chiamando la variabile pubblica di Ricetta da un Form_esterno il programma mi va in errore ("Not  Enough Arguments...")? Tra l'altro mi sono appena accorto che io richiamo la variabile di FRicetta... e non quella della sua istanza (creata dinamicamente). Sto facendo un mare di confusione...  ???

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Form indicizzato e variabili pubbliche
« Risposta #7 il: 14 Novembre 2010, 20:38:12 »
Intanto mi sono riletto, per l'ennesima volta questo help http://www.gambas-it.org/wiki/index.php/Metodi_nascosti.
Almeno agli inizi le guide vanno rilette almeno 2-3 volte a settimana, perché ogni volta si comprendono cose nuove.

Ancora non ci ho capito una mazza sull'indicizzazione...  ;D però ho capito che quelli che io passavo al _new sono solo parametri, e non un indicizzazione!
In pratica se io volessi passare dei valori (o altro) da un form ad un altro potrei anche passarli al ricevente attraverso il _new del ricevente... che gli vengono inviati dall'altro form quando lo apre... E questo sarebbe un buon metodo alternativo per sostituire le variabili globali! Giusto?

Stasera ci provo e poi ti faccio sapere com'è andata...  ;)

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Form indicizzato e variabili pubbliche
« Risposta #8 il: 14 Novembre 2010, 21:49:11 »
Solo un consiglio.
Le variabili globali non sono il male del mondo, ricordatelo. Tengo a precisarlo perché in Gambas, come in molti altri linguaggi di programmazione, non esiste un unico metodo per fare una cosa ma ce ne sono diversi. E tutti sono validi se portano al raggiungimento finale dello scopo per cui si è scritto il programma.

Visita il mio sito personale: http://www.leonardomiliani.com

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: Form indicizzato e variabili pubbliche
« Risposta #9 il: 14 Novembre 2010, 22:10:03 »
Intanto mi sono riletto, per l'ennesima volta questo help http://www.gambas-it.org/wiki/index.php/Metodi_nascosti.
Almeno agli inizi le guide vanno rilette almeno 2-3 volte a settimana, perché ogni volta si comprendono cose nuove.

Ancora non ci ho capito una mazza sull'indicizzazione...  ;D però ho capito che quelli che io passavo al _new sono solo parametri, e non un indicizzazione!
In pratica se io volessi passare dei valori (o altro) da un form ad un altro potrei anche passarli al ricevente attraverso il _new del ricevente... che gli vengono inviati dall'altro form quando lo apre... E questo sarebbe un buon metodo alternativo per sostituire le variabili globali! Giusto?

Stasera ci provo e poi ti faccio sapere com'è andata...  ;)

Nella discussione a cui fai riferimento é anche detto che quando utilizzi il metodo _new per richiamare una form devi anche passare un array contenente tutte le variabili che intendi utilizzare nella Form in chiamata, cioé poni, per es., nell'array[0] la variabile1, nell'array[1] la variabile2, e così via. Se poi la Form ricevente richiama a sua volta un 'ulteriore Form, dovrai passare tutto l'array alla nuova successiva Form, aggiungendovi eventualmente altre variabili  e così via per tutte le altre Form dipendenti l'una dall'altra.
Ciao.
Tieni presente che passi sempre una copia dell'array e non il suo indirizzo.
:ciao:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Form indicizzato e variabili pubbliche
« Risposta #10 il: 15 Novembre 2010, 13:29:35 »
Ricordo anche che ogni form, dato che deriva dall'oggetto Window, ha una proprietà ID che ne identifica univocamente l'oggetto.