Il codice sequente è un estratto di pgDesigner, in cui ho appunto inserito una cosa del genere; spero si capisca.
'---
' Load of list of the last projects opened
'
PUBLIC SUB SetMenuRecent()
DIM aRecentList AS String[] = pgApplication.Config.Get("RecentList") 'prelevo l'array della lista delle voci
DIM hMenu AS Menu
DIM sItem, sName, sFile AS String
DIM nId AS Integer
DIM oProject AS pgProject
DIM bOk AS Boolean
WITH pgApplication.MainWindow
.mnuOpenRecent.Children.Clear() 'pulisco tutte le voci del menu Recent
IF (aRecentList.Count = 0) THEN 'se è vuoto lo nascondo
.mnuOpenRecent.Visible = FALSE
ELSE IF (IsNull(aRecentList[0])) THEN 'se non ci sono voci nella lista nascondo il menu
.mnuOpenRecent.Visible = FALSE
ELSE
nId = 0
FOR EACH sItem IN aRecentList 'loop tra le voci della lista
IF (IsNull(sItem)) THEN CONTINUE 'verifico se la voce non è per caso vuota
sFile = Split(sItem, "|")[0] 'ogni elemento di ArecentList contiene: nome del file (path compresa) e nome visualizzato nel menu (nome progetto)
sName = Split(sItem, "|")[1] 'le due voci sono nella stessa stringa e separate dal carattere |, per cui tocca separarle
bOk = TRUE
'nascondo la voce se il progetto è già stato aperto
FOR EACH oProject IN pgApplication.Projects
IF (sFile = oProject.Filename) THEN
bOk = FALSE
BREAK
END IF
NEXT
IF (NOT bOk) THEN CONTINUE 'progetto già aperto, passo alla voce successiva
'create upper menu item for clear list
IF (nId = 0) THEN 'se è il primo item che inserisco, creo un paio di menu per cose particolari
hMenu = NEW Menu(.mnuOpenRecent)
WITH hMenu 'menu per l'azzeramento della lista
.Name = "mnuClearRecent"
.Picture = pgUtil.LoadIcon("cancel.png")
.Caption = ("&Clear History")
END WITH
Object.Attach(hMenu, pgApplication.EventManager, "Event") 'aggancio gli eventi all'event manager
hMenu = NEW Menu(.mnuOpenRecent) 'menu per l'ordinamento delle voci
WITH hMenu
.Name = "mnuOrderRecent"
.Caption = ("&Order by Path")
END WITH
Object.Attach(hMenu, pgApplication.EventManager, "Event")
hMenu = NEW Menu(.mnuOpenRecent)
WITH hMenu 'aggiungo un separatore per le vere voci di menu
.Name = "mnuSepRecent"
END WITH
END IF
.mnuOpenRecent.Visible = TRUE 'rendo il menu Recent visibile
'create new menu item
hMenu = NEW Menu(.mnuOpenRecent) 'creo un nuovo sotto menu di Recent
WITH hMenu
.Tag = sFile 'in Tag ci salvo il nome e la path del file, così sò dove prenderli per usarli
.Name = "mnuRecent" & Str(nId) 'identifico il menu con id che posso capire durante le operazioni
'se la path contiene la directory utente, la sostituisco con una tilde per farlo capire e accorciare la stringa
IF (Left(sFile, Len(User.Home)) = User.Home AND
Mid(sFile, Len(User.Home) + 1, 1) = "/") THEN
.Caption = sName & " (" & Chr(126) & Mid(sFile, Len(User.Home) + 1) & ")"
ELSE
.Caption = sName & " (" & sFile & ")"
END IF
END WITH
Object.Attach(hMenu, pgApplication.EventManager, "Event") ' aggancio il nuovo menu al gestore eventi centrale
INC nId
NEXT
END IF
END WITH
CATCH
pgApplication.HaltError(pgApplication.GetError(), TRUE) 'in caso di errore grave
END
Riguardo il caricamento e il salvataggio della lista, il discorso dovrà essere implementato con funzioni diverse.
Naturalmente, se hai dubbi, fammelo sapere
Intendi questo?
PRIVATE mnu AS Menu
PUBLIC SUB Form_Open()
DIM But AS Menu
DIM But1 AS Menu
DIM But2 AS Menu
DIM But3 AS Menu
mnu = NEW Menu(ME, TRUE)
But = NEW Menu(mnu) AS "But"
But.Caption = "But"
But1 = NEW Menu(mnu) AS "But1"
But1.Caption = "But1"
But2 = NEW Menu(mnu) AS "But2"
But2.Caption = "But2"
But3 = NEW Menu(mnu) AS "But3"
But3.Caption = "But3"
END
PUBLIC SUB Form_MouseDown()
IF Mouse.Button = 2 THEN mnu.Popup()
END
PUBLIC SUB But_Click()
Message.Info("But")
END
PUBLIC SUB But1_Click()
Message.Info("But1")
END
PUBLIC SUB But2_Click()
Message.Info("But2")
END
PUBLIC SUB But3_Click()
Message.Info("But3")
END