Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

Pattern Command? No: Memento! Missione compiuta!

Oggi pomeriggio ho messo in pratica l'idea che mi frullava in testa da un po' di tempo, ovvero implementare all'interno di una mia applicazione un meccanismo riutilizzabile di undo e redo. In altre parole, immaginate di avere un business object qualsiasi, che viene bindato attraverso un BindingSource a diversi controlli sulla Windows Forms. L'utente può ovviamente editare i controlli, aggiornando di conseguenza il business object sottostante. Ogni volta che l'utente modifica qualcosa, si scatena l'evento CurrentItemChanged, nel caso scatto una fotografia dell'oggetto chiedendo un memento all'originator, ovvero il business object stesso.

I memento vengono salvati in una lista tipizzata (BindingList<Memento>), che mi servono per mantenere uno storico di tutti i cambiamenti che l'utente ha fatto sul business object. Fatto questo, il passo seguente è stato semplice ed indolore: ho aggiunto un pulsante btnUndo che mi permette di annullare una certa modifica che l'utente ha fatto. Ogni volta che lo clicco, recupero il memento dalla lista, e chiedo al business object di usarlo per ritornare allo stato precedente.

Il business object implementa l'interfaccia IMementoCunsumer, che mi sono inventato di sana pianta, che richiede due soli metodi:

public interface IMementoConsumer
{
    
void SetMemento(Memento m);
    Memento CreateMemento();
}

Tutti gli oggetti che implementano tale interfaccia, devono:

  1. avere un metodo SetMemento, per ritornare ad uno stato precedente. Lo stato è dato dall'oggetto Memento, una classe astratta dalla quale derivano tutti i memento specifici del contesto nel quale ci troviamo
  2. avere un metodo CreateMemento che ritorna un oggetto Memento, che eventualmente servirà all'oggetto stesso per recuperare uno stato precedente

Ultima nota: all'interno della Windows Forms ho definito una variabile int _historyPosition. Mi serve come puntatore all'interno della lista tipizzata: quando faccio un undo, viene decrementata. Quando faccio un Redo (il contrario di Undo, ovviamente), tale variabile viene incrementata.

Grazie a Luca Minudel per avermi dato qualche dritta nel mio post di qualche giorno fa.

powered by IMHO 1.3

Print | posted on martedì 2 maggio 2006 01:51 | Filed Under [ Tecnologia ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET