Gambas-it

Gambas3 => Programmazione => Topic aperto da: Corvina - 11 Marzo 2020, 17:57:03

Titolo: [Risolto]Intercettare selezione di menù
Inserito da: Corvina - 11 Marzo 2020, 17:57:03
Ciao a tutti. Questo è il mio primo post e mi scuso perché si tratta di un post di richiesta aiuto e non uno per dare aiuto. Ma dato che sono neofita di questo linguaggio non poteva forse essere altrimenti. Vado al dunque. Ho creato una semplice form con un menù (fatto con l'editor). Volevo sapere se è possibile intercettare l'evento select del menuItem, no il click solo la selezione. In pratica in basso alla form ho una label che dovrebbe contenere la descrizione estesa del menù che sto via via scorrendo con il mouse (o tasto ovviamente). Idee?
Titolo: Re:Intercettare selezione di menù
Inserito da: kicco - 11 Marzo 2020, 20:13:21
 :ciao: Corvina, benvenuto!
Hai ragione non c'è un evento selected!

Titolo: Re:Intercettare selezione di menù
Inserito da: vuott - 11 Marzo 2020, 21:09:12
.... non c'è un evento selected!

...e quindi ?   :devil:
Titolo: Re:Intercettare selezione di menù
Inserito da: kicco - 11 Marzo 2020, 21:21:52
.... non c'è un evento selected!

...e quindi ?   :devil:
quindi stavo dando un occhio ad Action per vedere se si poteva trovare una soluzione!
 :P
tu hai idee?
 :ciao:
Titolo: Re:Intercettare selezione di menù
Inserito da: vuott - 11 Marzo 2020, 21:48:29
quindi stavo dando un occhio ad Action per vedere se si poteva trovare una soluzione!

...Action ?  ???
Titolo: Re:Intercettare selezione di menù
Inserito da: kicco - 12 Marzo 2020, 00:37:20
quindi stavo dando un occhio ad Action per vedere se si poteva trovare una soluzione!

...Action ?  ???
Speravo permettesse di fare qualcosa, invece no.
Certo che la documentazione non è così chiara: Returns or sets the action string associated with the control.
Titolo: Re:Intercettare selezione di menù
Inserito da: vuott - 12 Marzo 2020, 00:44:22
Certo che la documentazione non è così chiara: Returns or sets the action string associated with the control.
https://www.gambas-it.org/wiki/index.php?title=La_classe_Action
Titolo: Re:Intercettare selezione di menù
Inserito da: kicco - 12 Marzo 2020, 00:56:01
Certo che la documentazione non è così chiara: Returns or sets the action string associated with the control.
https://www.gambas-it.org/wiki/index.php?title=La_classe_Action
Ah! Action non c'entra niente!
Titolo: Re:Intercettare selezione di menù
Inserito da: vuott - 12 Marzo 2020, 01:33:28
tu hai idee?

" O San Midi (https://it.wikipedia.org/wiki/Musical_Instrument_Digital_Interface) eremita,
  per quali funesti luoghi il dolore me conduce ?
  Tetro è il buio opprimente la mia triste vita.
  Poi d'un tratto a me doni, benigno, la tua luce.
"

 sanmidi


Codice: [Seleziona]
Private Menu1 As Menu
Private Menu2 As Menu
Private Menu3 As Menu
Private Menu4 As Menu
Private Label1 As Label
Private tm As Timer


Public Sub Form_Open()
 
  With Menu1 = New Menu(Me) As "Menu1"
    .Caption = "Menu1"
  End With
  With Menu2 = New Menu(Menu1) As "Menu2"
    .Caption = "Menu2"
    .Tag = "Questo è il Menu2 !"
  End With
  With Menu3 = New Menu(Menu1) As "Menu3"
    .Caption = "Menu3"
    .Tag = "Questo è il Menu3 !"
  End With
  With Menu4 = New Menu(Menu1) As "Menu4"
    .Caption = "Menu4"
    .Tag = "Questo è il Menu4 !"
  End With
 
  With Label1 = New Label(Me)
    .W = 200
    .H = 30
    .X = (Me.W * 0.5) - (.W * 0.5)
    .Y = Me.H * 0.6
    .Border = Border.Plain
    .Alignment = Align.Center
    .Foreground = Color.Red
  End With
 
End


Public Sub Menu1_Show()

  With tm = New Timer As "Tempus"
    .Delay = 30
    .Start
  End With

End


Public Sub Tempus_Timer()

  Dim rt2 As New Rect(Me.ScreenX + 10, Me.ScreenY + 26, Me.Font.TextWidth(Menu2.Caption) + 20, Me.Font.TextHeight(Menu2.Caption))
  Dim rt3 As New Rect(Me.ScreenX + 10, Me.ScreenY + 50, Me.Font.TextWidth(Menu3.Caption) + 20, Me.Font.TextHeight(Menu3.Caption))
  Dim rt4 As New Rect(Me.ScreenX + 10, Me.ScreenY + 72, Me.Font.TextWidth(Menu4.Caption) + 20, Me.Font.TextHeight(Menu4.Caption))
 
  Label1.Text = Null
  If rt2.Contains(Mouse.ScreenX, Mouse.ScreenY) Then Label1.Text = Menu2.Tag
  If rt3.Contains(Mouse.ScreenX, Mouse.ScreenY) Then Label1.Text = Menu3.Tag
  If rt4.Contains(Mouse.ScreenX, Mouse.ScreenY) Then Label1.Text = Menu4.Tag
 
End


Public Sub Menu1_Hide()
 
  tm.Stop
 
End


Titolo: Re:Intercettare selezione di menù
Inserito da: Corvina - 12 Marzo 2020, 09:47:20
Grazie vuott, il tuo codice funziona perfettamente. Purtroppo avevo dimenticato un particolare. Il mio è un popup menù che viene fuori da un menuButton. Ho testato il tuo codice , sostituendo a Me il nome del menuButton, ma i riferimenti risultano un pò sballati. Comunque lavorando un pò sulle coordinate dovrei riuscire. Grazie mille!
Titolo: Re:Intercettare selezione di menù
Inserito da: kicco - 12 Marzo 2020, 09:49:38
Citazione
"...Poi d'un tratto a me doni, benigno, la tua luce."
Beato te, qui buio più totale!  :'(
 :ciao:
PS Sono contento per Corvina. San Midi ti ha salvato!
Titolo: Re:Intercettare selezione di menù
Inserito da: Corvina - 12 Marzo 2020, 10:08:41
Citazione
"...Poi d'un tratto a me doni, benigno, la tua luce."
Beato te, qui buio più totale!  :'(
 :ciao:
PS Sono contento per Corvina. San Midi ti ha salvato!

Da oggi San Midi ha una devota in più!
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 12 Marzo 2020, 16:03:45
Scusate se entro in questa discussione per dissentire sulla soluzione proposta da vuott.
Soluzione peraltro geniale come di consueto.  ;)
La principale peculiarità di Gambas è quella di metterci a disposizione interfacce professionali rapide da costruire, rompere questa peculiarità può portare a malfunzionamenti.
In questo caso il MenuButton non si troverà sempre nella stessa posizione in cui si trova sul nostro desktop.
Altri desktop con altre impostazioni renderanno arduo se non addirittura vano il nostro lavoro.
Se il compito di Corvina è quello di dare informazioni il più possibile estese, io propongo una soluzione tipo quella allegata.

