Autore Topic: [Risolto] Gestione Form attive  (Letto 2889 volte)

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
[Risolto] Gestione Form attive
« il: 15 Giugno 2017, 21:06:00 »
Buonasera a tutti,
mi serve un vostro aiuto per trovare un metodo di gestione per più Form attive,
non sò se ricordo male ma sul Forum qualcosa del genere si era già discusso,
facendo tutte le ricerche possibili non sono riuscito a trovare niente che mi
potesse dare uno spunto.
Praticamente quello che mi serve implementare nel programma che stò creando è
il seguente:
in qualsiasi punto del programma mi trovi ho la neccessità tramite un tasto
per esempio Esc (vecchio rettaggio di programmi IBM) di richiamare un'apposita Form,
senza chiudere quella attiva (in modalità ShowModal per capirci) che mi visualizzi
un elenco (max 5) di Form rimaste attive, in quanto richiamate in altri momenti e non
chiuse con apposito pulsante, avendo la possibilità di selezionarne una che ovviamente
diverrà la Form attiva principale. Spero di avervi fatto capire cosa mi neccessita.
Vi allego un'immagine di quello che vorrei ottenere.
Aspetto fiducioso vostri suggerimenti
« Ultima modifica: 22 Ottobre 2017, 21:55:09 da Gianluigi »
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Gestione Form attive
« Risposta #1 il: 16 Giugno 2017, 00:07:02 »
Avevo pensato a qualcosa del genere da affinare, ma non capisco perchè DesktopWindow non mi ritorna i nomi delle finestre.
Ora sono stanco e vado a nanna, magari voi capite l'inghippo.
 :ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gestione Form attive
« Risposta #2 il: 16 Giugno 2017, 01:01:14 »
...DesktopWindow non mi ritorna i nomi delle finestre.
Devi utilizzare la proprietà ".VisibleName" anziché ".Name". Ciò, però, comporta anche che devi modificare i valori stringa di ciascun "Case" nel "Select Case", contenuto nella routine "Form_Open( )". Quindi ad esempio nel primo "Case" avrai "ARTICOLI".


Ad ogni buon fine modificherei la Classe "FMenu.class" come segue:
Codice: [Seleziona]
Private $sName As String

Public Sub Form_Open()
 
  Dim w As DesktopWindow
 
  For Each w In Desktop.Windows
    Select Case w.VisibleName
      Case "ARTICOLI"
        ListView1.Add("1", "Finestra Articoli")
      Case "CLIENTI"
        ListView1.Add("2", "Finestra Clienti")
      Case "FORNITORI"
        ListView1.Add("3", "Finestra Fornitori")
      Case "INTERROGAZIONI"
        ListView1.Add("4", "Finestra Interrogazioni")
      Case "ORDINI"
        ListView1.Add("5", "Finestra Ordini")
      Case "STATISTICA"
        ListView1.Add("6", "Finestra Statistica")
    End Select
  Next

End

Public Sub ReturnName() As String

  Me.ShowModal()

End

Public Sub ListView1_Click()
 
  Dim s As String
 
  s = ListView1.Key
  Select Case s
    Case "1"
      $sName = "Articoli"
    Case "2"
      $sName = "Clienti"
    Case "3"
      $sName = "Fornitori"
    Case "4"
      $sName = "Interrogazioni"
    Case "5"
      $sName = "Ordini"
    Case "6"
      $sName = "Statistica"
  End Select
 
' Individua l'handle della finestra, scelta dalla lista della "ListView", e la imposta come finestra "Attiva":
  Desktop.ActiveWindow = Desktop.FindWindow($sName, Null, Null)[0]

End

Public Sub btnOK_Click()

  Me.Close(True)

End

Public Sub btnCancel_Click()

  Me.Close

End


« Ultima modifica: 16 Giugno 2017, 01:34:44 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Gestione Form attive
« Risposta #3 il: 16 Giugno 2017, 12:21:33 »
 :ciao: vuott,
