Anche tu hai ragione, per certi versi.
Io non ho mai detto esplicitamente che non si debba dare un aiuto, per così dire, esplicito, ma solo che a volte, per svogliatezza, o per mancanza di provare prima l'idea con i propri mezzi, si passa subito a chiedere.
E' sottinteso che, se una logica non viene capita, o intesa male, è giusto chiedere in relazione ai dubbi che uno ha, magari chiedendo anche un esempio concreto. E' anche ovvio che non si può chiedere di risolvere completamente un'idea, fornendo pure il codice completo.
Quello che tento di fare, o di divulgare, è che per raggiungere un fine/scopo in informatica le strade possono essere molteplici.
Io posso fornire, a seconda delle mie conoscenze, fatte poi sul campo e sulla mia pelle, spunti e idee per risolvere un dato quesito, o fornire lumi per quanto riguarda un determinato comporamento di un componente e/o metodo, ma la cosa, secondo me, deve terminare lì...
Stà poi al richiedente, sviluppare quanto appreso, provando e riprovando, e magari riporre un'ulteriore quesito, ma in questo caso più mirato.
Devo anche dire che io non mi esprimo molto bene, e a volte certi concetti non riesco a spiegarli tali da renderli comprensibili a tutti. Non è perchè io sono un guru, ci mancherebbe... ma è che mi esprimo più con i fatti.
Molte delle conoscenze ed esperienze fatte, a parte anche con altri linguaggi, con gambas, sono inclusi e concentrati nei miei progetti. Ed è per questo che invito sempre a scaricare i miei programmi, che hanno lo scopo principale di sviluppare il più possibile quanto offre gambas.
Ritornando a monte, sulla richiesta iniziale, possiamo andare a specificare maggiormente cosa volevi ottenere, cosa intendevo io per gestione multiarray, e via dicendo, senza andare sulla critica, in quanto oltre che non produttiva, non è utile a nessuno, e il comportamento in risposta di ognuno di noi non può essere soggetto a analisi e critiche varie.
Comunque, dato che ora sono a casa, e ho un pò di tempo da dedicare a leggere e cercare di rispondere in aiuto alle varie discussioni, posso cercare di specificare meglio i concetti che ho cercato di sintetizzare inizialmente.
Gambas ha vari tipi di variabile, tra cui la possibilità di gestire delle collezioni di dati, in questo caso vengono in aiuto gli array.
Per definizione generale, e per scelta dell'ideatore di gambas, sono presenti array di tipo monodimensionale, ovvero una colonna per riga e quindi un dato per riga, e array multidimensionali, ovvero più colonne per singola riga.
Oltre agli array è presente anche un'altro tipo, anzi una classe, che è Collection, che gestisce una array indicizzato per chiave. Andando a leggere la documentazione, si puà associare una colonna con un nome chiave. Questo oggetto è utile in quei casi in cui vogliamo identificare univocamente una colonna.
Gli array dispongono di tutti i metodi necessari per gestire in modo dinamico i dati ivi contenuti, come ad esempio l'aggiunta, l'inserimento, l'eliminazione o la modifica dei suoi elementi. Quindi è possibile dimensionare dinamicamente un array.
Di array ce ne sono di tipo diverso, e mediamente si basano sui tipi base: Integer, Byte, Boolean, Long, ecc.
Ricordo che tra i tipi base c'è anche il Variant. Questo è un tipo particolare, che ci permette di definire valori di vario tipo (si chiama appunto Variant), anche nello stesso array. Quindi, utilizzando un Variant[], potremmo inserirgli valori Integer, Boolean o Long, per singola cella, o canbiare una cella con un valore di tipo diverso. Questo ci permette di fare molte cose, tra cui pure memorizzare oggetti insieme a tipi base, Integer con TextBox, e via dicendo. Stà poi al programma capire di che tipo è una determinata cella, e agire di conseguenza (vedi Object.Type() o TypeOf()).
Detto questo, a questo punto abbiamo due alternative, dipendentemente dallo scopo, ovvero possiamo usare gli array base forniti da gambas, oppure creare oggetti che ampliano le funzionalità di questi tipi base, o che gestiscono in modo diverso una serie di dati, misti o di stesso tipo.
L'altra alternativa è l'uso degli oggetti. La cosa non porta fuori discorso, in quanto gli array sono oggetti essi stessi.
Tramite una classe specializzata, possiamo gestire dati in modo dinamico, come anche subarray.
Gambas offre molte funzionalità per creare oggetti di tipo array, e in PgDesigner3 (per esempio) li uso a man bassa.
Secondo lo scopo, io di solito creo una classe, che al suo interno ha una variabile array. Tramite le funzioni nascoste di gambas, è possibile usare la classe proprio come un array, e gestire i suoi elementi come più ci piace. Oltre a questo possiamo inserire eventi, proprietà particolari, metodi specializzati, adatti allo scopo che ci prefiggiamo di ottenere.
Giusto per dare qualche spunto, anche perchè descrivere la cosa a livello di codice sarebbe troppo onerosa, allego un paio di classi contenute in PgDesigner, che uso per gestire le impostazioni/setting del programma.
Le classi contenute nello zip, mi permettono di gestire un array di gruppi (PgConfigGroup) di item (PgConfigItem). Come si può notare nella classe dei gruppi, è l'uso dei metodi nascosti: _get(), _put() e _next(), che permettono di usare la classe come un array di gambas, ovverro puntare ad un elemento tramite un indice (es. group[3] = xyz), oppure scorrere l'array con le istruzioni fornite da gambas (FOR EACH item in group, dove item è di tipo PgConfigItem).
Tanto per aggiungere carne sul fuoco, all'inizio delle classi, si può notare l'uso di altri metodi nascosti: _call(), _new(), _free() e _unknown().
Il primo metodo permette di usare la classe come fosse una funzione, ovvero ritorna una nuova istanza della classe, basta usarla così:
DIM pippo AS PgConfigGroup = PgConfigGroup("xyz","zyx")
...
altrimenti
...
DIM pippo AS New PgConfigGroup("xyz","zyx")
Il secondo e il terzo metodo identificano rispettivamente il costruttore e il distruttore della classe. Questi due metodi vengono chiamati (indipendentemete se dichiarati esplicitamente nel codice o meno) da gambas, rispettivamente quanto l'oggetto viene creato e distrutto. Nel primo metodo, si possono quindi definire e impostare i valori base e le proprietà dell'oggetto, e questo anche se è un'oggetto grafico (es. una Form). La seconda classe è utilizzabile per pulire determinate situazioni (es. una connessione), che magari non sono state completate correttamente a causa di un'errore nella classe.
Il terzo metodo viene chiamato quando, ad esempio, si esegue una chiamata ad una proprietà o metodo inesistenti nell'oggetto, chiamati da un pezzo esterno di programma, o anche dalla stessa classe. Negli esempi che ho postato, uso questo metodo per scatenare degli eventi che verranno catturati da codice superiore per, per esempio, emettere un messaggio di warning, o loggare la situazione in un file di log.
Non sò se tutto quanto scritto sopra abbia in qualche modo spiegato alcuni dubbi. Magari, sull abase di queste informazioni, si può tentare di dare spiegazioni più particolareggiate su dubbi più specifici.