Newsgroup: it.comp.lang.c++
Titolo: Creazione Menu a runtime

Ho realizzato una procedura per caricare un menu a runtime (utilizzando i
molti consigli ricevuti in questi giorni proprio dal gruppo) basandomi su di
un tabella, dove sono memorizzati i profili del menu, la struttura della
tabella è la seguente:
k      cCODMENU      char         3         Codice menu (profilo)
k      nLIVELLO         number     2         Livello menu
k      cCODPRG        number     6         Codice progresivo del menu
        cPADRE           nember     6         Codice del menu padre
        cCODFUNZ       char         3          Codice funzione
        nIDMENU          number     10       Id punto di menu
        cDESCR           char          50       Descrizione menu
con una chiave primaria composta da cCODMENU,nLIVELLO,cCODPRG
i metodi principali della classe sono Crea_Menu() e InsertItem() e la
variabile membro CMenu menuMain;
ed altre che non sto a scrivere
void DS_Menu::Crea_Menu(.....)
{
        menuMain.CreateMenu();
        //Apro la tabelladel menu ordinata per la chiave descritta sopra
        Open_MenuDynaset(....)
        pDBMenu->GoTop();
        //Creo il primo menu di livello superiore
        CMenu menuPopup;
        menuPopup.CreatePopopMenu();
        //Skip nel db al prossimo elemento
        pDBMenu->Skip();
        //Passo al secondo elemento del menu
        while(TRUE){
                //Se non ho padre ed non è una funzione è menu di livello
superiore
                if(pDBMenu->FieldGet("cPADRE").Empty() &&
pDBMenu->FieldGet("cCODFUNZ").Empty()){
menuMain.AppendMenu(MF_POPUP,(UINT)menuPopup.Detach(),cNomeMenu)
                        menuPopup.createPopupMenu();
                }
                else
                        InsertItem(&menuPopup,pDBMenu,cNomeMenu);
                if(!pDBMenu->Skip()){
menuMain.AppendMenu(MF_POPUP,(UINT)menuPopup.Detach(),cNomeMenu)
                        break;
                }
        }
        pDesktop->SetMenu(&menuMain);
        menuMain.Detach();
}
void IsertItem(CMenu* pMenu,DB_Dynaset* pDynaset,O_String cNomeMenu)
{
        //Se è un sottomenu e quindi non a funzionalità associate
        if(pDynaset->FiledGet("cCODFUNZ").Empty()){
                CMenu menuPopup;
                menuPopup.CreatePopupMenu();
                if(!pDynaset->Skip()) return;
                O_String cPadre = pDynaset->FiledGet("cPADRE")
                //Ciclo fino a quando il padre è lo stesso
                while(cPadre == pDynaset->FiledGet("cPADRE")){
                        InsertItem(&menuPopup,pDynaset,cNomeMenu);
                        if(!pDynaset->Skip()) break;
                }
pMenu->AppendMenu(MF_POPUP,(UINT)menuPopup.Detach();cNomeMenu);
                pDynaset->Skip(-1);
        }
        else
pMenu->AppendMenu(MF_STRING,(UINT)int(pDynaset->FiledGet("nIDMENU")),cNomeMe
nu);
}
Il codice l'ho buttato giù al momento cercando di ricordammi quello che ho
fatto in ufficio, quindi scusatemi per le varie imprecisioni.
Utilizzo un metodo ricorsivo per poter realizzare tutti i submenu possibili.
Volevo avere uno scambio di idee sulla flusso della procedura, e volevo
soprattutto ricevere tante critiche dai + esperti (che sicuramente non
mancheranno) per poter migliorare il mio "stile" di programmazione.
Mi piacerebbe anche confrontare questa soluzione con quelle proposte da voi.
Grazie per ogni vostro suggerimento
Se sono stato poco chiaro (sicuramente) ditemi dove approfondire....
Ciao
Terenzio

