Autore Topic: Due form che devono interagire  (Letto 4025 volte)

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Due form che devono interagire
« Risposta #15 il: 29 Marzo 2008, 22:54:17 »
@md9327
Pensavo in prima battuta di aver colto la possibilità pratica di utilizzo del codice che mi hai postato, ma dopo averci provato tutto il giorno (...o quasi) non ho 'cavato un ragno dal buco', niente, non sono riuscito ad adattare neanche una virgola, ed eccomi qua a chiedere ancora aiuto... :muro:  :muro:
Sarebbe gradito un esempio con il codice sopra citato....se non chiedo troppo.
Grazie anticipatamente.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

g.paolo

  • Visitatore
Re: Due form che devono interagire
« Risposta #16 il: 30 Marzo 2008, 10:54:13 »
Non sono certo all'altezza di md9327, ma forse un aiuto te lo posso dare.
Se tu riempi la tua columnview con i dati di una mia_table, ogni valore chiave della medesima corrisponde all'ID della table. Pertanto se tu fai doppio clic su una riga e scrivi il seguente codice, trasmetti alla variabile avvio.posizione (public), il valore chiave del record.

PUBLIC SUB cview_mia_DblClick()                  'SCELTA DEL RECORD DA MODIFICARE
  avvio.posizione = cvAgenti.Key                'numero di riga griglia
  mia_maschera.Show
  ME.CLOSE          
CATCH
  errore 'funzione di intercettazione errori
END



PUBLIC SUB Form_Open()                                      'RIPORTA I DATI DEL RECORD NEI CAMPI MASCHERA
  INC Application.Busy
  WITH connessione
  .Name = percorsoDB
  .Type = "sqlite3"
  .Open
  .Begin
      criterio = "id=&1"
      parametro = avvio.posizione
      Risultato = .Edit("mia_table", criterio, parametro) '
      Tb_uno.Text = risultato!uno
      tb_due.text = risultato!due
      Tb_tre.Text = risultato!tre
      Tb_quattro.Text = risultato!quattro
      Tb_cinque.Text = risultato!cinque
  .Commit
  END WITH
  DEC Application.Busy  
  'la connessione rimane aperta........pronta per le modifiche
CATCH
  errore 'funzione di intercettazione errori
END    

Quando esci salvando i dati, non fai altro che scrivere i dati delle textbox nel vettore "risultato".
Spero di averti aiutato!

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Due form che devono interagire
« Risposta #17 il: 31 Marzo 2008, 11:11:23 »
Ho l'impressione che anche il tuo esempio, seppur esplicativo per i meno profani, sia poco chiaro per il nostro amico.

Cercherò di spiegarmi meglio, sempre che io abbia ben compreso il dilemma, perchè è anche probabile che parliamo di cose diverse.

Se ho ben compreso, il nostro amico vorrebbe comunicare dati tra due form (un padre e un figlio), e attualmente usa variabili pubbliche per il passaggio delle informazioni.
Come ha giustamente dichiarato, la creazione di variabili pubbliche alla lunga può diventare poco manutenibile; l'unica cosa che non mi è chiara, è se queste variabili sono pubbliche per tutta l'applicazione (es. dichiarazione in un modulo), oppure sono pubbliche all'interno della singola classe (es. una form).
Se il primo caso è vero, allora la cosa và giustamente sistemata, eliminando il più possibile queste dichiarazioni globali; nel secondo caso, si può sistemare la cosa, cercando di ottimizzare il codice con un passaggio di parametri tra una form e l'altra. Faccio presente a tornu, che la dichiarazione di proprietà (o variabili) pubbliche all'interno di una classe, oltre all'essere queste variabili facenti parte della classe stessa, è anche normale.

Ora una spiegazione sul passaggio di parametri:
Come possiamo notare dagli spezzoni di codice in questi post, vediamo un uso esclusivo du metodi evento, ovvero quelle funzioni che vengono chiamate in determinate situazione (es. apertura di una form, click del mouse, ecc.). Fino a qui tutto ok.
Però, in gambas, è possibile utilizzare alcuni metodi (dicamo un pò nascosti), che vengono chiamati automaticamente in specifiche situazioni quali: creazione della classe, distruzione della classe, ecc.
Tramite una di queste, è possibile definire una classe in modo che venga creata sulla base di determinati valori, definiti come parametri. La funzione in questione deve essere dichiarata in questo modo:
Codice: [Seleziona]

PUBLIC SUB _new(, , ..., )
END