Qui ho solo inserito in un precedente progetto mai completato, la possibilità di mostrare una guida quando ci si ferma col puntatore sul menubutton1 o si clicca sul nome di una finestra nel browser di sinistra.

Naturalmente è solo l'abbozzo di un'idea da sviluppare e perfezionare.

Nota: Il titolo del progetto è ironico ma anche di speranza.

 :ciao: :ciao:
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 12 Marzo 2020, 17:40:36
... per dissentire sulla soluzione proposta da vuott.
....
In questo caso il MenuButton non si troverà sempre nella stessa posizione in cui si trova sul nostro desktop.
Va considerato che io non ho previsto l'uso dell'Oggetto "MenuButton".
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 12 Marzo 2020, 17:44:59
In questo caso il MenuButton non si troverà sempre nella stessa posizione in cui si trova sul nostro desktop.

...non capisco il perché.   ??? :-X
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 12 Marzo 2020, 18:25:37
In questo caso il MenuButton non si troverà sempre nella stessa posizione in cui si trova sul nostro desktop.

...non capisco il perché.   ??? :-X

Forse dovevo precisare (e comunque andrebbe verificato bene) a meno che il menubutton non sia l'unico e posizionato come primo button della toolbar...

Secondo me forse si potrebbe provare a chiedere a Minisini di aggiungere se possibile l'evento focus (o enter e leave) dei menu.
Se si è interessati basta iscriversi al bugtracker e postare una richiesta.
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 12 Marzo 2020, 18:27:38
Secondo me forse si potrebbe provare a chiedere a Minisini di aggiungere se possibile l'evento focus (o enter e leave) dei menu.
Se si è interessati basta iscriversi al bugtracker e postare una richiesta.

