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 viene 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):

// Nel seguente programma sono state omesse alcune funzioni e variabili che erano presenti nel progetto ma non sono necessarie per la
// dimostrazione della gestione delle password

unsigned char superadmin_password[32];        // dichiara la password di accesso del superadmin
                                              // (associata a un edit, vedi page_modePassword.c)
unsigned char manutentore_password[32];       // dichiara la password di accesso del manutentore
                                              // (associata a un edit, vedi page_modePassword.c)

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
                                              
// variabili utili nelle funzioni salva e visualizzaEsitoSalvataggio (vedi page_modPassword.c)
char esitoSalvataggio = 0;
char visualizzaEsitoSalvataggioOK = 0;
char visualizzaEsitoSalvataggio = 0;


// Si deve definire un tipo di struttura per i dati fissi (in questo caso le password)
// la gestione dei dati fissi è un argomento già trattato in un' altra sezione sulla home, in questo esempio non saranno commentate
// le parti relative alle gestione dei dati fissi, per le informazioni dettagliate puoi andare su 
// Home->Come gestire una serie di dati fissi
/********************************************/
typeded struct df
{
    unsigned char superadmin_password_df[32];
    unsigned char manutentore_password_df[32];
}

char pathProg[32] = "C:\\progetto.fis";    // percorso del file in cui sono presenti i dati fissi
FILE *fp;
df dati_fissi;

char salva_df(void)
{
    fp = fopen(pathProg, "w");
    if (fp == 0)
        return 0;
    fwrite(&dati_fissi, sizeof(dati_fissi), 1, fp);
    fclose(fp);
    return 1;
}

void reset_df(void)
{
    snprintf(dati_fissi.superadmin_password_df, sizeof(dati_fissi.superadmin_password_df), "1234");    // valori di default
    snprintf(dati_fissi.manutentore_password_df, sizeof(dati_fissi.manutentore_password_df), "5678");
    salva_df();
}

void carica_df(void)
{
    fp = fopen(pathProg, "r");
    if (fp == 0)
        reset_df();

    fread(&dati_fissi, sizeof(dati_fissi), 1, fp);
    fclose(fp);
}
/********************************************/


// 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 che salva i dati fissi e fornisce l' esito del salvataggio per label (vedi page_modPassword.c)
void salva(void)
{
    // salva i dati fissi
    esitoSalvataggio = salva_df();

    if (esitoSalvataggio)                  // se il salvataggio ha avuto successo
        visualizzaEsitoSalvataggioOK = 1;  // la variabile associata alla visibilità di label1 della pagina page_modPassword.c
    else                                   // se il salvataggio non ha avuto successo
        visualizzaEsitoSalvataggioNO = 1;  // la variabile associata alla visibilità di label2 della pagina page_modPassword.c

    exec_timer(visualizzaEsitoSalvataggio, ONCE, 3000);  // dopo 3 sec rimette a 0 le due variabili
}

// funzione che rimettte a 0 le variabili per visualizzare l' esito del salvataggio
void visualizzaEsitoSalvataggio(void)
{
    visualizzaEsitoSalvataggioOK = 0;
    visualizzaEsitoSalvataggioNO = 0;
}

Nello start.c:

carica_df();    // carica nella struttura dati i caratteri delle password

// imposta le password con i caratteri della struttura dati
snprintf(superadmin_password, sizeof(superadmin_password), "%s", dati_fissi.superadmin_password_df);
snprintf(manutentore_password, sizeof(manutentore_password), "%s", dati_fissi.manutentore_password_df);

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 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 viene 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 ritorna non 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 superadmin_password e 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, e sono presenti anche due label che scrivono il messaggio "salvataggio Ok" o "salvataggio fallito":

#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 password, vengono stampate le password attualmente impostate
{
    snprintf(superadmin_password, sizeof(superadmin_password), "%s", dati_fissi.superadmin_password_df);
    snprintf(manutentore_password, sizeof(manutentore_password), "%s", dati_fissi.manutentore_password_df);
}
// ------------------------------- 
void Event(button1_onmousedown)()  // quando si preme il pulsante di reset
{
    // imposta nella struttura dati i caratteri di default delle password
    snprintf(dati_fissi.superadmin_password_df, sizeof(dati_fissi.superadmin_password_df), "1234");
    snprintf(dati_fissi.manutentore_password_df, sizeof(dati_fissi.manutentore_password_df), "5678");
    
    salva();
    
    // imposta come password i valori presi dalla struttura dati
    snprintf(superadmin_password, sizeof(superadmin_password), "%s", dfRic.superadmin_password_Ric);
    snprintf(manutentore_password, sizeof(manutentore_password), "%s", dfRic.manutentore_password_Ric);
}
// ------------------------------- 
void Event(bitmap1_onmousedown)()  // quando viene premuta la bitmap per il salvataggio
{
    v_tik(30);
    
    // salva le nuove password nella struttura dati
    snprintf(dati_fissi.superadmin_password_df, sizeof(dati_fissi.superadmin_password_df), "%s", superadmin_password);
    snprintf(dati_fissi.manutentore_password_df, sizeof(dati_fissi.manutentore_password_df), "%s", manutentore_password);

    salva();
}
// ------------------------------- 
void Event(label1_onentry)()    // il label1 ("Salvataggio OK") è visibile se l' esito del salvataggio ha avuto successso
{
    me2->visible = visualizzaEsitoSalvataggioOK;
}

void Event(label2_onentry)()    // il label2 ("Salvataggio fallito") è visibile se l' esito del salvataggio ha avuto successo
{
    me2->visible = visualizzaEsitoSalvataggioNO;
}