Il moetodo deve essre dichiarato così come è scritto, tranne che per i parametri.
Questi possono essere dichiarati di qualsiasi tipo e dimensioni, possono essere un numero imprecisato, anche se consiglio di limitarne il numero.
All'interno del metodo è possibile condizionare gli oggetti e, comunque, l'intera classe (anche i controlli), magari salvando in apposite variabili private interne alla stessa classe il contenuto dei parametri:
Codice: [Seleziona]

PRIVATE $var1 AS Object

PUBLIC SUB _new(parm1 AS OBJECT)
'esempio di associazione a variabile interna alla classe
$var1 = parm1
'esempio di modifica di un controllo
ME.CHECKBOX1.Value = parm1.check
END


Ti faccio presente che l'utilizzo di parametri tipo oggetto, invece di tipo base (esempio un Integer), ti permette anche di modificarne gli attributi all'interno della form a cui l'hai passato, così da poterli testare dalla funzione che ha chiamato la form (vedi esempio che ti avevo fatto nei post precedenti).

Tutto questo casino che ti ho scritto, ti permette di eliminare variabili public (o globali) inutili, e anche una gestione più efficace e pulita.

Spero che ora sia più chiaro.

Ciao.

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Due form che devono interagire
« Risposta #18 il: 31 Marzo 2008, 14:38:45 »
Citazione

md9327 ha scritto:
Ho l'impressione che anche il tuo esempio, seppur esplicativo per i meno profani, sia poco chiaro per il nostro amico.

Cercherò di spiegarmi meglio, sempre che io abbia ben compreso il dilemma, perchè è anche probabile che parliamo di cose diverse.

Se ho ben compreso, il nostro amico vorrebbe comunicare dati tra due form (un padre e un figlio), e attualmente usa variabili pubbliche per il passaggio delle informazioni.


Inanzi tutto ti ringrazio per la puntigliosità con cui cerchi di farmi capire il più possibile le tue spiegazioni.
Hai intuito bene le variabili sono pubbliche per tutta l'applicazione e sono dichiarate in un modulo.
Ti riassumo in poche parole l'ambiente in cui mi sto muovendo, praticamente il mio progetto riguarda la gestione dei centri assistenza tecnica (principalmente piccoli e grandi elettrodomestici, dall'iter della riparazione all'emissione dei documenti) il cuore principale del progetto è un form composto da 4 TabStrip da dove richiamo un buon numero di form secondari(tabelle iva, unità di misura,magazzino articoli,listini,ect..) che secondo l'esigenza devono popolare i campi del form principale, i form secondari principalmente contengono delle ColumnView popolate da query da cui seleziono il record che mi interessa e devo popolare i campi del form principale.
ora sono di fretta.....il lavoro chiama, appena rientro mi leggo con attenzione la tua risposta. :leggere:
Ciao

P.S.: Se hai altri suggerimenti, ben volentieri riceverli.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Due form che devono interagire
« Risposta #19 il: 01 Aprile 2008, 15:25:46 »
Bè, penso di aver spiegato abbastanza nel post precedente...
se vuoi il programma, basta che paghi... :-)

Scherzo!!!

Leggi bene le mie spiegazioni, quando hai tempo, poi semmai, se hai dubbi, esprimi i tuoi dubbi senza problemi.

Ciao!

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Due form che devono interagire
« Risposta #20 il: 09 Aprile 2008, 22:35:50 »
Citazione

md9327 ha scritto:
Come suggerito per le proprietà PUBLIC di un oggetto, puoi tranquillamente scriverci sopra dalla form madre, ovvero puoi crearti l'oggetto form figlio e poi popolare i controlli di questa form con i dati che vuoi, direttamente dalla form madre, quindi apri la form figlia.
Un'altra alternativa, che uso di norma, è passare un oggetto (tipo Collection o Object[] o Variant[], insomma un array) con i dati che popoli preventivamente dalla form madre; in questo caso, ad inizio codice della form figlia, devi aggiungere il metodo:

PUBLIC SUB _new(var as Object[])
END

la variabile "var" contiene tutti i dati necessari al popolamento della form figlia, che ti crei prima della sua creazione dalla form madre e li passi in questo modo:

SUB Apri_Form_Child()
  DIM f as FormChild 'la tua form figlia
  DIM data as NEW Collection
  data.Add(var_dato1, 'dato1') 'valore, id
  data.Add(var_dato2, 'dato2') 'valore, id
  f = NEW FormChild(data)
  f.ShowModal()
END