Corvina, effettivamente devi valutare questa possibilità suggerita da Gianluigi.
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 12 Marzo 2020, 19:44:53
mi scuso perché si tratta di un post di richiesta aiuto e non uno per dare aiuto.
Non c'è necessità di scusarsi, poiché il forum intende in particolare offrire proprio "aiuto" a chi riscontra problemi e ostacoli nella programmazione con Gambas.


... dato che sono neofita di questo linguaggio...
Colgo l'occasione per segnalare nuovamente collegamenti web per lo studio di Gambas:

Sito ufficiale di Gambas:
 - http://gambas.sourceforge.net/en/main.html

Wiki ufficiale di Gambas:
 - http://gambaswiki.org/wiki

Forum, Wiki ed altri siti esistenti su Gambas:
 - https://www.gambas-es.org/forum.php
 - http://www.gambasforge.org/
 - http://www.gambas-club.de/index.php
 - https://forum.gambas.one/
 - http://www.gambaslinux.fr/
 - https://www.gambas-it.org/smf/
 - http://www.gambas-it.org/wiki/index.php?title=Pagina_principale
 - https://de.wikibooks.org/wiki/Gambas
 - http://www.gambasforge.org/wiki
 - http://sologambas.blogspot.it/p/indice.html
 - https://cursogambas.blogspot.com/p/indice.html
 - https://pigalore.miraheze.org/wiki/Main_Page
 - http://icculus.org/piga/

Testi e manuali esistenti:
 - http://gambaswiki.org/wiki/doc/book?nh&l=en
 - https://en.wikibooks.org/wiki/Programming_Gambas_from_Zip
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Corvina - 13 Marzo 2020, 09:41:06
Ciao, certo chiedere di inserire l'evento sarebbe la cosa più pulita da fare, anche perchè ovviamente un timer è un controllo "dispendioso" (almeno in Windows)

In attesa però ho implementato e modificato il codice di vuott e ho ottenuto il risultato che volevo, sia per il menù (che appare premendo il menù button), sia per l'eventuale sotto menù.

Gianluigi , perchè dici che i menù button non stanno sempre nella stessa posizione?

In ogni caso io non considerato nessuna coordinata fissa. Ogni controllo (tranne i menù) ha la proprietà ScreenX e ScreenY, dunque sappiamo sempre dove sono e il menù parte sempre dalla X del bottone e dalla sua Y + la sua H.  Stessa cosa i sotto menù che hanno una X che parte dalla X del bottone + la len della parola più lunga, e una Y che si riferisce al menù selezionato. Non è preciso al millimetro ma per adesso che sono all'inizio dell'applicazione pò bastare.

Qui il codice, magari viene fuori un idea per ottimizzarlo

Codice: [Seleziona]
Public Sub tmrMouse_Timer()
 
  Dim c As Menu
  Dim cc As Menu
  Dim rects As New Rect[]
  Dim rt As Rect
  Dim idxs As New Integer[]
  Dim idxs2 As New Integer[]
  Dim idx As Integer = 0
  Dim iRt As Integer
  Dim longStr As String
 
  If Not IsNull(selMenu)
      If Not selMenu.Closed Then
     
        For Each c In selMenu.Children
          rt = New Rect(scrnX, (scrnY + (25 * rects.Count)), rectW, rectH)
          rects.Add(rt)
          idxs.Add(rects.Count)
          idxs2.Add(0)
        Next
       
        For Each c In selMenu.Children
          If c.Children.Count > 0 Then
           
            If Not c.Closed Then
           
              'prima cercare la stringa piç lunga
              For iRt = 0 To (c.Children.count - 1)
                 If Len(c.Children[iRt].Caption) > Len(longStr) Then
                   longStr = c.Children[iRt].Caption
                 Endif
              Next
             
              rectW = Me.Font.TextWidth(longStr) + 50
           
              For iRt = 0 To (c.Children.count - 1)
             
                rt = New Rect((scrnX + rectW), (rects[idx].Y + (25 * iRt)), rectW, rectH)
             
                rects.Add(rt)
                idxs.Add(idx)
                idxs2.Add(iRt)
             
              Next
            Endif
          Endif
         
          idx = idx + 1   
       
        Next
       
        lblMessage.Text = Null
       
        For iRt = 0 To (rects.count - 1)
         
          If rects[iRt].Contains(Mouse.ScreenX, Mouse.ScreenY) Then
             
              If iRt < selMenu.Children.Count Then
                lblMessage.text = selMenu.Children[iRt].Tag
              Else
                lblMessage.text = selMenu.Children[idxs[iRt]].Children[idxs2[iRt]].Tag
              Endif
             
              Break
          Endif
         
        Next
    Endif
  Endif
End

Public Sub btnMenu_Enter()
 
  Dim c As Menu
  Dim cc As Menu
 
 
  Dim longStr As String
 
  scrnX = Last.ScreenX + 10
  scrnY = (Last.ScreenY + Last.Height + 10)
 
  For Each c In Me.Menus
    If c.name = Last.Menu Then
       
       selMenu = c
       
       If c.Children.Count > 0 Then
          For Each cc In c.Children
            If Len(cc.Caption) > Len(longStr) Then
                longStr = cc.Caption
            Endif
          Next
       Endif     
    Endif
  Next
 
  rectH = Last.Font.TextHeight(longStr)
  rectW = Last.Font.TextWidth(longStr) + 30

End

Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 13 Marzo 2020, 10:16:28
certo chiedere di inserire l'evento sarebbe la cosa più pulita da fare...
E' vero, ma bisogna pur dire che non avere sempre la "pappa pronta" a disposizione stimola l'apprendimento e la curiosità.   ;D



...un timer è un controllo "dispendioso" (almeno in Windows)
Come puoi vedere, infatti, nel mio breve codice l'oggetto "Timer" viene attivato per il solo tempo di apertura della finestra del Menu: quando il Menu poi viene chiuso (cfr. subroutine Menu1_Hide() ), il Timer viene contestualmente arrestato.



Gianluigi , perchè dici che i menù button non stanno sempre nella stessa posizione?
Questo resta il mistero principale.
(https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcRWpY7xs6uWX8X7DoxXRIBjcEWoRaDPqcdR9hW1ur-0q0b3Dt6p)
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 13 Marzo 2020, 10:28:05
  Dim idx As Integer = 0
In Gambas, a differenza del C, una variabile è sempre impostata a 0 in modo predefinito.


   
  If Not IsNull(selMenu)
Che cosa è "selMenu" ?



... dato che sono neofita di questo linguaggio...
Eh, però vedo che te la cavi bene !
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 13 Marzo 2020, 11:41:02


Gianluigi , perchè dici che i menù button non stanno sempre nella stessa posizione?

... Ogni controllo (tranne i menù) ha la proprietà ScreenX e ScreenY, ...


Hai perfettamente ragione, mai dare per scontato qualcosa senza prima provarlo, scusa.
Io ho ragionato (si fa per dire) basandomi sul codice di vuott riferito ai menu.

