Page 1 sur 1

PureWindow

Publié : mar. 31/mars/2020 9:08
par microdevweb
version beta 1
Make dialog use easier

Hello Guys,

A module for make dialog easier

How install it
  • Install git HERE
  • make a right click on a directory and choice "Git Bash here"
  • In the Git terminal paste this command "git clone https://github.com/microdevweb/PureWindow"
  • Open the subdirectory PureWindow" and run
    "exemple1.pb "
    "exemple2.pb "
    "exemple3.pb "
    "exemple4.pb "
Image

Code : Tout sélectionner

; --------------------------------------------------------------
; PURE_WINDOW
; version 1.0
; EXAMPLE 1
; a simple vertical box 
; --------------------------------------------------------------
XIncludeFile "include/pw/pw.pbi"
Define flags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget
Global.PW::button bt1,bt2,bt3,bt4
Global mainForm.PW::Window = PW::newWindow(0,0,800,600,"Exemple 1",flags)
mainForm\setMinHeight(200)
mainForm\setMinWidth(200)
Global mainLayout.PW::VBox = mainForm\setLayout(PW::newVBox())
Global NewList text.s()




Procedure evButton(*bt.PW::button)
  ChangeCurrentElement(text(),*bt\getData())
  Debug text()
EndProcedure

bt1 = mainLayout\addChild(PW::newButton("Button 1"))
AddElement(text()):text()="I'm the button 1"
bt1\setData(@text())
bt1\bind(@evButton())
bt2 = mainLayout\addChild(PW::newButton("Button 2"))
AddElement(text()):text()="I'm the button 2"
bt2\setData(@text())
bt2\bind(@evButton())
bt3 = mainLayout\addChild(PW::newButton("Button 3"))
AddElement(text()):text()="I'm the button 3"
bt3\setData(@text())
bt3\bind(@evButton())
bt4 = mainLayout\addChild(PW::newButton("Button 4"))
AddElement(text()):text()="I'm the button 4"
bt4\setData(@text())
bt4\bind(@evButton())


PW::Application\run(mainForm)
Image

Code : Tout sélectionner

; --------------------------------------------------------------
; PURE_WINDOW
; version 1.0
; EXAMPLE 2
; a simple horizontal box 
; --------------------------------------------------------------
XIncludeFile "include/pw/pw.pbi"
Define flags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget
Global.PW::button bt1,bt2,bt3,bt4
Global mainForm.PW::Window = PW::newWindow(0,0,800,600,"Exemple 2",flags)
mainForm\setMinHeight(200)
mainForm\setMinWidth(200)
Global mainLayout.PW::HBox = mainForm\setLayout(PW::newHBox())
Global NewList text.s()




Procedure evButton(*bt.PW::button)
  ChangeCurrentElement(text(),*bt\getData())
  Debug text()
EndProcedure

bt1 = mainLayout\addChild(PW::newButton("Button 1"))
AddElement(text()):text()="I'm the button 1"
bt1\setData(@text())
bt1\bind(@evButton())
bt2 = mainLayout\addChild(PW::newButton("Button 2"))
AddElement(text()):text()="I'm the button 2"
bt2\setData(@text())
bt2\bind(@evButton())
bt3 = mainLayout\addChild(PW::newButton("Button 3"))
AddElement(text()):text()="I'm the button 3"
bt3\setData(@text())
bt3\bind(@evButton())
bt4 = mainLayout\addChild(PW::newButton("Button 4"))
AddElement(text()):text()="I'm the button 4"
bt4\setData(@text())
bt4\bind(@evButton())


PW::Application\run(mainForm)
Image

Code : Tout sélectionner

