GUI: impostazione delle opzioni in due luoghi diversi e il loro mantenimento della sincronizzazione?

2

Programmazione in Windows con Visual Studio 2010 C ++ e MFC. La mia domanda riguarda il modo migliore per archiviare, aggiornare e aggirare le impostazioni o le opzioni del programma.

Ho una semplice finestra / finestra / finestra di GUI principale. In quella finestra principale ho un pulsante opzioni. Quando clicco sul pulsante delle opzioni, creo una finestra di dialogo Opzioni.

All'interno della finestra di dialogo delle opzioni ottengo un riferimento all '"applicazione" (un concetto MFC, disponibile globalmente) e caccio un riferimento alla mia classe di impostazioni personalizzate (un'istanza è memorizzata nella classe dell'applicazione. finestra di dialogo delle opzioni e salva le mie opzioni.

Forse dovrei usare l'iniezione della dipendenza per iniettare le impostazioni nella mia finestra di dialogo delle opzioni? O forse non dovrei nemmeno accedere alle impostazioni dall'interno della classe di dialogo? Forse dovrei esporre le impostazioni tramite set / get sulla classe di dialogo?

Inoltre, ora voglio mostrare alcune opzioni proprio lì sulla finestra principale, pur continuando a renderle modificabili nella finestra di dialogo delle opzioni originali. Quindi ora mi chiedo quale sia un buon design per questo. Se imposto un'opzione nella mia finestra di dialogo delle opzioni, voglio che aggiorni le opzioni visualizzate nella finestra principale.

Immagino che questo sia un buon punto per il pattern Observer ma sto cercando di capire come inserirlo del tutto in un contesto MFC (che come meglio posso dire è praticamente più o meno come qualsiasi altro toolkit GUI in qualsiasi altra lingua, quindi se non sei in MFC voglio ancora i tuoi commenti)

  1. Come devo passare le mie impostazioni?
  2. Come faccio a mantenere la visualizzazione GUI delle impostazioni in sincronia tra loro? In modo che dopo aver fatto clic su OK nella finestra di dialogo delle opzioni, le opzioni mostrate direttamente nella finestra principale siano aggiornate?
posta User 27.07.2011 - 04:11
fonte

3 risposte

1

Ok ho risolto questo problema usando l'iniezione di dipendenza e il modello di Osservatore.

Per passare le impostazioni intorno

Ho un singolo oggetto Settings che istanzio nel mio oggetto app MFC, MyApp (una sottoclasse di CWinApp). In precedenza ho aggiunto una funzione getter chiamata GetSettings() sul mio MyApp . Questo mi ha permesso di ottenere le impostazioni da qualsiasi classe di finestra perché esiste il metodo membro ((MyApp*)AfxGetApp())->GetSettings() . Ciò tuttavia soffre dei problemi dello stato globale e rende non ovvio che una classe utilizzi l'oggetto impostazioni. Ora, invece, la mia dipendenza inserisce il mio oggetto settings nella mia classe CDialog tramite il costruttore. Poi la dipendenza la inietto nella mia classe OptionsDialog. Questo si occupa di passare le impostazioni intorno.

Per mantenere la visualizzazione GUI delle impostazioni sincronizzate

Ho usato il pattern Observer. Ho creato due classi astratte Soggetto e Osservatore come:

#pragma once
#include <list>

class Observer;

class Subject
{
public:
    virtual ~Subject()  {}
    virtual void AttachObserver(Observer *observer);
    virtual void DetachObserver(Observer *observer);
    virtual void NotifyObservers();

protected:
    Subject() {}

private:
    std::list<Observer *> observers_;
};

e

#pragma once

class Subject;

class Observer
{
public:
    virtual ~Observer() {}
    virtual void Update(Subject *subject) = 0;

protected:
    Observer() {}

};

Poi ho fatto derubare la mia classe Settings da Subject e ho chiamato NotifyObservers() dal metodo Save() della mia impostazione delle impostazioni.

Finalmente ho fatto il mio OptionDialogPanel sulla mia finestra principale derivare da Observer . Nel mio OnInitDialog () chiamo settings_->AttachObserver(this) per registrare il mio pannello delle opzioni come listener del mio oggetto settings. Quindi ho implementato il metodo di aggiornamento per acquisire nuove impostazioni dal mio oggetto impostazioni e inserirle nelle caselle di testo:

void OptionsDialogPanel::Update(Subject *subject)
{
    if(subject == settings_)
    {
        UpdateToCurrentSettings();
    }
}
    
risposta data 28.07.2011 - 23:51
fonte
5

Più luoghi da cambiare, tutti i luoghi devono conoscere il valore corrente ... sembra il Pattern degli osservatori .

a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods. It is mainly used to implement distributed event handling systems. The Observer pattern is also a key part in the familiar Model View Controller (MVC) architectural pattern...

    
risposta data 27.07.2011 - 08:36
fonte
0

Sembra un lavoro per il modello di monostazione .

A monostate class contains only private static data members and public non-static member functions to access these members. This way, all objects of this class share the same state.

Leggi l'articolo e vedi se è quello che stai cercando.

    
risposta data 27.07.2011 - 07:22
fonte

Leggi altre domande sui tag