Ho inserito il codice del tuo post tra i tag corretti (pulsante #) la prossima volta fallo tu, grazie.

@Corvina @vuott
A me il MenuButton sulla master non funziona a dovere (oppure non so più farlo funzionare  :-\ ) a voi?
Ho anche chiesto sulla ML

 :ciao:
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 13 Marzo 2020, 12:05:04
Io ho ragionato (si fa per dire) basandomi sul codice di vuott riferito ai menu.
Eeeeeh ?!   :o :rolleyes:
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Corvina - 13 Marzo 2020, 12:18:07
  Dim idx As Integer = 0
In Gambas, a differenza del C, una variabile è sempre impostata a 0 in modo predefinito.


   
  If Not IsNull(selMenu)
Che cosa è "selMenu" ?

selMenù è il menù del menù button su cui sono. Io ho 6 menù button raggruppati e nell'evento [group]_enter imposto selMenu con quello del bottone in cui sono. E' per creare solo i rettangoli dello specifico menù, se no li avrei dovuti creare tutti...




... dato che sono neofita di questo linguaggio...
Eh, però vedo che te la cavi bene !
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Corvina - 13 Marzo 2020, 12:24:07

Ho inserito il codice del tuo post tra i tag corretti (pulsante #) la prossima volta fallo tu, grazie.


Grazie non sapevo come fare....effettivamente non frequento molti forum
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 13 Marzo 2020, 12:30:11
Io ho ragionato (si fa per dire) basandomi sul codice di vuott riferito ai menu.
Eeeeeh ?!   :o :rolleyes:

 :violent:

Invece di fare tanto il furbo, potresti rispondere alla domanda:
Riesci a creare via Editor dalla IDE un menu con sotto-menu che funzioni come popup in un MenuButton?
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 13 Marzo 2020, 12:32:06

Ho inserito il codice del tuo post tra i tag corretti (pulsante #) la prossima volta fallo tu, grazie.


Grazie non sapevo come fare....effettivamente non frequento molti forum

Prego, dai un'occhiata qui:
https://www.gambas-it.org/smf/index.php?topic=7397.msg47180#new
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 13 Marzo 2020, 12:49:36
Invece di fare tanto il furbo, potresti rispondere alla domanda:
Riesci a creare via Editor dalla IDE un menu con sotto-menu che funzioni come popup in un MenuButton?
Stamattina non posso.
Comunque io l'oggetto MenuButton non l'ho mai usato.
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Corvina - 13 Marzo 2020, 17:56:55
Io ho ragionato (si fa per dire) basandomi sul codice di vuott riferito ai menu.
Eeeeeh ?!   :o :rolleyes:

 :violent:

Invece di fare tanto il furbo, potresti rispondere alla domanda:
Riesci a creare via Editor dalla IDE un menu con sotto-menu che funzioni come popup in un MenuButton?

Dall' editor per creare un popup_menu basta che nell'elemento padre la proprietà caption sia vuota. Poi nel menu button valorizzi la proprietà menù (ti spunta l'elenco dei popup_menu) e io ho anche settato menuonly a true.
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 13 Marzo 2020, 18:30:23

Dall' editor per creare un popup_menu basta che nell'elemento padre la proprietà caption sia vuota. Poi nel menu button valorizzi la proprietà menù (ti spunta l'elenco dei popup_menu) e io ho anche settato menuonly a true.

Si, corretto, ma pare che nella master (la versione di sviluppo) ci sia un bug, almeno credo.
Se clicchi sul menu Help della IDE (quello col punto interrogativo) > Informazioni di sistema, nella finestra che appare, sotto System c'è il tipo di Gambas che stai usando.
Puoi comunicarmelo?
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 13 Marzo 2020, 18:49:54
Dall' editor per creare un popup_menu basta che nell'elemento padre la proprietà caption sia vuota. Poi nel menu button valorizzi la proprietà menù (ti spunta l'elenco dei popup_menu) e io ho anche settato menuonly a true.
...e brava la "neofita" !   ;D

Dalla tua  spiegazione ho generato un'apposita pagina della nostra Wiki, ovviamente citando l'autrice del suggerimento:

    https://www.gambas-it.org/wiki/index.php?title=Creare_via_Editor_dalla_IDE_un_Menu_con_sotto-menu_che_funzioni_come_popup_in_un_MenuButton
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 13 Marzo 2020, 19:02:49

...e brava la "neofita" !   ;D

...

Si brava davvero infatti, se non specificava la procedura non mi sarei accorto che infilavo il menu in popupmenu invece che in menu.  :rolleyes:

Pazienza, da quando mi sono incartato con Git non ne azzecco più una...

Proverò con una cura ricostituente.

Va da se che non serve più sapere con che versione di Gambas sta operando Corvina.

 :ciao:
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 13 Marzo 2020, 19:15:29
Pazienza, da quando mi sono incartato con Git non ne azzecco più una...

Proverò con una cura ricostituente.

Mac-chi-na del Tem-po ! Mac-chi-na del Tem-po !
Da quando hai abbandonato il Codice dei Codici, da scrivere, ti sei perso.
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 13 Marzo 2020, 20:08:02
Mac-chi-na del Tem-po ! Mac-chi-na del Tem-po !
Da quando hai abbandonato il Codice dei Codici, da scrivere, ti sei perso.

Ben altri e più capaci di me, come tu sai bene, sono impegnati in cotanto codice  ;D
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 15 Marzo 2020, 17:34:41
Qui il codice, magari viene fuori un idea per ottimizzarlo
...

Ho dato un'occhiata al tuo codice purtroppo non approfondita come avrei voluto, e sembra che le mie prime impressioni siano confermate.
Nota che dico sembra :)

Vedo troppi numeri fissi es. 25 per posizionare l'Y del rettangolo.
Questo numero non può essere fisso, deve essere recuperato dall'altezza del menu che probabilmente deriva dall'altezza del carattere più una percentuale per il padding, altrimenti su un OS con carattere diverso (più grande o più piccolo) causerà dei malfunzionamenti.

Lo stesso discorso vale per la larghezza.

A proposito di larghezza andrebbe tenuto conto delle scorciatoie da tastiera (If cc.Shortcut Then Print "TRUE").
Se ti attieni alla riga più lunga per tutti i menu e sotto-menu (mancano i sotto sotto-menu) cosa accadrebbe se i menu fossero molto più corti dei sotto-menu?

Insisto iscriviti al bugtraker e chiedi a Benoit Minisini di inserire un evento utile allo scopo.
Però tieni conto che l'eventuale nuova opzione sarà immediatamente disponibile solo sulla versione master di Gambas.
È meglio sbrigarsi se si vuole poterne usufruire sulla prossima stabile.

 :ciao:
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Corvina - 16 Marzo 2020, 09:02:36
Citazione
Dalla tua  spiegazione ho generato un'apposita pagina della nostra Wiki, ovviamente citando l'autrice del suggerimento:

    https://www.gambas-it.org/wiki/index.php?title=Creare_via_Editor_dalla_IDE_un_Menu_con_sotto-menu_che_funzioni_come_popup_in_un_MenuButton

Troppo onore
Grazie
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Corvina - 16 Marzo 2020, 09:06:40

Ho dato un'occhiata al tuo codice purtroppo non approfondita come avrei voluto, e sembra che le mie prime impressioni siano confermate.
Nota che dico sembra :)

Vedo troppi numeri fissi es. 25 per posizionare l'Y del rettangolo.
Questo numero non può essere fisso, deve essere recuperato dall'altezza del menu che probabilmente deriva dall'altezza del carattere più una percentuale per il padding, altrimenti su un OS con carattere diverso (più grande o più piccolo) causerà dei malfunzionamenti.

Lo stesso discorso vale per la larghezza.

A proposito di larghezza andrebbe tenuto conto delle scorciatoie da tastiera (If cc.Shortcut Then Print "TRUE").
Se ti attieni alla riga più lunga per tutti i menu e sotto-menu (mancano i sotto sotto-menu) cosa accadrebbe se i menu fossero molto più corti dei sotto-menu?

Insisto iscriviti al bugtraker e chiedi a Benoit Minisini di inserire un evento utile allo scopo.
Però tieni conto che l'eventuale nuova opzione sarà immediatamente disponibile solo sulla versione master di Gambas.
È meglio sbrigarsi se si vuole poterne usufruire sulla prossima stabile.

 :ciao:

Grazie dei suggerimenti. Per il bugtraker lo faccio entro oggi
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Corvina - 16 Marzo 2020, 09:08:44

Si, corretto, ma pare che nella master (la versione di sviluppo) ci sia un bug, almeno credo.
Se clicchi sul menu Help della IDE (quello col punto interrogativo) > Informazioni di sistema, nella finestra che appare, sotto System c'è il tipo di Gambas che stai usando.
Puoi comunicarmelo?

Ecco, ma non mi fare domande hardware perchè lì sono una vera schiappa. Lavoro su di una macchina virtuale che mi ha preparato il mio collega spagnolo.

Codice: [Seleziona]
[System]
Gambas=3.11.4
OperatingSystem=Linux
Kernel=3.10.0-957.27.2.el7.x86_64
Architecture=x86_64
Distribution=redhat CentOS Linux release 7.6.1810 (Core)
Desktop=MATE
Theme=Windows
Language=es_ES.UTF-8
Memory=7803M

[Libraries]
Cairo=libcairo.so.2.11512.0
DBus=libdbus-1.so.3.14.14
GTK+2=libgtk-x11-2.0.so.0.2400.31
OpenGL=libGL.so.1.7.0

[Environment]
B_LKPATH=<home>/pgr:.
B_MACAD=00:19:5B:6F:59:FE
B_MACLO=15
B_MACNA=1
B_MACNU=8
B_MACPC=118
B_MACPW=DFHLLH
B_MACSN=2130
B_PATH=<home>/files:.
B_TERMTYPE=COHERENT
B_YR2000=50
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-QzvpQP3gX2,guid=d6a35df8f49987b239af415b5e6f1c63
DESKTOP_SESSION=mate
DISPLAY=:0
EDITOR=vi
GB_GUI=gb.qt4
GDMSESSION=mate
GDM_LANG=es_ES.UTF-8
GIO_LAUNCHED_DESKTOP_FILE=<home>/Escritorio/GAMBAS.desktop
GIO_LAUNCHED_DESKTOP_FILE_PID=6965
GTK_IM_MODULE=gtk-im-context-simple
GTK_OVERLAY_SCROLLING=0
HISTCONTROL=ignoredups
HISTSIZE=1000
HOME=<home>
HOSTNAME=<hostname>
IMSETTINGS_INTEGRATE_DESKTOP=yes
IMSETTINGS_MODULE=none
LANG=es_ES.UTF-8
LESSOPEN=||/usr/bin/lesspipe.sh %s
LOGNAME=<user>
MAIL=/var/spool/mail/<user>
MATE_DESKTOP_SESSION_ID=this-is-deprecated
OLDPWD=<home>
PATH=<home>/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:<home>/pgr:<home>/bin
PWD=<home>/files
QT_GRAPHICSSYSTEM_CHECKED=1
QT_IM_MODULE=xim
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/4808,unix/unix:/tmp/.ICE-unix/4808
SHELL=/bin/bash
SHLVL=1
SSH_AGENT_PID=4971
SSH_AUTH_SOCK=/run/user/1001/keyring/ssh
TERM=dumb
TTY=
TZ=:/etc/localtime
USER=<user>
USERNAME=<user>
WINDOWPATH=1
XAUTHORITY=/run/gdm/auth-for-<user>-UMYZf4/database
XDG_CURRENT_DESKTOP=MATE
XDG_DATA_DIRS=<home>/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
XDG_RUNTIME_DIR=/run/user/1001
XDG_SEAT=seat0
XDG_SESSION_DESKTOP=mate
XDG_SESSION_ID=1
XDG_SESSION_TYPE=x11
XDG_VTNR=1
XMODIFIERS=@im=none
_=/usr/bin/mate-session
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 16 Marzo 2020, 23:56:58
Grazie dei suggerimenti. Per il bugtraker lo faccio entro oggi

Prego, speriamo che ti risponda positivamente...
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 17 Marzo 2020, 00:03:41

Ecco,


Grazie, ma come detto il bug era nella mia testa  ;)

Citazione
ma non mi fare domande hardware perchè lì sono una vera schiappa.

Tranquilla anche io con l'hardware non ho un buon rapporto  :)
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: vuott - 17 Marzo 2020, 01:04:28
Tranquilla anche io con l'hardware non ho un buon rapporto  :)

.......figuriamoci, allora, con la costruzione di una Macchina del Tempo !

(https://i.gifer.com/6Th1.gif)
Titolo: Re:[Risolto]Intercettare selezione di menù
Inserito da: Gianluigi - 18 Maggio 2020, 17:16:21
Grazie dei suggerimenti. Per il bugtraker lo faccio entro oggi

Prego, speriamo che ti risponda positivamente...

Visto che Minisini ha risposto picche riguardo alla richiesta delle nuova proprietà Select per i menu, propongo questo nuovo calcolo della dimensione dei menu che dovrebbe tener conto delle diverse situazioni Desktop.

Codice: [Seleziona]
Private Menu1 As Menu
Private Menu2 As Menu
Private Menu3 As Menu
Private Menu4 As Menu
Private tm As Timer
Private $iOLdText As Integer
Private $iNewText As Integer
Private $iOldShortcut As Integer
Private $iNewShortcut As Integer
Private $iPicture As Integer
Private $iFirstMenuWidth As Integer
Private $hLabel As Label

Public Sub Form_Open()

  Dim DS As Integer = Desktop.Scale
  Dim hMenu, hMenu2 As Menu
  Dim hSpring As Spring
  Dim hHBox As HBox

  With Menu1 = New Menu(Me) As "Menu1"
    .Caption = "Menu1"
  End With
  With Menu2 = New Menu(Menu1) As "Menu2"
    .Caption = "Menu2"
    .Shortcut = "ALT+O"
    .Picture = Picture["icon:/16/open"]
    .Tag = "Questo è il Menu2 !"
  End With
  With Menu3 = New Menu(Menu1) As "Menu3"
    .Caption = "Menu menu menu3"
    .Tag = "Questo è il Menu3 !"
  End With
  With Menu4 = New Menu(Menu1) As "Menu4"
    .Caption = "Menu menu 4"
    .Shortcut = "CTRL+M"
    .Tag = "Questo è il Menu4 !"
  End With
  Me.Arrangement = Arrange.Vertical
  Me.Margin = True
  hSpring = New Spring(Me)
  hHBox = New HBox(Me)
  hHBox.H = 40
  $hLabel = New Label(hHBox)
  $hLabel.Expand = True
  ' Calcolo che dovrebbe tenere conto degli spazi basandosi su Desktop.Scale
  For Each hMenu In Me.Menus
    Print hMenu.Name
    If hMenu.Children.Count > 0 Then Print "CHILDREN"
    For Each hMenu2 In hMenu.Children
      Print hMenu2.Name
      If hMenu2.Picture Then $iPicture = 16
      If hMenu2.Shortcut Then
        $iNewShortcut = Me.Font.TextWidth(hMenu2.Shortcut)
        If $iOldShortcut < $iNewShortcut Then $iOldShortcut = $iNewShortcut
      Endif
      $iNewText = Me.Font.TextWidth(hMenu2.Caption)
      If $iOLdText < $iNewText Then $iOLdText = $iNewText
    Next
    $iFirstMenuWidth = DS + $iPicture + (DS * 3) + $iOLdText + (DS * 6) + $iOldShortcut
  Next

End

Public Sub Menu1_Show()

  With tm = New Timer As "Tempus"
    .Delay = 50
    .Start
  End With

End

Public Sub Tempus_Timer()

  Dim DS As Integer = Desktop.Scale
  Dim hRect2 As New Rect(Menu1.Window.X + DS, Menu1.Window.Y + (DS * 3), $iFirstMenuWidth, DS * 3)
  Dim hRect3 As New Rect(Menu1.Window.X + DS, Menu1.Window.Y + (DS * 3) * 2, $iFirstMenuWidth, DS * 3)
  Dim hRect4 As New Rect(Menu1.Window.X + DS, Menu1.Window.Y + (DS * 3) * 3, $iFirstMenuWidth, DS * 3)

  $hLabel.Text = Null
  If hRect2.Contains(Mouse.ScreenX, Mouse.ScreenY) Then $hLabel.Text = Menu2.Tag
  If hRect3.Contains(Mouse.ScreenX, Mouse.ScreenY) Then $hLabel.Text = Menu3.Tag
  If hRect4.Contains(Mouse.ScreenX, Mouse.ScreenY) Then $hLabel.Text = Menu4.Tag

End

Public Sub Menu1_Hide()

  tm.Stop

End

 :ciao:

Dimenticavo naturalmente usando il componente gb.gui.qt (no gtk)