ti ringrazio perchè mi hai permesso di capire dove sbagliavo, sbagliavo nel valore di ritorno che non vedevo perchè quando si è stanchi non si ragiona e io guardavo la console vuota solo perchè troppo sottile e mi sono dimenticato che occorre sempre (tenendo Echo a true) guardare l'Open contents.
Come regola usare w.Name dovrebbe funzioinare sempre perchè dovrebbe ritornare il Name anche se Text o Title non sono impostati, se impostati ritorna quello (vedo ora ma non lo sapevo e mi pare assurdo).
Invece mi accorgo che così non è e secondo me si tratta di un bug tu cosa ne dici?
Comunque io preferisco avere un valore di ritorno su cui poter lavorare, perchè hai cambiato quella parte di codice?
Non è meglio come l'ho pensato io? Se l'utente ci ripensa?
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gestione Form attive
« Risposta #4 il: 16 Giugno 2017, 13:45:23 »
si tratta di un bug tu cosa ne dici?
Non saprei: è da anni che riscontro questo problema.



Se l'utente ci ripensa?
E' giusto: evitare gravi errori, in futuro irrimediabili, è l'opportunità più importante.   
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Gestione Form attive
« Risposta #5 il: 16 Giugno 2017, 17:01:34 »
si tratta di un bug tu cosa ne dici?
Non saprei: è da anni che riscontro questo problema.
Secondo Bruen sulla ML sembrerebbe corretto così al 100%.
Citazione

Se l'utente ci ripensa?
E' giusto: evitare gravi errori, in futuro irrimediabili, è l'opportunità più importante.   
Questa tua risposta appare più una considerazione filosofica che  però la interpreto come risposta affermativa e pertanto se sei d'accordo sintetizzerei la risposta a Tornu con questo codice allegato.
 :ciao: :ciao:
« Ultima modifica: 16 Giugno 2017, 17:02:37 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gestione Form attive
« Risposta #6 il: 16 Giugno 2017, 21:09:51 »
però la interpreto come risposta affermativa
In vero ognuno ha le sue esigenze e decide per sé.  :-\
Sarà Tornu in fine a fare la sua scelta.



se sei d'accordo
Ma io mica appongo l'imprimatur ai codici !
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Gestione Form attive
« Risposta #7 il: 16 Giugno 2017, 22:16:20 »
In base a quanto ho capito delle esigenze di Tornu ho proposto un codice che potesse soddisfarle.
C'era un piccolo particolare, che il codice proposto non funzionava  ;D
Tu lo hai fatto funzionare, a quel punto è diventato un codice a "due mani".
Ti ho chiesto un chiarimento che ho creduto di "sintetizzare" nell'ultimo codice proposto e quindi trovo corretto chiederne la tua approvazione, tutto li.
Va da se che poi Tornu farà quel che vuole.  :)

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gestione Form attive
« Risposta #8 il: 16 Giugno 2017, 23:33:44 »
trovo corretto chiederne la tua approvazione, tutto li.

