Autore Topic: [Risolto] Albero binario e command pattern  (Letto 1330 volte)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.145
  • Tonno verde
    • Mostra profilo
[Risolto] Albero binario e command pattern
« il: 03 Agosto 2017, 23:32:22 »
 :ciao:
Sto cercando di coniugare due concetti per me parecchio ostici, l'attraversamento di una struttura ad albero binario con il Command pattern.
Ho creato un esempio che allego e che mi restituisce errore di Null Object, vale a dire che l'oggetto treeviev1 è Available = False.

Qualcuno è in grado di aiutarmi?

Se si utilizzano i button Up e Down ottengo il vettore delle chiavi, ma se cerco di usare Undo o Redo ottengo l'errore anzi detto.


https://it.wikipedia.org/wiki/Command_pattern
http://jsbsan.blogspot.it/2013/11/patron-command-implementar-deshacer-y.html
https://it.wikipedia.org/wiki/Albero_binario_di_ricerca
https://en.wikipedia.org/wiki/Tree_traversal#Pre-order

Nota: Ho usato come base (commentandone il codice) lo stesso esempio che avevo usato per chiedere lumi su l'albero partendo dal codice elementare e basandomi sulla risposta di Tobias Boege.

 :ciao: :ciao:
« Ultima modifica: 08 Agosto 2017, 13:51:46 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.145
  • Tonno verde
    • Mostra profilo
Re:Albero binario e command pattern
« Risposta #1 il: 07 Agosto 2017, 16:46:29 »
Proseguendo nel tentativo di coniugare quanto in oggetto, ero arrivato alla conclusione che se non riuscivo ad ottenere un passaggio lineare tipo swap fra le voci dell'albero non avrei potuto passare le chiavi ai pulsanti Undo e Redo.

Il problema è che riuscire a capire come esattamente muoversi fra i livelli non è cosa semplice e il massimo che sono riuscito ad ottenere è questo.

Non è perfetto infatti se nel mezzo dei movimenti all'interno di un livello noi agiamo su un altro livello, si interrompe la catena del livello precedente e non ho capito come porvi rimedio.

Però il problema maggiore è quello che questo sistema non può comunque servire alla bisogna circa Undo Redo, infatti se il pulsante Down restituisce quanto mi aspetterei, così non fa il pulsante Up come si può constatare dal ritorno nella console.

C'è da dire però che seppure imperfetto questo codice racchiude in se il comportamento Undo Redo rendendolo in qualche maniera inutile.

Cosa ve ne pare?

Qualche idea migliore?

Allego Test-TreeView
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.145
  • Tonno verde
    • Mostra profilo
Re:Albero binario e command pattern
« Risposta #2 il: 08 Agosto 2017, 13:49:51 »
  :ciao: Taci che forse ora funziona.

Già dall'inizio per il tasto Up avevo usato i -1 per posizionarmi sulla prima occorrenza ma ottenevo sempre errore e non avendone evidentemente capito la provenienza ho scartato l'idea prendendo una strada errata.

Ora, come detto sembra funzionare e pertanto direi che ho risolto.  :D

Allego il file Test-TreeView-UR che pare sia riuscito a coniugare l'attraversamento dell'albero con lo swap passo passo e il command pattern per i tasti undo e redo.

 :ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.267
  • Chi parla poco dice tanto...
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #3 il: 08 Agosto 2017, 14:26:02 »
Valuta anche questo per spostare gli elementi di una treeview...
« Ultima modifica: 08 Agosto 2017, 14:26:53 da milio »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.145
  • Tonno verde
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #4 il: 08 Agosto 2017, 15:17:13 »
Valuta anche questo per spostare gli elementi di una treeview...
:ciao:
Veramente notevole, ti ringrazio molto dell'esempio.  :D
Ecco come va usato MoveTo! Ti lascio immaginare in quanti modi assurdi ho cercato di usarlo  ;D

È che a prima vista inserire qui una logica undo redo mi appare impossibile, ma visto che hai inserito i bottoni ne deduco che è possibile.
Proverò a studiarci su, è che col mio vecchio cervelletto bacato...  :'(

 :ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.145
  • Tonno verde
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #5 il: 08 Agosto 2017, 17:32:25 »
Ciao Milio,
il tuo codice su Right ha un comportamento anomalo, non torna indietro da dove parte Left ma si posiziona su Last? Insomma sull'ultima posizione in fondo all'albero.
Pertanto questo comportamento si riflette su Undo Redo (noterai che non sono riuscito a capire il tuo suggerimento $aUndo $iIndexRedo), scusa la mia ignoranza.
Puoi aiutarmi a migliorarlo...  :-*

Vedi allegato

 :ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.145
  • Tonno verde
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #6 il: 08 Agosto 2017, 22:59:14 »
Purtroppo usando undo redo anche sul solo codice up e down ottengo errore  :-\

Vedi allegato
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.267
  • Chi parla poco dice tanto...
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #7 il: 08 Agosto 2017, 23:34:49 »
Prova questo...

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.267
  • Chi parla poco dice tanto...
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #8 il: 09 Agosto 2017, 00:02:31 »
Aggiunto anche la ricerca....
« Ultima modifica: 09 Agosto 2017, 00:05:29 da milio »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.145
  • Tonno verde
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #9 il: 09 Agosto 2017, 09:44:06 »
Prova questo...
Aggiunto anche la ricerca....

Ciao Milio,
purtroppo continua a dare lo stesso errore (in entrambe le ultime due versioni).
Sto cercando di capirne l'origine, ma per ora senza successo.
Comunque è qualcosa che non ha a che fare col sistema usato per UR ma penso con qualche cambiamento che non viene registrato internamente alle funzioni di Gambas.  :-\

Vedi immagine allegata

« Ultima modifica: 09 Agosto 2017, 09:47:16 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.145
  • Tonno verde
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #10 il: 09 Agosto 2017, 14:19:14 »
Ciao Milio,
aggiungo qualche altra riflessione, per quello che può valere.  :-[

Mi è difficile capire perché ad esempio giocherellando con i vari comandi e con undo e redo poi mi ritrovo alla fine con l'albero tutto incasinato e con l'errore New parent cannot be a child in FCmdTree:110

Mi sa che l'usare i metodi di Gambas in base alla posizione corrente, impedisca ai metodi di poter tornare correttamente indietro.
Del resto nel mio ultimo progetto per poter tornare su mi devo spostare di una posizione in su rispetto alla posizione corrente e viceversa a scendere.

In definitiva occorrerebbe poter avere da gambas la posizione in base all'item nel frattempo variato e invece sembra che Gambas usi un'altra logica al suo interno.
Le mie sono mere supposizioni in quanto non conoscendo il C e il C++ non sono in grado di verificarle.

Vedi questa sequenza in Test-TreeView-UR0.0.1:
Codice: [Seleziona]
Item down 1     2
Da Down (key e item): 1 2
Item down 1     9
Da Down (key e item): 1 9
Item down 1     20
Da Down (key e item): 1 20
Item down 3     4
Da Down (key e item): 3 4
Item down 3     5
Da Down (key e item): 3 5
Item down 7     8
Da Down (key e item): 7 8
Item up 7       8
Item up 3       5
Item up 3       4
Item down 10    11
Da Down (key e item): 10        11
Item down 10    13
Da Down (key e item): 10        13
Item down 10    14
Da Down (key e item): 10        14
Item down 10    18
Da Down (key e item): 10        18
Item down 10    19
Da Down (key e item): 10        19
Item up 10      19
Item up 10      18
Item down 15    16
Da Down (key e item): 15        16
Item down 15    17
Da Down (key e item): 15        17
Item up 15      17
Item up 15      16
Item up 10      14
Item up 10      13
Item up 10      11
Item up 1       20
Item up 1       9
Item up 1       2
Item down 1     2
Item down 1     9
Item down 1     20
Item down 10    11
Item down 10    13
Item down 10    14
Item down 15    16
Item down 15    17
Item up 15      17
Item up 15      16
Item up 10      14
Item up 10      13
Item up 10      11
Item up 1       20
Item up 1       9
Item up 1       2
Item down 1     2
Item down 1     9
Item down 1     20
Item down 10    11
Item down 10    13
Item down 10    14
Item down 15    16
Item down 15    17
Item up 15      17
Item up 15      16
Item up 10      14
Item up 10      13
Item up 10      11
Item up 1       20
Item up 1       9
Item up 1       2
Qui è possibile constatarne la correttezza in quanto a ogni Down corrisponde un Up e viceversa, ma come è possibile farlo in Test-TreeViewM-UR-0.0.4 con solo la chiave?
Su Up e Down siamo certi che da errore di Out of bounds e pertanto è impossibile che funzioni correttamente anche il resto.
Il problema qui si manifesta sempre quando le azioni lineari vengono interrotte da dei redo che prima o poi portano allo stesso errore.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.267
  • Chi parla poco dice tanto...
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #11 il: 21 Agosto 2017, 14:39:09 »
Prova adesso...

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.267
  • Chi parla poco dice tanto...
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #12 il: 21 Agosto 2017, 17:07:43 »
Porca pupazza che parto sta cosa....  :rolleyes: spero che serva...
Ho corretto altre cose e eliminato esperimenti che avevo fatto nella versione precedente...

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.145
  • Tonno verde
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #13 il: 21 Agosto 2017, 17:11:41 »
Porca pupazza che parto sta cosa....  :rolleyes: spero che serva...
Ho corretto altre cose e eliminato esperimenti che avevo fatto nella versione precedente...

 :rotfl:

Stavo proprio per scriverti che c'erano dei malfunzionamenti.

Ma davvero non ti devi preoccupare a me va benissimo la soluzione che avevo proposto, certo che se riuscissi...  :-*

Ora scarico questa e ti dico

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.267
  • Chi parla poco dice tanto...
    • Mostra profilo
Re:[Risolto] Albero binario e command pattern
« Risposta #14 il: 21 Agosto 2017, 17:21:21 »
Alla fine lo usero' anche io sto componente... Mi serve per riorganizzare il menu del mio programma di gestione manutenzioni.

Aggiunto pulsante/evento Save e pulsante/evento Reload