Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Sujets variés concernant le développement en PureBasic
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par Golfy »

Avant d'attaquer un gros programme, je veux m'assurer que je gère correctement de multiples fenêtres (y compris des options)

Code : Tout sélectionner

Global Window_0, Window_1, Window_2

Global Button_1, Button_2, Button_101, Button_102, Button_201, Button_202


Procedure OpenWindow_0(x = 300, y = 0, width = 600, height = 400)
  Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  Button_1 = ButtonGadget(#PB_Any, 20, 200, 260, 100, "Option 1")
  Button_2 = ButtonGadget(#PB_Any, 300, 200, 260, 100, "Option 2")
EndProcedure

Procedure OpenWindow_1(x = 0, y = 400, width = 600, height = 400)
  Window_1 = OpenWindow(#PB_Any, x, y, width, height, "Options 1", #PB_Window_Tool)
  Button_101 = ButtonGadget(#PB_Any, 20, 200, 260, 80, "Win 1 : Option 1")
  Button_102 = ButtonGadget(#PB_Any, 300, 200, 260, 80, "Close")
EndProcedure

Procedure OpenWindow_2(x = 500, y = 400, width = 600, height = 400)
  Window_2 = OpenWindow(#PB_Any, x, y, width, height, "Options 2", #PB_Window_Tool)
  Button_201 = ButtonGadget(#PB_Any, 20, 200, 260, 80, "Win2 : Option 1")
  Button_202 = ButtonGadget(#PB_Any, 300, 200, 260, 80, "Close")
EndProcedure

Procedure Window_0_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #True

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_1
          OpenWindow_1()
        Case Button_2
          OpenWindow_2()
      EndSelect
  EndSelect
  ProcedureReturn #False
EndProcedure

Procedure Window_1_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      CloseWindow(Window_1)
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_101
          Debug "Click Bouton Win1"
        Case Button_102
          CloseWindow(Window_1)
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

Procedure Window_2_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      CloseWindow(Window_2)
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case Button_201
          Debug "Click Bouton Win2"
        Case Button_202
          CloseWindow(Window_2)
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

Quit = #False
OpenWindow_0()
Repeat
  Event = WaitWindowEvent(20)
  NoWin = EventWindow()
  If Event
    Select NoWin
      Case Window_0    
        Quit  = Window_0_Events(event)
      Case Window_1
        Window_1_Events(event)
      Case Window_2
        Window_2_Events(event)
    EndSelect
  EndIf
Until quit = #True
Merci de vos suggestions.
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par MLD »

Bonjour Golfy

A mon avis cela fait un peu fouillis. Mais ce n'est que mon avis.
Dernière modification par MLD le lun. 28/oct./2013 9:31, modifié 2 fois.
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par MLD »

Bonjour Golfy

A mon avis cela fait un peu fouillis. Mais ce n'est que mon avis.
Perso je préfère faire comme ceci.

Procedure (xxx)
OpenWindow((#PB_Any, 300, 0, 600, 400)
Button_1 = ButtonGadget(#PB_Any, 20, 200, 260, 100, "Option 1")
Button_2 = ButtonGadget(#PB_Any, 300, 200, 260, 100, "Option 2")

Boucle générale


endprocedure

Une séparation nette des évents de chaque fenêtre est préférable.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par Micoute »

Bonjour Golfy et MLD,

Moi pour ma part, j'aurais plutôt utilisé les modules, ça permet d'avoir exactement les mêmes procédures dans chaque modules, tu auras juste à écrire le premier module et faire un copier-coller pour fabriquer les autres et modifier éventuellement les paramètres, car je ne comprend pas pourquoi on ferait des modules identiques.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par Backup »

......
Dernière modification par Backup le lun. 18/août/2014 16:25, modifié 3 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par Ar-S »

Dans le 1er code, vire les If CreateGadgetList (...) endif et ce sera parfait :)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par Golfy »

Merci à tous :)

Cela confirme que le code généré automatiquement par le nouveau Form Designer n'est pas "idéal" (j'ai fait une première fenêtre puis j'ai copié 2 fois pour faire les options).

@Dobro : oui, je ne suis pas allé dans le détail, la question étant (sur le fond) l'utilisation d'une seule boucle de gestion des événements et le renvoi vers les procédures de gestion des fenêtres correspondantes.
De plus, je suis définitivement allergique aux codes qui appellent des procédures Win API : j'utilise (peut-être à tort) aussi des systèmes Linux :wink:

@MLD : tu mettrais la boucle générale dans la procédure ? je pensais que la méthode
Déclaration (voire procédures repliées (type procedure xxx().... endprocedure) )
Boucle principale
Data
était correcte... :oops:

Si vous avez d'autres suggestions, je prends (par exemple, quid de l'utilisation de constantes plutôt que de variables globales ? quid ancienne méthode avec enum ?)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par Backup »

Golfy a écrit : De plus, je suis définitivement allergique aux codes qui appellent des procédures Win API : j'utilise (peut-être à tort) aussi des systèmes Linux :wink:

cela ne concerne QUE le deuxieme code, qui utilise le CallBack()
mais le Premier Code, lui ,est traditionnel et multiplateforme ! ;)
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par Golfy »

Dobro a écrit : cela ne concerne QUE le deuxieme code, qui utilise le CallBack()
mais le Premier Code, lui ,est traditionnel et multiplateforme ! ;)
Exact, j'avais mal vu sur l'écran du smartphone :oops:
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par MLD »

@ Petite illustration de mes propos

Code : Tout sélectionner

;MLD le 28/10/2013

Enumeration
  #Ma_fen
  #btfen2
  #Ma_fen2
  #btstop
EndEnumeration

 Procedure fen2()
OpenWindow(#Ma_fen2,550,300,300,100,"Ma Fenêtre",#PB_Window_BorderLess | #PB_Window_Invisible)
;SetClassLongPtr_(WindowID(#Ma_fen2),#GCL_STYLE,$00020000);*** pour faire une hombre
HideWindow(#Ma_fen2,0)
StickyWindow(#Ma_fen2,1)

; Ici vos gadgets
 ButtonGadget(#btstop, 200,70, 60, 20,"Stop")



;  Boucle générale
Repeat
Event = WaitWindowEvent()
 If Event = #PB_Event_Gadget
   Select EventGadget()
    Case #btstop
       CloseWindow(#Ma_fen2)
       Break 
   EndSelect     
 EndIf
ForEver 
EndProcedure  

OpenWindow(#Ma_fen,500,200,400,400,"Ma Fenêtre",#PB_Window_SystemMenu)
SetWindowColor(#Ma_fen,$998660)

; Ici vos gadgets
 ButtonGadget(#btfen2, 200, 360, 60, 20,"Fenêtre 2")




;  Boucle générale
Repeat
Event = WaitWindowEvent()
  Select EventGadget() 
   Case #btfen2
     fen2()
  EndSelect   
Until Event = #PB_Event_CloseWindow
End

sous window un peu d'api pour effet visuel :oops: :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par Backup »

........
Dernière modification par Backup le lun. 18/août/2014 16:25, modifié 1 fois.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par Golfy »

@MLD : si je comprend bien, tu as une boucle d'événement par fenêtre et ainsi bloquer l'utilisateur sur une seule fenêtre simultanément ?

Mon soucis est en fait l'utilisation de plusieurs modules (un par fenêtre) pour effectuer des traitements sur un flux en provenance du système domotique.
Ainsi la boucle principal doit lire le flux en PERMANENCE tandis que les modules peuvent afficher un résultat de traitement ou proposer une action sans bloquer la lecture du flux permanent.

J'en étais même à prévoir une compilation multithread !
- Fenêtre de choix :
-- Statistiques (graphiques temp, utilisation, etc.)
-- Visualisation géographique (et action en cliquant sur une représentation de lampe/prise/inter...)
-- Traitements des alertes (réveil, alarmes, ...)
-- Logs

Les 4 modules utilisent la même liste d'éléments (les messages provenant du bus domotique)

C'est pourquoi je veut gérer plusieurs fenêtres mais une seule boucle principale... est-ce logique ou dois-je prévoir une gestion différente ?

A Noter: les bouts de programmes initiaux sont devenus tellement complexes qu'ils sont ingérables et impossible à ré-utiliser en l'état :oops:
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par Backup »

perso , a ta place , pour ce genre de Prg , j'aurai Multithreadé !


le multitrhead , c'est une forme de "parallélisme" (avec Timer)

c'est LA solution pour gerer plusieurs trucs en meme temps ....

j'aurai un noyau de code , qui fait appel a plusieurs "modules de code" de façon sequenciel automatique

un peu comme un Ordonnanceur .... (voir multitache "Ordonnanceur" )

une sorte "d'horloge" , ou chaque petit trait de l'horloge (les secondes) est une action a effectuer

lorsque "l'horloge" a fait le tour , elle recommence ...

donc les 60 petits traits (les taches) sont toutes effectuées les une apres les autres....
pendant un Cycle d'horloge (c'est une image ) :) l'ensemble , donne l'impresson que ça s'execute en meme temps :)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Est-ce la bonne méthode pour utiliser plusieurs fenêtres

Message par MLD »

@ Golfy

Pour mes programmes, je suis parti du principe suivant:
Une fenêtre principale avec donc une boucle d'évent qui tourne en permanence.
Comme chaque procédure est théoriquement indépendante sauf indication contraire,rien empêche de créer une fenêtre secondaire et de faire tourner une boucle d'event inhérente a cette fenêtre dans la procédure.
Pour ton problème tu peux mettre en variable global dans la boucle de la fenêtre principale le flux du système. A partir de ce ce moment chacque fenêtre secondaire pourront alors captées le flux et faire le traitement adéquate.
Les trheads sont aussi une solution possible. tout dépend de ton imagination. :wink:
Répondre