Terminologia
Elemento elemento / modulo - > Campi come lista di testo, caselle combo, pulsanti, ecc.
Problema
Ho un programma che fondamentalmente è un fat client che si interfaccia in un sistema che tiene traccia dei semafori.
In questo programma esiste un modulo. Il modulo contiene diverse sottomaschere. Come è adesso, alcune sottomaschere hanno le loro classi, e alcune delle sottomaschere sono completamente controllate dalla classe del modulo principale.
La classe del form principale ha un metodo validato che viene chiamato quando il modulo viene inviato e chiama i metodi di convalida all'interno delle sottomaschere, oltre a eseguire la convalida su alcuni degli elementi del modulo che non hanno le proprie classi.
Non sono venduto su questa architettura, poiché ritengo che dovrebbe essere coerente (ogni sottomaschera dovrebbe avere una sua classe, o nessuna sottomaschera dovrebbe avere la sua classe.
Il mio problema sta nell'implementazione degli avvisi di gestione. Al momento, quando un elemento viene convalidato, la convalida genera un errore o un avvertimento. Se si tratta di un errore, l'utente deve correggere la casella per soddisfare i requisiti di convalida dei moduli. Se si tratta di un avviso, l'utente deve essere informato di tale avviso e quindi inviare il modulo una seconda volta.
Se si verifica un avviso, ho creato un flag che verrà impostato. Prima che le informazioni contenute negli elementi del modulo possano essere accettate, il modulo controlla innanzitutto se sono stati generati errori. Nel caso in cui non ci siano errori, controlla gli avvisi. Se il flag di avviso è impostato, visualizza l'avviso. La prossima volta che viene chiamato questo metodo, il flag di avviso viene attivato all'interno del metodo di convalida.
Non mi piace molto questa implementazione, perché in pratica significa che hai questa bandiera canaglia che dovrebbe essere cancellata in base ai requisiti. Ho pensato di implementarlo come una macchina a stati, tuttavia ti imbatti nello stesso problema in cui lo stato del modulo verrebbe impostato in vari punti all'interno della classe in base ai requisiti (Uno dei campi modificati, ripristinato allo stato iniziale , ecc.)
L'altro problema che ho riscontrato è che il flag di avviso è di proprietà della classe form principale. Posso creare un puntatore al form principale dalla sottomaschera e quindi impostare il flag da lì.
Tutto questo sembra molto goffo, e sento che potrebbe creare molta confusione. Per me deve esserci un modo migliore per architettarlo.
EDIT: aggiunta di codice per il contesto
bool MainForm::callback_pushbutton_submit_clicked( const FormEvent&)
{
if ( validate_all_forms() )
{
//display error
}
else if ( get_warning_displayed_flag() )
{
//display warning
}
else
{
//submit form
}
}
bool MainForm::validate_all_forms()
{
bool error = false;
bool display_warning = false;
error |= subform1.validate();
error |= subform2.validate();
//...
//perform some validation on subforms that are controlled within the main form
if ( !(my_date_field.validate() )
{
display_warning = true;
}
//....
if( error )
{
//format error message
//clear warning flag
}
else if ( display_warning )
if ( !get_display_warning_flag() )
{
//get warning message
}
invert_warning_display_flag()
}
return error;