Approbatio, ratificatio, assensus atque consensus a Nobis eisdem Romanis Pontificibus et Ecclesiæ in perpetuum conceduntur.   
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re:Gestione Form attive
« Risposta #9 il: 17 Giugno 2017, 10:45:47 »
Inanzitutto grazie per la vostra solerte risposta.
Analizzando quanto da voi proposto, non è esattamente quanto volevo ottenere,
è comunque una traccia, il mio solito problema nell'esporre in modo chiaro i quesiti.
Nell'esempio allegato da Gianluigi all'avvio del programma nel Modulo MMain le Form
vengono avviate tutte a prescindere, infatti se premo Esc nella FMenu vengono visualizzate
tutte contemporaneamente. Nel mio caso essendo il programma un gestionale non so quale Form
andrò a richiamare in un determinato punto dello stesso, tenedo presente che al momento sono
già una trentina (è sono solo all'inizio dello sviluppo). Quello che avete proposto diciamo che a me
servirebbe "dinamico", nel senso:
- All'avvio la FMenu se richiamata sarà vuota
- Se apro la FArticoli chè in quel momento sarà la Form attiva solo lei sarà visibile in FMenu
   se richiamato
- Mentre la FArticoli e attiva dalla barra dei menù apro FFornitori che diverrà la Form visibile,
  se in questo momento richiamo con Esc FMenu, verranno visualizzate FArticoli e FFornitori.
- Se chiudo tramite pulsante per esempio "Chiusura" o "Uscita" la FFornitori, tornerà visibile la
  FArticoli e richiamando FMenu sarà visibile solo FArticoli
Tutto questo ovviamente per un numero limitato di Form (max 5 contemporaneamente come avevo già scritto),
ovviamente al tentativo di aprire la sesta ci sarà un controllo che avvertirà di aver raggiunto il numero massimo.
La gestione se ci si riesce in FMenu dovrebbe essere gerarchica, l'ultima Form richiamata deve diventare la prima
della lista se sono presenti altre, le altre devono scalare.
Mi scuso per la lungaggine.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gestione Form attive
« Risposta #10 il: 17 Giugno 2017, 13:54:00 »
Risposndo come ti risponderebbero nei forum del linguaggio C:
...ma hai tentato ? Facci vedere un po' il codice con cui hai tentato ... vediamo dove sbagli ...
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Gestione Form attive
« Risposta #11 il: 17 Giugno 2017, 14:53:28 »
Vi è da precisare che nel mio ultimo codice c'è un'errore nel codice:
Codice: [Seleziona]
Public Sub Form_Open()
 
  Dim w As DesktopWindow
 
  For Each w In Desktop.Windows
    Print w.VisibleName
    Select Case w.VisibleName
      Case "ARTICOLI"
        ListView1.Add("1", "Finestra Articoli")
      Case "CLIENTI"
        ListView1.Add("2", "Finestra Clienti")
      Case "FORNITORI"
        ListView1.Add("3", "Finestra Fornitori")
      Case "INTERROGAZIONI"
        ListView1.Add("4", "Finestra Interrogazioni")
      Case "ORDINI"
        ListView1.Add("5", "Finestra Ordini")
      Case "STATISTICA"
        ListView1.Add("6", "Finestra Statistica")
    End Select
  Next

End
Ho invertito due voci, questo è quello di Vuott (giusto).
La distrazione è la mia prerogativa  ;D

Chiudendo delle finestre e poi dando Esc in console appaiono errori tipo questi:

Codice: [Seleziona]
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0000d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0000d

Ricevo, ma non sempre, l'errore Out of bound da Desktop.FindWindow(s, Null, Null)[0] quando, dopo le chiusure, le finestre rimangono due. Forse ci vorrebbe un refresh...  :-\

Comunque anche io penso che concettualmente il codice postato faccia quello che chiedi.

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gestione Form attive
« Risposta #12 il: 17 Giugno 2017, 15:06:37 »
Ricevo, ma non sempre, l'errore Out of bound da Desktop.FindWindow(s, Null, Null)[0]
Potresti anche provare ad integrare il primo parametro del Metodo ".FindWindow( )" con un paio di asterischi, come quando si usa l'operatore Like.

Codice: [Seleziona]
...Desktop.FindWindow("*" & s & "*", ....



« Ultima modifica: 17 Giugno 2017, 15:07:43 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Gestione Form attive
« Risposta #13 il: 17 Giugno 2017, 15:52:45 »
Mi sembra che non cambi niente, comunque se mettiamo un Try davanti a Desktop.ActiveWindow = così:

Codice: [Seleziona]
If Not IsNull(s) Then Try Desktop.ActiveWindow = Desktop.FindWindow("*" & s & "*", Null, Null)[0]

Sembra funzionare e non mi da più errore.

Rimangono gli :

Codice: [Seleziona]
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0001d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0001d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00015
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00015
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0001d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0001d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0000d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0000d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00015
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00015
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0001d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0001d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0000d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0000d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00011
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00011
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00015
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00015
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0001d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0001d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0000d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0000d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00011
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00011
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00015
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00015
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00019
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c00019
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0001d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0001d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x20455355
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x2052554f

in console.
Si aggiungono ogni volta che si chiude la finestra attiva e si da Esc (ho provato a mettere dei Try sul caricamento del menu ma senza risultato)  :-\

 :ciao: :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gestione Form attive
« Risposta #14 il: 17 Giugno 2017, 17:17:20 »
Chiudendo delle finestre e poi dando Esc in console appaiono errori tipo questi:

Codice: [Seleziona]
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0000d
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 20 (X_GetProperty)
  Resource id:  0x3c0000d
I valori espresi in rappresentazione esadecimale sono gli identificativi di ciascuna finestra chiusa, dopo che - come hai sottolineato tu - sia stata già chiusa la finestra "MENU".

Per verificare ciò, è sufficiente porre alla fine della routine "Sub ListView1_Click( )" questa riga di codice:
Codice: [Seleziona]
Print Hex(Desktop.FindWindow($sName, Null, Null)[0], 8), $sName
e compiere quindi tutta la sequenza del test.
« Ultima modifica: 17 Giugno 2017, 17:20:05 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »