Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: akrobaticone - 18 Luglio 2010, 09:44:07

Titolo: Evento change in listbox
Inserito da: akrobaticone - 18 Luglio 2010, 09:44:07
Come da titolo avrei bisogno di generare un evento ogni volta che avviene un cambiamento in una list box, togliendo o aggiungendo un item
purtrobbo la listbox non prevede l'evento change
Come posso fare?

Grazie

Titolo: Re: Evento change in listbox
Inserito da: ealmuno - 18 Luglio 2010, 09:50:05
puoi usare click o select, cioè quando si clicca o si seleziona un elemento, oppure quando vai a inserire o eliminare un item non fai altro che richiamare l'evento
Titolo: Re: Evento change in listbox
Inserito da: akrobaticone - 18 Luglio 2010, 09:57:38
il problema è che l'inserimento del nuovo item viene effettuato da piu routine in  altre parte del programma, quindi non intervengo direttamente sul controllo
L'evento mi serve per ordinare ogni volta gli elementi della listbox stessa

 
Titolo: Re: Evento change in listbox
Inserito da: ealmuno - 18 Luglio 2010, 10:05:00
credo che sia l'unico metodo quello di richiamarlo, intanto basta una riga di codice.
Titolo: Re: Evento change in listbox
Inserito da: Picavbg - 18 Luglio 2010, 10:07:09
Come da titolo avrei bisogno di generare un evento ogni volta che avviene un cambiamento in una list box, togliendo o aggiungendo un item
purtrobbo la listbox non prevede l'evento change
Come posso fare?
Grazie

Ritengo che tu ti riferisca all'intercettazione di un cambiamento automatico nella ListBox, comandato, probabilmente da programma al verificarsio di una certa condizione che, tuttavia, non é direttamente determinabile.
Io creerei una casella di testo con la proprietà visibile=False ed ogni volta che da programma aggiungerei, cancellerei o modificherei un riga dalla ListBox.List, andrei a scrivere un crt nella suddetta TestBox. Scatenerei così un evento change in quest'utima e dentro l'evento mi comporterei di conseguenza, secondo le necessità.  ;)

Ovviamente esistono tante altre soluzioni, ma l'importante é ottenere quello che si desidera.
 :( :(


Titolo: Re: Evento change in listbox
Inserito da: ealmuno - 18 Luglio 2010, 10:17:45
comunque dovrebbe agire sempre nel codice ed equivale alla soluzione da me proposta, solo che qui aggiungeresti una textarea.
Titolo: Re: Evento change in listbox
Inserito da: akrobaticone - 18 Luglio 2010, 10:24:29
ok chiaro
 essendo le routine dislocate in diversi punti del programma volevo evitare di scrivere più volte il richiamo alla routine di cambiamento
più che altro per evitare di dimenticare qualche cosa per la strada e non complicare ulteriormente il codice


Grazie per le risposte

Titolo: Re: Evento change in listbox
Inserito da: Ceskho - 18 Luglio 2010, 12:36:24
ok chiaro
 essendo le routine dislocate in diversi punti del programma volevo evitare di scrivere più volte il richiamo alla routine di cambiamento
più che altro per evitare di dimenticare qualche cosa per la strada e non complicare ulteriormente il codice


Grazie per le risposte



Crea un modulo all'interno del quale scrivi una funzione pubblica che chiamerai Modifica. Al suo interno scrivi la routine di riordino della listbox e quando ti serve chiami una sola funzione che sostituisce tante righe di codice da copiare e incollare!
Titolo: Re: Evento change in listbox
Inserito da: Picavbg - 18 Luglio 2010, 15:40:57
ListBox.List
puoi usare click o select, cioè quando si clicca o si seleziona un elemento, oppure quando vai a inserire o eliminare un item non fai altro che richiamare l'evento
Quando ho cominciato a scrivere la risposta la tua non era ancora arrivata, però, per quello che ricordo, non credo che gli eventi click e select, possano essere generati automaticamente, potrebbe eventualmente richiamarli con:
1) ListBox_Click() o ListBox_select() se la modifica viene eseguita dentro la stessa form della ListBox;
2) Formx.ListBox_Click() o Formx.ListBox_select() se la modifica viene eseguita fuori dalla  form della ListBox.
Non sono sicuro, ma il richiamo di una ListBox_select() potrebbe addirittura trasferire la riga selezionata nella ListBox.Text.

Poi, come ho detto nella mia prima risposta, esistono tante altre soluzioni, tutte ugualmente efficaci. Questo é il bello della programmazione. Infatti non sussiste la soluzione, ma esistono le soluzioni e, l'una vale l'altra, l'importante é non fare il giro del mondo per arrivare al bar dietro l'angolo.
 :) :)
Noi non sappiamo se
Citazione
le routine dislocate in diversi punti del programma
sono tutte dentro la form della ListBox o meno.

@Akrobaticone:
Potresti chiarirci in proposito e, soprattutto, per sommi capi, il lavoro che andresti a svolgere una volta intercettata la modifica della ListBox.List?

Personalmente sono convinto che una compilazione di richiesta di aiuto, concisamente dettagliata, possa rendere l'aiuto più rapido e mirato che non un'indicazione vaga nella quale, ognuno che voglia dare una mano, può interpretare quello che vuole, secondo la propria visibilità del problema.
Sbaglio ?  ;)
 :( :(
Titolo: Re: Evento change in listbox
Inserito da: akrobaticone - 18 Luglio 2010, 21:48:16
per essere più chiaro
ogni volta che inserisco un item nella listbox tutti i dati presenti devono essere riordinati con un criterio che stabilisco con una combobox

l'inserimento può avvenire in diverse parti del programma e per comodità e semplicità volevo evitare di chiamare la funzione di riordino in ogni routine che inserisce i dati
quindi, automaticamente ad ogni cambiamento a prescindere da dove esso avvenga, i dati si riordinano automaticamente secondo il criterio predefinito
tutte le routine tranne una sono all'interno della form della list box

non è indispensabile, ma poteva essere comodo.
in ogni caso definirò una funzione di riordino in un modulo e la chiamerò dalle varie posizioni ove avvengono gli inserimenti

a pensarci bene sono solo un po pigro......
Titolo: Re: Evento change in listbox
Inserito da: milio - 18 Luglio 2010, 22:38:56
Io non la vedo una questione di pigrizia :)

Al tuo posto se veramente in molteplici punti del mio programma devo fare il riordino ad ogni aggiunta alla listbox farei una piccola modifica al metodo ListBox.Add()
Creo una nuova classe:


Codice: gambas [Seleziona]
INHERITS ListBox
EVENT NewItem

PUBLIC SUB Add(Text AS String, OPTIONAL {Index} AS Integer = -1)

  SUPER.Add(Text, Index)
  RAISE NewItem

END


e dopo richiamo il mio componente:


Codice: gambas [Seleziona]
PUBLIC ListBox1 AS CListBox

PUBLIC SUB _new()

  ListBox1 = NEW CListBox(ME.Panel1) AS "ListBox1"

END


PUBLIC SUB Form_Open()



END

PUBLIC SUB Annulla_Click()

  ME.ListBox1.Add("Ciao")

END

PUBLIC SUB ListBox1_NewItem()
 
  Message("Hai aggiunto un nuovo elemento alla lista!")
 
END


In questo modo ogni volta che aggiungo un elemento alla lista va a scatenare l'evento NewItem

ti allego anche un esempio
Titolo: Re: Evento change in listbox
Inserito da: akrobaticone - 18 Luglio 2010, 23:15:56
Caspita, ci sono un bel po di spunti su cui ragionare 
sto imparando un sacco di cose nuove

provo a  scrivere qualche cosa con questo metodo e ti aggiorno sui risultati
Grazie
Titolo: Re: Evento change in listbox
Inserito da: Picavbg - 18 Luglio 2010, 23:21:54
@ milio :
Codice: [Seleziona]
INHERITS ListBox  
EVENT NewItem  
Interessante. Potresti spiegare brevemente il meccanismo INHERITS e se vi siano altri casi pratici in cui convenga usarlo?
Ricordo di avere letto qualcosa su una guida quando ho cominciato ad approcciarmi con Gambas, ma, inutile dirti che non l'ho capito; questa potrebbe essere l'occasione per fare un salto di qualità conoscitiva.
Grazie anticipate. :)
Titolo: Re: Evento change in listbox
Inserito da: milio - 18 Luglio 2010, 23:32:15
INHERITS scritto all'interno di una classe fa 'capire' all'interprete di gambas che quella classe e' inerente all'oggetto successivamente scritto dopo...

Cioe' se scrivo:

INHERITS ListBox

La mia classe eredita tutte le proprieta, metodi ed eventi dell'oggetto ListBox.
A questo punto, e qui viene il bello ;) , posso decidere di modificarne le proprieta'/metodi dell'oggetto andando semplicemente a dichiarare proprieta'/metodi con lo stesso nome delle proprieta'/metodi dell'oggetto 'originale'
Ovviamente posso anche dichiarare proprieta'/metodi nuovi e scatenare anche nuovi eventi (come nel caso del nostro amico Akrobaticone)

Non so se mi sono spiegato bene, ma comunque se ti scarichi l'esempio allegato capirai ;)
Titolo: Re: Evento change in listbox
Inserito da: akrobaticone - 18 Luglio 2010, 23:39:51
scusa millio
ho aperto l'esempio che hai allegato e manca il Modulo1
è per caso quello dove dichiari con il metodo Inherits?
Titolo: Re: Evento change in listbox
Inserito da: Picavbg - 18 Luglio 2010, 23:54:05
@ milio :
L'ho già scaricato, ma quest'ora devo creare una nuova classe  :sleepy:
Lo vedrò domani.
Grazie, se non capirò ti  :coder: di nuovo.
Buona notte!
Titolo: Re: Evento change in listbox
Inserito da: milio - 18 Luglio 2010, 23:58:12
@Akrobaticone

Scusa ma ho fatto un po' di casino riprendendo un progetto che avevo usato come prova, e ho cancellato il Module1 senza poi, prima di creare il pacchetto sorgenti, ricompilare il tutto...
Comunque l'esempio funziona lo stesso, basta che lo ricompili tu...
La classe che ti interessa si chiama CListBox

@Picavbg

Buona notte
Titolo: Re: Evento change in listbox
Inserito da: akrobaticone - 19 Luglio 2010, 00:05:30
Ok tutto chiaro
Buonanotte
Titolo: Re: Evento change in listbox
Inserito da: milio - 19 Luglio 2010, 00:10:01
E buonanotte anche a te  :sleepy:
Titolo: Re: Evento change in listbox
Inserito da: Ceskho - 19 Luglio 2010, 00:28:46
@ milio :
Codice: [Seleziona]
INHERITS ListBox  
EVENT NewItem  
Interessante. Potresti spiegare brevemente il meccanismo INHERITS e se vi siano altri casi pratici in cui convenga usarlo?
Ricordo di avere letto qualcosa su una guida quando ho cominciato ad approcciarmi con Gambas, ma, inutile dirti che non l'ho capito; questa potrebbe essere l'occasione per fare un salto di qualità conoscitiva.
Grazie anticipate. :)

http://www.gambas-it.org/wiki/index.php/INHERITS
Titolo: Re: Evento change in listbox
Inserito da: Picavbg - 19 Luglio 2010, 22:32:52
@ Milio:
Ho guardato il codice che hai allegato alla rispo n.10, ma Non ho trovato la funzione INHERITS, però lanciando il programma vedop che fa esattamente quello che hai detto e, francamente non riesco a collegare la pratica con la teoria.
 ???
Ciao.
Titolo: Re: Evento change in listbox
Inserito da: akrobaticone - 19 Luglio 2010, 23:00:28
la   definizione INERITHS la trovi nella classe CListBox
da quanto ho capito permette di derivare da una classe esistente una nuova classe nella quale aggiungo metodi o eventi personalizzati
nel caso in oggetto costruisco una nuova classe CListBox derivata dalla classe ListBox aggiungendo l'evento NewItem
Non so come è strutturata al suo interno tale classe, ma alle funzionalità già presenti ne affianco una nuova.
Correggetemi se sbaglio

Titolo: Re: Evento change in listbox
Inserito da: Ceskho - 20 Luglio 2010, 00:00:13
...
da quanto ho capito permette di derivare da una classe esistente una nuova classe nella quale aggiungo metodi o eventi personalizzati
...

;)...è proprio così! Bravissimo!
Titolo: Re: Evento change in listbox
Inserito da: akrobaticone - 20 Luglio 2010, 00:03:09
...
da quanto ho capito permette di derivare da una classe esistente una nuova classe nella quale aggiungo metodi o eventi personalizzati
...

;)...è proprio così! Bravissimo!

:2birre: :2birre:
Titolo: Re: Evento change in listbox
Inserito da: milio - 20 Luglio 2010, 00:08:52
Bravo, sei riuscito a capirne il concetto nonostante io sia un cane come docente  ;D

Meno male che c'e' Ceskho  :2birre:
Titolo: Re: Evento change in listbox
Inserito da: md9327 - 20 Luglio 2010, 14:06:19
I complimenti a "cesko", che ha fatto il suo dovere di webmaster... :-)

Scherzi a parte, ragazzi, perchè non leggete? Poi magari, se le cose non sono chiare si domanda, e magari è utile per migliorare il nostro wiki...

Mi dispiace di avere poco tempo per continuare a scrivere sul wiki, ma il lavoro già fatto mi sembra quantomeno sprecato se nessuno lo legge.

Leggete...leggete...e moltiplicatevi... (ops, forse la frase era un'altra...) :-)
Titolo: Re: Evento change in listbox
Inserito da: Picavbg - 21 Luglio 2010, 15:58:07
Benissimo! Ho riletto il Wiki.Inherits e probabilmente ho capito qualcosina in più. Volendo metterlo in pratica, potrebbe aiutarmi a gestire più semplicemente la seguente casistica:
Nella Form allegata al presente post ho segnato con una freccia la frame contenente le caselle di digitazione del dettaglio della resta di Cassa giornaliera.
Devo anche dire che nel mio programma non é necessario  che le giornate contabili siano obbligatoriamente consecutive, né come data né come successione di Entrate e Uscite. Inoltre posso registrare i movimenti di una giornata ad una certa data, lasiarla aperta o chiuderla, indifferentemente,  e nel frattempo registrare i movimenti di un'altra giornata di un altra settimana, un altro mese un altro anno.
Esiste solamente una necessità logica: Devo sempre avere od ottenere il saldo alla chiusura precedente con la corrispondente resta di cassa, dettagliata.

Spero di essere riuscito a rendere comprensibile  il mio concetto, estremamente contabile e tecnico allo stesso tempo.

Se il mio ragionamento risulta chiaro, si dovrebbe intuire chedentro la frame di cui parlo potrei dovere inserire le voci di dettaglio della Resta di cassa a fine della giornata contabile corrente, oppure quelle della giornata contabile logicamente immediatamente precedente a quella corrente. Potrei perciò utilizzare per l'una condizione (Es. la fine della giornata contabile corrente) la frame della Form, nella sua impostazione nativa, mentre per l'altra condizione (Es. la ripresa della resta chiusura della giornata contabile precedente) potrei creare una classe INHERIT. Infatti nel primo caso le funzioni al suo interno punterebbero alle variabili ed alle tabelle di DB per la gestione dei dati di chiusura della giornata corrente, mentre, nel secondo caso, le funzioni all'interno della classe INHERIT punterebbero  alle variabili ed alle tabelle di DB per la rilevazione dei dati di chiusura della giornata immediatamente precedente.

Se ho capito, intanto, datemi un segno, e poi mi chiedo: Ma tutto questo non é più dispendioso di energie per memoria e righe scritte, rispetto a procedere con test di riconoscimento della condizione digitativa negli eventi interessati delle singole caselle?  ???
 :( :(
Titolo: Re: Evento change in listbox
Inserito da: md9327 - 22 Luglio 2010, 10:43:30
Premetto che dal tuo discorsetto non ci ho capito un'acca, ma potrei essere io con l'età che avanza... :-)

Come scritto nel wiki, l'uso di INHERIT, ti permette di creare classi simili da un template con funzionalità generiche. Le classi derivate vengono poi specializzate, inserendogli funzionalità aggiuntive, in aggiunta a quelle ereditate dal template.
Il come usarle poi, è dipendente dalla logica che vuoi applicare, ma è necessario fare bene attenzione, e capire bene al concetto, prima di mettersi a scrivere codice confuso.

COme ho detto, poco ho capito di quello che vuoi fare, ma penso di averne un'idea... Penso che il tuo bel programmino faccia uso di un db, per cui l'analisi e l'estrazione di dati, con particolari condizioni (vedi totale resta giorno attuale, o giorni precedenti) si possa fare tranquillamente con delle query apposite, che nulla hanno a vedere con il concetto di ereditarietà di classe.
Titolo: Re: Evento change in listbox
Inserito da: Picavbg - 22 Luglio 2010, 17:35:20
Come scritto nel wiki, l'uso di INHERIT, ti permette di creare classi simili da un template con funzionalità generiche.
 Le classi derivate vengono poi specializzate, inserendogli funzionalità aggiuntive, in aggiunta a quelle ereditate dal template.
Il come usarle poi, è dipendente dalla logica che vuoi applicare, ma è necessario fare bene attenzione, e capire bene al concetto, prima di mettersi a scrivere codice confuso.
A me risulta purtroppo difficile capire il funzionamento dell'insieme 'ingranaggi'  del tipo, Classi, Inherit, Template. Per cui per andare avanti più speditamente sarei portato ad inserire nei singoli controlli deviatori logici da interrogare per scoprire la gestione del flusso di programma.
Il codice, come ben sai, é solamente il carburante di cui ha bisogno  il motore per trattare i dati, per cui, é necessario conoscere bene i singoli componenti del motore stesso che nel nostro caso si chiama Gambas. Leggerne il funzionamento non é conoscerlo; per conoscerlo, bisogna studiarne nella pratica i componenti associandoli ai compiti che sono chiamati a svolgere e riscontrandone possibilmente i comportamenti.
Purtroppo, in questa fase sto facendo fatica a capire gli argomenti suddetti.
Da qualche giorno ho più chiaro il concetto di classe e del passaggio di dati fra classi diverse; Ho messo in pratica quello che ho capito e riesco  a masticarle senza perdere la dentiera. :D
Ora sto cercando di capire Inherit ed il concetto di Template, tutti e due, a me, e sufficientemente ostici. Da quello che hai indicato nella tua rispota, quando parli di Template, credo che ti riferisca ad una sorta di oggetto-scheletro, che può essere una casella del Form, una griglia, ..., una frame con tutti gli oggetti definiti al suo interno, un pannello, oppure lo stesso Form.
Poi bisognerebbe ricorrere alle Classi conteneti l'istruzione Inherit che utilizzano lo stesso scheletro, ma costruendoVi attorno il corpo di funzioni che permettono di fargli assumere sembianze diverse.

Citazione
... Penso che il tuo bel programmino faccia uso di un db, per cui l'analisi e l'estrazione di dati, con particolari condizioni (vedi totale resta giorno attuale, o giorni precedenti) si possa fare tranquillamente con delle query apposite, che nulla hanno a vedere con il concetto di ereditarietà di classe.
Si, certo, ma ciascun controllo della frame dovrà gestire a seconda delle necessità, all'apertura della Form, la digitazione  dei componenti  della resta di cassa di una giornata precedente a quella corrente ed alla fine, per la quadratura della giornata corrente, i componenti  della resta di cassa propri della giornata corrente , quindi la ricerca e l'inserimento nel DB dei dati appartenenti alle stesse tabelle utilizza parametri con contenuti diversi.

Ora se quanto capito sul concetto di Inherit, é in linea di massima corretto, dovrò capire se é utile applicarlo alla Form che sto sviluppando, oppure se gestendo opportunamente le query posso evitare di fare ginnastica-mentale, specialmente in questo perido di caldo afoso. ;D
 :( :(
Titolo: Re: Evento change in listbox
Inserito da: Ceskho - 23 Luglio 2010, 00:15:49
Ti faccio un esempio nella speranza di farti capire Inherit.

Immagina di dover descrivere una situazione famigliare con le classi: hai una classe di nome Padre. Da essa vogliamo derivare una classe Figlio. Facciamo finta che questo figlio, quando nasce, eredita tutto (ma proprio tutto) del padre: colore degli occhi, altezza, colore capelli, difetti fisici, etc.....

Questo figlio sa anche fare tutto quello che fa il padre: leggere, camminare, scrivere, parlare, etc....

Bene! il bambino è nato già tutto formato e tale e quale al padre (mistero dela fede... :D) però pare che questo bambino, a differenza del padre, sappia anche nuotare.

È qui che entra in gioco Inherit. Noi creeremo una classe di nome figlio, all'inizio dichiareremo Inherit Padre (ovvero eredità tutto ciò che è possibile da padre) e dopo dichiareremo le cose in più, come ad esempio una funzione di nome Nuotare!

Spero che il mio esempio serva e sia esplicativo anche se veramente stupido e banale!
Titolo: Re: Evento change in listbox
Inserito da: md9327 - 23 Luglio 2010, 11:35:13
Per cesko:
quello che hai scritto, in riferimento al "figlio uguale al padre", è veramente un'utopia... :-)

Per Picavbg:
1) hai capito bene "il giro del fumo"
2) è ovvio che la ratica insegna più della teoria
3) riguardo all'applicazione nel tio programma, come ho accennato, è altrettanto ovvio che da valutare

non voglio ovviamente entrare in merito a come hai scritto il codice, è chiaro, ma se posso darti un consiglio, valuta bene quello che stai facendo, e studia la possibilità di adottare diverse logiche. Questo, ovviamente, è un consiglio, e dato che stai sperimentando, prendilo per quello che è...
Oltre a questo, prova a fare dei test su codici semplici; puoi prendere come sempio proprio quanto scritto da cesko, magari usando una o due proprietà, e prova a farne due oggetti, usando inherits. Vedrai che la cosa è alquanto semplice, e comunque puoi sempre domandare qui nel forum...
Titolo: Re: Evento change in listbox
Inserito da: Golia - 23 Luglio 2010, 18:53:21
Un buon esempio di INHERITS è la classe PDFWRITER , guardatela che è una classe stupenda e vi fa risparmiare molto tempo per le vostre stampe
Titolo: Re: Evento change in listbox
Inserito da: Picavbg - 23 Luglio 2010, 22:07:09
Un buon esempio di INHERITS è la classe PDFWRITER , guardatela che è una classe stupenda e vi fa risparmiare molto tempo per le vostre stampe
Ti sei accorto che nella form allegata recentemente che contiene un pulsante Stampa?  :D
Grazie; la guarderrò con molto interesse.
 :( :(
Titolo: Re: Evento change in listbox
Inserito da: Golia - 24 Luglio 2010, 09:11:41
Non avevo scaricato  :)
Non so se tu usi già PdfWriter, volevo solo farlo presente.
Se non lo hai mai usato questa classe, scarica questo esempio che abbiamo fatto io e Dex, naturalmente il tutto sulle solide basi di MD9327  ;)
http://www.gambas-it.org/smf/index.php?topic=1056.msg11752#msg11752 (http://www.gambas-it.org/smf/index.php?topic=1056.msg11752#msg11752)
Ciao