Come vedi, "data" è un oggetto Collection, in cui inserisci i valori che ti servono per popolare la FormChild; il valore è identificabile dal relativo id. Dopodiche crei la FormChild e gli passi "data"; all'interno di FormChild ti prendi data e ci fai quello che ti pare, inoltre puoi anche utilizzare "data" per ritornare alla form madre altri dati... insomma come ti pare...


E' chiaro ?

Bye


Eccomi qua di nuovo, scusami md9327 ma sono un po tosto a capire certi passaggi, come passo il valore di "data" per esempio ad una TextBox, credimi ho provato in cento modi diversi ma non trovo la sintassi giusta.
Grazie, ciao
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Due form che devono interagire
« Risposta #21 il: 10 Aprile 2008, 14:10:23 »
Nella form Child, devi scrivere il metodo "_new()", così come ti avevo indicato, mettendo tra le parentesi il parametro che la form prenderà quando verrà chiamata.
Ipotizziamo che tu voglia passare alla form figlia un array di dati di tipo stringa, con cui vuoi popolare i controlli della suddetta form, il code potrebbe essere:

'---
' Metodo chiamato da gambas durante la creazione della form
'
' @parametro1: array
'
PUBLIC SUB _new(data as Object[])
 ME.TextBox1.Text = data[0]
 ME.TextBox2.Text = data[1]
END

come puoi vedere dall'esempio, il metodo si prende il parametro array, e i valori li carica nelle textbox.

Se, per caso, vuoi che queste textbox siano in grado di modificare i dati contenuti nell'array, in modo che la form Madre ci faccia qualche cosa (o ne condizioni le funzioni), non fai altro (dato che hai passato un oggetto) che salvarti l'oggeto in una variabile private della form Figlia e, prima della Close() della form, riassegni le modifiche, come nell'esempio:

PRIVATE $data AS Object[]

'---
' Metodo chiamato da gambas durante la creazione della form
'
' @parametro1: array
'
PUBLIC SUB _new(data as Object[])
 $data = data
 ME.TextBox1.Text = data[0]
 ME.TextBox2.Text = data[1]
END

'---
' Evento scatenato dal click del pulsante di chiusura
'
PUBLIC SUB ButtonClose_Click()
  $data[0] = ME.TextBox1.Text  
  $data[1] = ME.TextBox2.Text  
  ME.Close()
END

Dato che in Gambas gli oggetti vengono sempre passati per riferimento (nella prossima versione 3 aggiungeranno un'ulteriore opzione), le modifiche fatte all'oggetto vengono scritte sempre sull'oggetto originale; diciamo che il nome tra i vari passaggi è puramente indicativo, la zona di memoria resta la stessa.

Comprì ?

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re: Due form che devono interagire
« Risposta #22 il: 10 Aprile 2008, 23:26:14 »
@md9327
Niente da fare, con tutte le prove che ho fatto l'unica cosa che riesco ad ottenere e un bel:
not enough arguments
non riesco a capire la logica delle tue istruzioni e di conseguenza ad applicarle, mi sa che dovrò abbandonare questa strada e trovarne un'altra, non ho idea quale, ma continuerò a provare.
Grazie comunque per le tue risposte.
ciao
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.256
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Due form che devono interagire
« Risposta #23 il: 11 Aprile 2008, 07:39:49 »
@leo
domandina da principiante dell'informatica: di norma le funzioni di una form sono public, se non serve che siano public il fatto di metterle private fa risparmiare risorse? do' il permesso di inserire sta domanda nello stupidario del forum :-)

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.256
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Due form che devono interagire
« Risposta #24 il: 11 Aprile 2008, 07:44:00 »
@luigi
domanda collegata al mio precedente post: il fatto di creare 'al volo' una form e di passare i dati in modo siffatto fa risparmare risorse al sistema? creare direttamente la form appesantisce il programma? con il tuo prezioso post sto ripensando di riscrivere parte del mio programma, anche se non mi sembra appesantito. forse dovrei limare qualche funzione.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Due form che devono interagire
« Risposta #25 il: 11 Aprile 2008, 16:36:47 »
Tanto per chiarire:

qualsiasi cosa crei, a prescindere da come la crei, vengono utilizzate risorse.

Di certo l'utilizzo di variabili temporanee, ad esempio quelle create all'interno di un metodo per uso propriamente interno allo stesso metodo, a volte possono impegnare risorse inutili; dico "a volte", perchè la cosa dipende sia dall'obbligatorietà dell'utilizzo (es. non posso proprio farne ameno), sia per rendere più leggibile il codice.

Il passaggio di parametri è sicuramente utile, sia per non dover appesantire e sovraccaricare la memoria utilizzata per mantenere le variabili PUBLIC, sia per un utilizzo dinamico delle procedure.
Inoltre il passaggio di parametri ti permette di controllare meglio il flusso logico delle procedure, mentre con le pubbliche c'è sempre il rischio che qualcosa fuori del tuo controllo vada ad incasinarle.

Il discorso è abbastanza ampio e complesso !

Circa l'appesantimento di una form creata dinamicamente o da ide, la cosa non ha nessuna differenza; il discorso invece sul cosa vuoi fare di questa form ! E' statica ? Bene, allora la disegno una volta per tutte, e via... E' dinamica ? Bene, allora scelgo di impostarne una parte direttamente dall'ide, e poi creo l'apposito codice per controllarla dinamicamente... oppure la creo tutta dinamicamente...

Le scelte dipendono sempre da quello che si vuol ottenere; le modalità per raggiungere l'obbiettivo possono essere molteplici...

Riguardo alle variabili PRIVATE: questo tipo di variabili (ma possono essere anche metodi), ti permettono di controllarne il funzionamento. Con PRIVATE tu rendi la var visibile e utilizzabile solo all'interno dell'oggetto che l'ha creata, e non permette l'accesso diretto dall'esterno; questo di permette, ad esempio, di creare PROPERTY che analizzano PRIMA il dato che stai tentando di scrivere nella var...


Ora devo andare, riprendo dopo...

Ciao

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.256
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Due form che devono interagire
« Risposta #26 il: 11 Aprile 2008, 19:17:31 »
grazie x l'approfondimento

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Due form che devono interagire
« Risposta #27 il: 16 Aprile 2008, 12:20:27 »
Di nulla ! :-)

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Due form che devono interagire
« Risposta #28 il: 17 Aprile 2008, 11:30:00 »
Luigi già ti ha risposto.
Cmq, tieni presente una cosa: a meno che tu non stia progettando un motore 3D da usare in giochi alla Quake, la velocità dell'applicazione è l'ultima cosa di cui preoccuparti (vale a dire l'ultima cosa da ottimizzare).

Inizialmente è bene strutturare ottimamente il codice, in modo da non avere ripetizioni di funzioni od altro (per questo ci sono le classi apposta), che il tutto sia snello e pulito.
Poi puoi passare all'affinamento.

Ma, ripeto, sempre relativamente all'obiettivo finale. Ho scritto tempo fa un paio di programmi in cui la velocità era importante: uno è un software di crittazione, l'altro un test di algoritmi di ordinamento. Su entrambi la velocità è il primo punto essenziale! E mi sono accorto che, spesso, bastava sostituire un'istruzione con un'altra (ad esempio un for con un do-while o viceversa) per cambiare di molto le cose.

Ma in un software diciamo "tranquillo" puoi benissimo dedicarti ad altro.

P.S.:
anche il problema delle risorse occupate è relativo. Con i PC odierni, con minimo 1 GB di Ram, se la tua applicazione occupa 100 KB in Ram piuttosto che 50 KB non penso che appesantisca molto il sistema.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Due form che devono interagire
« Risposta #29 il: 20 Aprile 2008, 16:21:55 »
Piccolissima aggiunta alle note di leo:
- seppur piccole le dimensioni di un singolo programma (o processo), se la quantità di questi è esagerata, alla fine fondi il sistema... Un'occhiatina è sempre meglio darla...

Per aggiungere forza al tuo discorso, posso dirti dal basso della mia esperienza, che personalmente divido il software in due blocchi: real-time e gestionale.
Per real-time includo tutto quello che si basa esclusivamente su un'analisi attenta e approfondita della velocità di esecuzione, l'ottimizzazione, e il controllo in vero real-time di un qualsiasi processo; per gestionale tutti gli altri, compresi i software che necessitano di velocità a causa di, ad esempio, una quantità di accessi ad una base dati. E' ovvio che, dipenedentemente da quello che devono fare o operare, anche per un gestionale và affrontato il problema velocità, in parallelo alla parte grafica e all'ottimizzazione ma, ad ogni modo rimane comunque, almeno per me, in una zona freddo/tiepida.

Sul discorso dei tempi di risposta di alcune istruzioni ti dò perfettamente ragione; a suo tempo combattevo con il C/C++ e con applicazioni in reale real-time, e quindi era d'obbligo un'analisi, e relativi test, per la scelta di un comando piuttosto che un'altro. Questo dipendeve, ovviamente, da come era stato implementato, e per alcuni senza un'occhio di riguardo al perfezionamento delle caratteristiche di velocità e ottimizzazione in generale.