Autore Topic: Aggiungere una voce di menu  (Letto 1559 volte)

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Aggiungere una voce di menu
« il: 11 Ottobre 2008, 16:16:20 »
Come posso aggiungere una voce a un menu? Per capirci, voglio implementare un menu "File Recenti", per cui le voci (che corrispondono ai file che sono stati aperti di recente) devono essere create a runtime...

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aggiungere una voce di menu
« Risposta #1 il: 11 Ottobre 2008, 18:38:06 »
Il codice sequente è un estratto di pgDesigner, in cui ho appunto inserito una cosa del genere; spero si capisca.

Codice: [Seleziona]

'---
' 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

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Aggiungere una voce di menu
« Risposta #2 il: 11 Ottobre 2008, 19:03:17 »
Grande md, sei sempre pronto ad aiutare il prossimo postando dei pezzi di pgDesigner! Forse questo forum è inutile, sarebbe sufficiente scaricarsi pgd per avere tutte le risposte... hehehe.
Per colpa tua però mi tocca vincere la mia proverbiale prigrizia e tornare sul codice invece di giocare a Battle for Wesnoth. Vabbè... ti farò sapere se ho avuto problemi.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aggiungere una voce di menu
« Risposta #3 il: 11 Ottobre 2008, 19:31:05 »
Eheheheh esagerato!!!

Comunque, MOLLA I GIOCHI E VIENI A LAVORARE!!! :-)

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Aggiungere una voce di menu
« Risposta #4 il: 02 Ottobre 2010, 15:15:00 »
Mi scuso anticipatamente per aver riesumato il post ma è inutile aprirne altri.

Come faccio a collegare alla voce di menu appena creata l'evento click?

Offline ealmuno

  • Maestro Gambero
  • ****
  • Post: 388
    • Mostra profilo
    • http://www.ealmuno.com
Re: Aggiungere una voce di menu
« Risposta #5 il: 02 Ottobre 2010, 16:51:51 »
Forse non ho capito bene io, ma usare l'editor del menu? Si attiva in automatico al click è l'11 icona, quella con la matitina, a destra c'è quella per disattivare la griglia. mi sembra di averne pure parlato in "il resto del pinguino"
il mio nuovo sito : ealmuno.com

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Aggiungere una voce di menu
« Risposta #6 il: 02 Ottobre 2010, 16:53:03 »
Forse non ho capito bene io, ma usare l'editor del menu? Si attiva in automatico al click è l'11 icona, quella con la matitina, a destra c'è quella per disattivare la griglia. mi sembra di averne pure parlato in "il resto del pinguino"

No, intendo come connettere l'evento click ad un menu aggiunto via codice.... :)

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Aggiungere una voce di menu
« Risposta #7 il: 02 Ottobre 2010, 20:53:59 »
Intendi questo?

Codice: gambas [Seleziona]
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

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Aggiungere una voce di menu
« Risposta #8 il: 03 Ottobre 2010, 00:39:52 »
Si...pensavo si dovesse operare via codice per abilitare il click....

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Aggiungere una voce di menu
« Risposta #9 il: 03 Ottobre 2010, 13:31:30 »
Bè, se lo aggiungi a codice, è normale che anche tutto il resto debba essere costruito allo stesso modo...