; --------------------------------------------------------------
; PURE_WINDOW
; version 1.0
; EXAMPLE 3 
; a fic customer 
; --------------------------------------------------------------
XIncludeFile "include/pw/pw.pbi"
Define flags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget
Global.PW::button btValide,btCancel
Global.PW::HBox btLayout
Global.PW::VBox fielLayout,mainLayout
Global.PW::stringGadget stFName,stSName,stAddress
Global mainForm.PW::Window = PW::newWindow(0,0,320,20,"Exemple 3",flags)
LoadFont(0,"Arial",11,#PB_Font_HighQuality)

Procedure init()
  SetActiveGadget(stFName\getId())
EndProcedure

SetGadgetFont(#PB_Default,FontID(0))
mainLayout = mainForm\setLayout(PW::newVBox())
mainLayout\setExpand(1) ; expand field layout
fielLayout = mainLayout\addChild(PW::newVBox())
btLayout = mainLayout\addChild(PW::newHBox())
btLayout\setExpand(PW::#EXPAND_NO)
btLayout\setAlign(PW::#ALIGN_RIGHT)
stFName = fielLayout\addChild(PW::newStringGadget())
stFName\setHeight(30)
stFName\setLabel("First name")
stSName = fielLayout\addChild(PW::newStringGadget())
stSName\setHeight(30)
stSName\setLabel("Last name")

stAddress = fielLayout\addChild(PW::newStringGadget())
stAddress\setHeight(30)
stAddress\setLabel("Address")
btValide = btLayout\addChild(PW::newButton("Validate"))
btValide\setWidth(90)
btValide\setHeight(25)
btCancel = btLayout\addChild(PW::newButton("Cancel"))
btCancel\setWidth(90)
btCancel\setHeight(25)

PW::Application\setInitiation(@init())
PW::Application\run(mainForm)
Image

Code : Tout sélectionner

; --------------------------------------------------------------
; PURE_WINDOW
; version 1.0
; EXAMPLE 4 
; a fic customer 
; --------------------------------------------------------------
XIncludeFile "include/pw/pw.pbi"
Define flags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget
Global Dim bt.PW::button(12)
Global.PW::GridBox grid
Global mainForm.PW::Window = PW::newWindow(0,0,320,20,"Exemple 4",flags)
grid = mainForm\setLayout(PW::newGridBox(6))
For i = 0 To 11
  bt(i) = grid\addChild(PW::newButton("Button "+Str(i+1)))
  If i = 2
    grid\spanColums(bt(i),3)
  EndIf
  If i = 4
    grid\spanRows(bt(i),2)
  EndIf
Next
PW::Application\run(mainForm)

Re: PureWindow

Publié : mar. 31/mars/2020 9:15
par MLD
Heu
J'ai pas bien compris l'intérêt :oops:
C'est une histoire Belge une fois :mrgreen:

Re: PureWindow

Publié : mar. 31/mars/2020 9:30
par Marc56
MLD a écrit :Heu
J'ai pas bien compris l'intérêt :oops:
Pareil, je vois pas l'intérêt non-plus :(
Cela fait avec un module externe ce que fait nativement la lib Dialog
Surtout appeler 'easier' (plus facile) un truc qui complique les choses ?
D'ailleurs l'exemple "Boîte Gridbox" qui illustre OpenXMLDialog() donne la même résultat que l'exemple 4

Code : Tout sélectionner

  #Dialog = 0
  #Xml = 0
  
  XML$ = "<window id='#PB_Any' name='test' text='Gridbox' minwidth='auto' minheight='auto' flags='#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget'>" +
         "    <gridbox columns='6'>" +
         "          <button text='Bouton 1' />" +
         "          <button text='Bouton 2' />" +
         "          <button text='Bouton 3' colspan='3' />" +
         "          <button text='Bouton 4' />" +
         "          <button text='Bouton 5' rowspan='2' />" +
         "          <button text='Bouton 6' />" +
         "          <button text='Bouton 7' />" +
         "          <button text='Bouton 8' />" +
         "          <button text='Bouton 9' />" +
         "          <button text='Bouton 10' />" +
         "          <button text='Bouton 11' />" +
         "          <button text='Bouton 12' />" +
         "    </gridbox>" +
         "  </window>"
  
  If ParseXML(#Xml, XML$) And XMLStatus(#Xml) = #PB_XML_Success
      
    If CreateDialog(#Dialog) And OpenXMLDialog(#Dialog, #Xml, "test")
      
      Repeat
        Event = WaitWindowEvent()
      Until Event = #PB_Event_CloseWindow 
      
    Else  
      Debug "Erreur de la bibliothèque -Dialog- : " + DialogError(#Dialog)
    EndIf
  Else
    Debug "Erreur XML : " + XMLError(#Xml) + " (Ligne: " + XMLErrorLine(#Xml) + ")"
  EndIf

Code : Tout sélectionner

Compiling Dialog.pb
Loading external libraries...
Starting compilation...
34 lines processed.
Creating and launching executable.
Méthode PB 34 Lignes à compiler 1 fichier

Code : Tout sélectionner

"C:\Program Files\PureBasic\Compilers\pbcompiler.exe" exemple4.pb

******************************************
PureBasic 5.72 (Windows - x64)
******************************************

Compiling exemple4.pb
Loading external libraries...
Starting compilation...
Including source: include/pw/pw.pbi
Including source: ../../lib/pw/_pw.pbi
Including source: ../../lib/pw/__pw.pbi
Including source: classes/_window.pbi
Including source: classes/_child.pbi
Including source: classes/_box.pbi
Including source: classes/_application.pbi
Including source: classes/_vbox.pbi
Including source: classes/_hbox.pbi
Including source: classes/_gadget.pbi
Including source: classes/_button.pbi
Including source: classes/_string.pbi
Including source: classes/_gridbox.pbi
1718 lines processed.
Creating and launching executable.

- Feel the ..PuRe.. Power -
Méthode Module 1718 lignes 14 fichiers

Si c'est pour l'exploit technique et le plaisir alors d'accord :wink: (j'adore aussi réinventer des roues) mais pour la productivité et surtout la pérennité des développements, pas sur ce ce soit intéressant.

Re: PureWindow

Publié : mar. 31/mars/2020 13:15
par falsam
Le module de microdevweb permettrait de créer facilement une interface utilisateur basée sur du code XML.
A module for make dialog easier
Hum et bien après un test avec tes exemples et un exemple que je voulais mettre en oeuvre j'ai envie de crier NON NON et NON!.
En cette période de confinement ça soulage :wink:

microdevweb, Ton include ne me simplifie pas du tout la création d'une interface utilisateur.

:idea: Je t'invite à regarder le sujet sur DialogDesign0R
https://www.purebasic.fr/english/viewto ... 27&t=70386

Arrêter de vouloir nous simplifier la vie si vous ne savez pas faire mieux que PureBasic nous propose.

J'allais oublier : Nous sommes sur un site francophone.

Re: PureWindow

Publié : mar. 31/mars/2020 15:31
par microdevweb
Merci pour vos avis. Il est vrai que cela n'apporte vraiment une valeur ajoutée, le projet est donc avorté :mrgreen:

Il faut passer sont temps en cette période , je jongle donc entre C++ et Qt que je maîtrise mal et Pb.

Re: PureWindow

Publié : mar. 31/mars/2020 17:31
par G-Rom
La vache, ça dénigre sec ici... On sent bien l'avis des gens qui ne connaisse que PB ... , bwef...
L'idée en soit est bonne, mais le fait d'apporté de l'OO en PB fait que personne ne bite rien. j'ai bien compris que tu t'inspirait de QT et que tu voulais amener les layout ici.
Raté, perd pas ton temps.

edit: La lib dialog est basé sur du XML... là c'est pas le cas.

Re: PureWindow

Publié : mar. 31/mars/2020 18:59
par Shadow
G-Rom a écrit :La vache, ça dénigre sec ici... On sent bien l'avis des gens qui ne connaisse que PB ... , bwef...
L'idée en soit est bonne, mais le fait d'apporté de l'OO en PB fait que personne ne bite rien. j'ai bien compris que tu t'inspirait de QT et que tu voulais amener les layout ici.
Raté, perd pas ton temps.

edit: La lib dialog est basé sur du XML... là c'est pas le cas.
Je suis bien d'accord avec toi, ça dénigre sec ici, comme pour moi d'ailleurs, mais je ne suis pas dans la même court que microdevweb donc bon au pire j'ai l'habitude moi...
Tous se que je fais c'est nul et ça intéresse jamais personne !
Ya qu'a voir mon dernier grand projet VB to PB, ça n’intéresse personne.
Bref, je comprend que certain ne partage rien ici, de toute façon c'est jamais assez bien !
Je sens que jvé me faire tapé dessus moi, je sais pas pourquoi, comme ça :mrgreen:

Ya rien de constructif a tous dénigré, moi je dis ça je dis rien ! :roll:

Re: PureWindow

Publié : mar. 31/mars/2020 19:25
par G-Rom
Shadow a écrit :
G-Rom a écrit :La vache, ça dénigre sec ici... On sent bien l'avis des gens qui ne connaisse que PB ... , bwef...
L'idée en soit est bonne, mais le fait d'apporté de l'OO en PB fait que personne ne bite rien. j'ai bien compris que tu t'inspirait de QT et que tu voulais amener les layout ici.
Raté, perd pas ton temps.

edit: La lib dialog est basé sur du XML... là c'est pas le cas.
Je suis bien d'accord avec toi, ça dénigre sec ici, comme pour moi d'ailleurs, mais je ne suis pas dans la même court que microdevweb donc bon au pire j'ai l'habitude moi...
Tous se que je fais c'est nul et ça intéresse jamais personne !
Ya qu'a voir mon dernier grand projet VB to PB, ça n’intéresse personne.
Bref, je comprend que certain ne partage rien ici, de toute façon c'est jamais assez bien !
Je sens que jvé me faire tapé dessus moi, je sais pas pourquoi, comme ça :mrgreen:

Ya rien de constructif a tous dénigré, moi je dis ça je dis rien ! :roll:
Toi, c'est pas pareil , Micro sait coder, son niveau est beaucoup plus haut que la plupart sur le forum. Toi, tu brûles les étapes. je pense sincèrement que tu est victime de l'effet dunning-krugger. Ni voit aucune attaque, juste un constat. j'en veut pour preuve que tu attaques la sérialisation avec des json alors que tu ne maîtrise pas du tout la base de l'enregistrement de donnée.

Re: PureWindow

Publié : mar. 31/mars/2020 19:54
par Kwai chang caine
MicroDevWeb a écrit :Il faut passer sont temps en cette période
Putain !!! GRom a raison, n'y voit aucune agression, juste de la tristesse :cry:
Quand je vois ta puissance de feu et que depuis des années j'ai la chance de te lire, tu tires dans tous les sens....avec des codes de oufs, des trucs supers beaux et que tu arrêtes avant même d'avoir vraiment commencer.
Si j'avais ton talent, je jouerais pas l'abeille à butiner de fleurs en fleurs :mrgreen:
Mais bon, si c'est ce que tu aimes faire, tu as raison de t'éclater
Ca fait juste de la peine de voir autant de supers codes finir au fond d'un tiroir et ne jamais être assemblés tel les pièces d'un puzzle

Encore une fois sans méchanceté, des fois tu me fait penser à Miche! à moitié :wink: :lol:
https://www.dailymotion.com/video/xnjgy7

Re: PureWindow

Publié : mar. 31/mars/2020 20:05
par Ollivier
26 hrs que j'ai pas respiré l'atmosphère extérieure. Les parfums de femme me manquent bien sûr, mais bon... Je ne vais pas me soulager sur un belge aux bonnes intentions...

Faites un remake du Monopoly les amis (le "Confinopoly") !

Re: PureWindow

Publié : mar. 31/mars/2020 20:08
par G-Rom
Kwai chang caine a écrit :
MicroDevWeb a écrit :Il faut passer sont temps en cette période
Si j'avais ton talent, je jouerais pas l'abeille à butiner de fleurs en fleurs :mrgreen:
Mais bon, si c'est ce que tu aimes faire, tu as raison de t'éclater
Ca fait juste de la peine de voir autant de supers codes finir au fond d'un tiroir et ne jamais être assemblés tel les pièces d'un puzzle
https://www.dailymotion.com/video/xnjgy7
Excellent Michel a moitié :D , Pour en revenir à ce que tu dit , au contraire , il a raison d'aller butiné à droite & à gauche , ça fait travailler le ciboulot & le fait de ne pas finir les trucs , j'en sais aussi qq chose, j'ai des milliers de code ou je teste des trucs , chaine de markov, réseau neuronaux , VR en PB , moteur 3D, moteur 2D , gestionnaire de ressource , etc... le soucis, c'est le temps, même si tu diffuses des codes, il faut les expliqué , faire du propre , et comme moi, il ne doit pas forcement avoir le temps tout le temps, bon , sauf maintenant :D
Ollivier a écrit :26 hrs que j'ai pas respiré l'atmosphère extérieure. Les parfums de femme me manquent bien sûr, mais bon... Je ne vais pas me soulager sur un belge aux bonnes intentions...

Faites un remake du Monopoly les amis (le "Confinopoly") !
Arrête la beu & va te laver , tu verras , je suis sur que tu pourrais être entre les cuisses d'une femme au lieu de les renifler... :mrgreen:

Re: PureWindow

Publié : mar. 31/mars/2020 20:13
par Ollivier
G-Rom a écrit :Arrête la beu & va te laver , tu verras , je suis sur que tu pourrais être entre les cuisses d'une femme au lieu de les renifler..
Eh arrête d'en sortir des trop violentes comme ça : t'es pas au bout de tes surprises !!
Excellente celle-là : affaire à suivre !!

MdR, par contre les gars DailyMotion. Marche pas... Faites pas les bâtards...

Re: PureWindow

Publié : mar. 31/mars/2020 21:02
par Ollivier
Râh les crapules... J'arrive pas à voir le clip. Je ne peux pas continuer le sujet pas manque de données. Il y a vice de forme sinon...

Re: PureWindow

Publié : mer. 01/avr./2020 3:36
par Shadow
G-Rom a écrit :
Shadow a écrit :
G-Rom a écrit :La vache, ça dénigre sec ici... On sent bien l'avis des gens qui ne connaisse que PB ... , bwef...
L'idée en soit est bonne, mais le fait d'apporté de l'OO en PB fait que personne ne bite rien. j'ai bien compris que tu t'inspirait de QT et que tu voulais amener les layout ici.
Raté, perd pas ton temps.

edit: La lib dialog est basé sur du XML... là c'est pas le cas.
Je suis bien d'accord avec toi, ça dénigre sec ici, comme pour moi d'ailleurs, mais je ne suis pas dans la même court que microdevweb donc bon au pire j'ai l'habitude moi...
Tous se que je fais c'est nul et ça intéresse jamais personne !
Ya qu'a voir mon dernier grand projet VB to PB, ça n’intéresse personne.
Bref, je comprend que certain ne partage rien ici, de toute façon c'est jamais assez bien !
Je sens que jvé me faire tapé dessus moi, je sais pas pourquoi, comme ça :mrgreen:

Ya rien de constructif a tous dénigré, moi je dis ça je dis rien ! :roll:
Toi, c'est pas pareil , Micro sait coder, son niveau est beaucoup plus haut que la plupart sur le forum. Toi, tu brûles les étapes. je pense sincèrement que tu est victime de l'effet dunning-krugger. Ni voit aucune attaque, juste un constat. j'en veut pour preuve que tu attaques la sérialisation avec des json alors que tu ne maîtrise pas du tout la base de l'enregistrement de donnée.
C'est bien se que je dis, je suis pas de taille face a Micro, mais bon ont fais avec ce qu'on as lol.
Tu vois le Json, c'est bon c'est dans la poche, je sais comment ça marche, enfin en grande partie !
Alors le XML, bha c'est dans la même tranche, et après, les dialogue que je connais pas mais qui pourrais m'aider pour un future projet !
J'aimerais bien faire un logiciel ou tu fais t'es propre module et tu ajoute toi même des possibilité au programme, ya juste le squelette a faire et après sa roule....
Bha j'ai ça en tête ont verra ça !

Re: PureWindow

Publié : mer. 01/avr./2020 9:00
par microdevweb
Mon intention était simplement la suivante, dans Pb contrairement à d'autre GUI tel que QT, Wxwidget ou JAvaFx (pour java) il manque un système de layout qui n'est disponible qu'avec les dialogues qui utilise une fichier XML.

Ceci était donc un essai qui semblerait non concluant au yeux de beaucoup, je ne vais donc pas en faire une pentatome.

Celui qui veux reprendre le projet peut si il le veux (il est open source). Je sais que l'on va me critiquer car le projet est orienté objet, juste pour info même en C mon prof de temps réel m'impose de développé style objet :mrgreen:

Marche à suivre pour

ajouter un gadget

On crée une nouvelle classes dans le répertoire PW\lib\pw\classes
Exemple text.pbi

On inclus le fichier (class) dans le fichier
PW\lib\pw\__pw.pbi

Code : Tout sélectionner

XIncludeFile "classes/_txt.pbi"
Code de la nouvelle class

Code : Tout sélectionner

;{-------------------------------------------
; AUTHOR    : microdev
; DATE      : 2020-03-30
; CLASS     : _text
; VERSION   : 
; PROCESS   : 
;}-------------------------------------------

Module _TEXT
  Procedure.s _makeFlags(*this._members) 
    With *this
      Protected flags.s
      If \flags & #PB_Text_Center = #PB_Text_Center
        flags + "#PB_Text_Center"
      EndIf
      If \flags & #PB_Text_Right = #PB_Text_Right
        If Len(flags):flags+"|":EndIf
        flags + "#PB_Text_Right"
      EndIf
      If \flags & #PB_Text_Border = #PB_Text_Border
        If Len(flags):flags+"|":EndIf
        flags + "#PB_Text_Border"
      EndIf
      If Len(flags)
        ProcedureReturn "flags='"+flags+"' "
      EndIf
      ProcedureReturn ""
    EndWith
  EndProcedure
  ;{ ABSTRACT METHODS
  Procedure.s _build(*this._members)
    With *this
      Protected xml.s 
      If Len(\label):xml + "<frame text='"+\label+"'>":EndIf 
      xml + "<text name = '"+Str(*this)+"'"
      xml + _GADGET::_setSize(*this)
      xml + " text='"+\value+"' "
      xml + _makeFlags(*this)
      xml + \order
      xml +"/>"
      If Len(\label):xml + "</frame>":EndIf
      ProcedureReturn xml
    EndWith
  EndProcedure
	;{-------------------------------------------
	; CONSTRUCTOR   : new
	; PARAMETER     : 
	;}-------------------------------------------
	Procedure new(value.s = "",flags = 0)
		Protected *this._members = AllocateStructure(_members)
		With *this
		  _GADGET::super()
		  \value = value
		  \flags = flags
		  \_build = @_build() ; address of abstract method for call it
			ProcedureReturn *this
		EndWith
	EndProcedure

	DataSection
		S_MET:

		E_MET:
	EndDataSection
EndModule
On ajoute le code suivant dans le fichier
PW\lib\pw\__pw.pbi

Code : Tout sélectionner

DeclareModule _TEXT 
   Structure _members Extends _GADGET::_members
       value.s
   EndStructure
   Declare new(value.s = "",flags = 0)
EndDeclareModule
Pour finir on ajoute l'accès aux méthodes public dans le fichier
PW\include\pw\pw.pbi

Code : Tout sélectionner

; Public class : textGadget
; inherit of   : _gadget 
Interface textGadget Extends _gadget
	  
EndInterface
Si vous voulez ajouter des méthodes public, voici la marche à suivre

Corps de la méthode à ajouter dans votre fichier class

Code : Tout sélectionner

Procedure myMethod(*this._members,yourParameters)
   With *this
	    
   EndWith
EndProcedure
Ajouter l'adresse dans data section entre S_MET: et E_MET:

Code : Tout sélectionner

Data.i @myMethod()
Enfin ajouter dans l'interface du fichier PW\include\pw\pw.pbi

Code : Tout sélectionner

Interface textGadget Extends _gadget
	myMethod(myParameters)  
EndInterface
dans le Module PW qui est dans le fichier PW\lib\pw\__pw.pbi
on ajoute

Code : Tout sélectionner

Procedure newTextGadget(value.s = "",flags = 0)
    ProcedureReturn _TEXT::new(value,flags)
EndProcedure
Et on ajoute dans le DeclareModule PW (dans le fichier PW\include\pw\pw.pbi)
on ajoute

Code : Tout sélectionner

Declare newTextGadget(value.s = "",flags = 0)
Cela évidement peut vous sembler compliquer, mais tout est encapsuler pour que l'utilisateur final n'aie qu'un seul include à faire et n'aie accès que au stricte nécessaire.

C'est le même principe pour ajouter un layout, la est la force de l'objet une fois la structure posée c'est beaucoup de copier coller (plus de code souvent que du simple procédural)
Si vous voulez que j'ajoute un exemple de layout vous le demander, ici je justifie seulement mon choix de style de code et ne vous impose pas de l'aimer :mrgreen: