Quando nel programma si deve mettere l'inserimento di una password con anche la possibilità di cambiare e salvare una nuova password, il modo per gestire queste operazioni è di inserire un edit su una pagina grafica per l'inserimento della password e un' altra pagina grafica in cui poter effettuare una modifica e salvataggio della nuova password.

Si utilizza anche una serie di funzioni per gestire le operazioni.

Nel seguente esempio vine mostrato la gestione dell' inserimento e della modifca di password di un progetto.

Più avanti troverai anche le parti di codice scritte nei file .c relativi alle pagine.

Nel common.h (o comunque in file .h inclusi nel common):

unsigned char superadmin_password[32];        // dichiara la password di accesso del superadmin
unsigned char manutentore_password[32];       // dichiara la password di accesso del manutentore

unsigned char new_superadmin_password[32];    // dichiara l' array relativo alla nuova password del super-admin
                                              // nel caso si decida di modificarla
unsigned char new_manutentore_password[32];   // dichiara l' array relatIvo alla nuova password del manutentore
                                              // nel caso si decida di modificarla

volatile U8 my_password[32];                  // array ralativo alla password che deve essere inserita

volatile char livello_accesso;                // variabile che indica chi ha effettuato l' accesso

volatile int flag_visu_msg_password = 0;      // flag relativa alla visualizzazione del messaggio di corretta o errata 
                                              // dopo l' inserimento della password
volatile int flag_msg_salva_password = 0;     // flag relativa alla scritta di salvataggio effettuato dopo la modifica delle password

// funzione che stampa sulla pagina grafica la scritta se la password è corretta o errata
void stampa_msg_password(void)
{
    if (livello_accesso == 1)                                                 // se l' accesso è stato effettuato dal manutentore
        page_reqPassword->label1->caption = "Password manutentore corretta";  // label1 è la scritta sulla parte grafica della pagina
    else if (livello_accesso == 2)                                            // se l' accesso è stato fatto dal super-admin
        page_reqPassword->label1->caption = "Password super-admin corretta";
    else                                                                      // se l' accesso non ha avuto successo
        page_reqPassword->label1->caption = "Password errata";
}

// funzione relativa alla flag di visualizzazione del messaggio dopo l' inserimento della password
void stop_visu_msg_password(void)
{
    flag_visu_msg_password = 0;    // dopo 2 sec dall' inserimento della password (vedi page_reqPassword.c)
}

// funzione relativa alla flag di visualizzazione del messaggio di "Password salvata" (vedi page_modPassword.c)
void stop_msg_salva_password(void)
{
    flag_msg_salva_password = 0;
}

// funzione per impostare i caratteri di default delle password
void reset_pasword(void)
{
    snprintf(superadmin_password, sizeof(superadmin_password), "%s", "1234");
    snprintf(manutentore_password, sizeof(manutentore_password), "%s", "5678");
}

Nella pagina (page_reqPassword.c) in cui viene richiesto di inserire la password, la variabile my_password è associata ad un edit nel quale è possibile inserire la password con un pulsante di conferma della password inserita ed è presente un label (label1) che scrive se la password è corretta o errata:

#include "page_reqPassword.h"

// -------------------------------+ 
//    form  page_req_password
// -------------------------------+ 
void form_page_req_password(void)
{
    object(TPage,(void **)&page_reqPassword,page_reqPassword_Body,0,0,&Null,None,1,0,"PAGE");
}
// ------------------------------- 
// methods: 
// ------------------------------- 
void Event(passwordOK_onmouseup)()                          // quando il pulsante passwordOK di conferma password viene attivato
{                                                           // (confermando la password inserita)

    if (!strcmp(my_password, superadmin_password))          // se la password inserita è uguale alla 
                                                            // password impostata per il super-admin
        livello_accesso = 2;
    else if (!strcmp(my_password, manutentore_password))    // se la password inserita è uguale alla
                                                            // password impostata per il manutentore
        livello_accesso = 1;
    else                                                    // se la password non è corretta
        livello_accesso = 0;
    
    // la flag di visualizzazione messaggio vine messa a 1 e  viene rimessa a 0 dopo 2 sec
    flag_visu_msg_password = 1;
    remove_timer(stop_visu_msg_password);
    exec_timer(stop_visu_msg_password, ONCE, 2000);
}
// ------------------------------- 
void Event(label1_onentry)()
{
    // label1 viene visualizzato solo se la flag di visualizzazione messaggio è 1
    // dopo 2 sec il messaggio non è più visibile
    me2->visible = flag_visu_msg_password;
    if (flag_visu_msg_password)                                                    // se il label è visibile
    {
        stampa_msg_password();                                                     // stampa la scritta

        if (livello_accesso == 2 || livello_accesso == 1)                          // se la password è corretta
            me->fontcolor = GREEN;                                                 // il label diventa di colore verde
        else                                                                       // se la password è errata
            me->fontcolor = RED;                                                   // il label diventa di colore rosso

        me->rgb_fontcolor = 0;
    }
}

Nella pagina page_modPassword.c, in cui si può modificare la password, le varibili new_seperadmin_password e new_manutentore_password sono associate a due edit nella parte grafica in cui si può inserire le nuove password, ed è presente anche un pulsante di reset che reimposta le password con i caratteri di default, ed è presente una bitmap che se premuta salva le nuove password inserite:

#include "page_modPassword.h" 
// -------------------------------+ 
//    form  page_modPassword
// -------------------------------+ 
void form_page_modPassword(void)
{
  object(TPage,(void **)&page_modPassword,page_modPassword_Body,0,0,&Null,None,1,0,"PAGE");
}
// -------------------------------
// methods:
// ------------------------------- 
void Event(onfirst)()    // all' inizio, negli edit delle nuove password, vengono stampate le password attualmente impostate
{
    snprintf(new_superadmin_password, sizeof(new_superadmin_password), "%s", superadmin_password);
    snprintf(new_manutentore_password, sizeof(new_manutentore_password), "%s", manutentore_password);
}
// ------------------------------- 
void Event(button1_onmousedown)()  // quando si preme il pulsante di reset
{
    reset_password();              // vengono reimpostate le password con i caratteri di default
    
    // stampa negli edit le password reimpostate
    snprintf(new_superadmin_password, sizeof(new_superadmin_password), "%s", superadmin_password);
    snprintf(new_manutentore_password, sizeof(new_manutentore_password), "%s", manutentore_password);
}
// ------------------------------- 
void Event(bitmap1_onmousedown)()  // quando viene premuta la bitmap per il salvataggio
{
    v_tik(30);
    
    // salva le nuove password negli array delle password correnti
    snprintf(superadmin_password, sizeof(superadmin_password), "%s", new_superadmin_password);
    snprintf(manutentore_password, sizeof(manutentore_password), "%s", new_manutentore_password);
    
    // la flag del salvataggio che fa apparire il messaggio di password salvata viene messa a 1 e dopo 3 sec viene rimessa a 0
    flag_msg_salva_password = 1;
    remove_timer(stop_msg_salva_password);
    exec_timer(stop_msg_salva password, ONCE, 3000);
}
// ------------------------------- 
void Event(label1_onentry)()    // il label1 ("Password salvata") è visibile quando la flag relativa al messaggio di salvataggio è 1
{
    me2->visible = flag_msg_salva_password;
}