Gadget Zone Répétée Style Windev

Programmation d'applications complexes
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Gadget Zone Répétée Style Windev

Message par microdevweb »

Bonjour je développe également en windev, il existe un champ (zone répétée) qui permet d'afficher contrairement à un table plein de choses différentes (des images, des textes, des zones de saisie, des liens etc...) Je viens de commencer le développement de ce type de gadget pour PB

Voila ce que cela donne actuelement

Image

Voici le code du fichier a inclure

Code : Tout sélectionner

DeclareModule ZoneRepette
      Enumeration 
            #TextGadgetType
            #StringGadgetType
            #StringValueType
            #IntegerValueType
      EndEnumeration
      Declare CreateZoneRepetee(myID.i,myPosX.i,myPosY.i,myWhith.i,myHeight.i,myLigneHeight.i)
      Declare AddGadget(ID_Zone,myID,myType.i,myValueType.i,myPosX.i,myPosY.i,myWhith.i,myHeight)
      Declare Affiche(ID_Zone)
      Declare AjouteLigne(ID_Zone, Array Valeur(1))
      Declare SetFontGadget(ID_Zone,ID_Gadget,ID_Font)
      Declare teste()
EndDeclareModule

Module ZoneRepette
      Nbr_ZoneRepette.i
      Structure Gadget
            myID.i
            ID_MEM.i
            PosX.i
            PosY.i
            Whith.i
            Heiht.i
            myValueType.i
            TypeGadet.i
            IdFont.i
      EndStructure
      Structure Ligne
            ID_Canvas.i
            ID_Gadget.i
            NumLigne.i
            Value$
      EndStructure
      Structure zone_Repetee_Data
            ID_Zone.i
            ID_Canvas.i
            PosX.i
            PosY.i
            Whith.i
            Heiht.i
            LigneHeight.i
            NbrGadget.i
            NbrLigne.i
            NbrItem.i
            Array  myGadget.Gadget(0)
            Array myLigne.Ligne(0)
      EndStructure
      
      Global Dim myZoneRepette.zone_Repetee_Data(0)
      
      Procedure CreateZoneRepetee(myID.i,myPosX.i,myPosY.i,myWhith.i,myHeight.i,myLigneHeight.i)
            If myLigneHeight<=0
                  MessageRequester("Erreur CreateZoneRepetee","Veuillez renseigner une hauteur de ligne positive...")
                  ProcedureReturn #False
            EndIf
            ;Teste si une fenêtre est ouverte et si les dimension ne dépasse pas la fenêtre
            ID_Windows=GetActiveWindow()
            If ID_Windows=-1
                  MessageRequester("Erreur CreateZoneRepetee","Vous devez préalablement ouvrir une fenêtre...")
                  ProcedureReturn #False
            EndIf
            If WindowHeight(ID_Windows)<myHeight
                  MessageRequester("Erreur CreateZoneRepetee","La Hauteur de la zone doit être inférieur à la hauteur de fenêtre...")
                  ProcedureReturn #False
            EndIf
            If WindowWidth(ID_Windows)<myWhith
                  MessageRequester("Erreur CreateZoneRepetee","La Largueur de la zone doit être inférieur à la largueur de fenêtre...")
                  ProcedureReturn #False
            EndIf
            ;-Teste si la zone répétée existe déjà
            For N=0 To ArraySize(myZoneRepette())
                  If myZoneRepette(Compteur)\ID_Zone=myID     
                        MessageRequester("Erreur CreateZoneRepetee","La Zone répétée "+myID+" existe déjà...")
                        ProcedureReturn #False
                  EndIf
            Next
            Nbr_ZoneRepette+1 ;Incrémente le nbr de zone répétée
            ;-Initialise la zone répétée
            myZoneRepette(Nbr_ZoneRepette-1)\ID_Zone=myID
            myZoneRepette(Nbr_ZoneRepette-1)\PosX=myPosX
            myZoneRepette(Nbr_ZoneRepette-1)\PosY=myPosY
            myZoneRepette(Nbr_ZoneRepette-1)\Whith=myWhith
            myZoneRepette(Nbr_ZoneRepette-1)\Heiht=myHeight
            myZoneRepette(Nbr_ZoneRepette-1)\LigneHeight=myLigneHeight
            ProcedureReturn #True
      EndProcedure
      
      Procedure AddGadget(ID_Zone,myID,myType.i,myValueType.i,myPosX.i,myPosY.i,myWhith.i,myHeight)
            ;-Pointe sur la zone répétée
            For N=0 To ArraySize(myZoneRepette())
                  If myZoneRepette(N)\ID_Zone=ID_Zone
                        ;-Teste si le gadget ne déborde pas de la ligne
                        If myPosY+myHeight>myZoneRepette(N)\LigneHeight
                              MessageRequester("Erreur AddGadget","Le gadget déborde en hauteur...")
                              ProcedureReturn #False
                        EndIf
                        ;-Ajout du nouveau gadget
                        ReDim myZoneRepette(N)\myGadget(myZoneRepette(N)\NbrGadget)
                        myZoneRepette(N)\myGadget(myZoneRepette(N)\NbrGadget)\Heiht=myHeight
                        myZoneRepette(N)\myGadget(myZoneRepette(N)\NbrGadget)\Whith=myWhith
                        myZoneRepette(N)\myGadget(myZoneRepette(N)\NbrGadget)\PosX=myPosX
                        myZoneRepette(N)\myGadget(myZoneRepette(N)\NbrGadget)\PosY=myPosY
                        myZoneRepette(N)\myGadget(myZoneRepette(N)\NbrGadget)\TypeGadet=myType
                        myZoneRepette(N)\myGadget(myZoneRepette(N)\NbrGadget)\myID=myID
                        myZoneRepette(N)\myGadget(myZoneRepette(N)\NbrGadget)\ID_MEM=myZoneRepette(N)\NbrGadget
                        myZoneRepette(N)\myGadget(myZoneRepette(N)\NbrGadget)\myValueType=myValueType
                        myZoneRepette(N)\NbrGadget+1
                        ProcedureReturn #True
                  EndIf
                  MessageRequester("Erreur AddGadget","La zone répétée "+ID_Zone+" n'existe pas...")
                  ProcedureReturn #False
            Next
      EndProcedure
      
      Procedure Affiche(ID_Zone)
            ;Pointe sur la zone répétée
            For N=0 To ArraySize(myZoneRepette())
                  If myZoneRepette(N)\ID_Zone=ID_Zone
                        X=myZoneRepette(N)\PosX
                        Y=myZoneRepette(N)\PosY
                        W=myZoneRepette(N)\Whith
                        H=myZoneRepette(N)\Heiht
                        ;Parcours de tous les gadget et recherche du gadget le plus à droite (largueur comprise)
                        For T=0 To myZoneRepette(N)\NbrGadget-1
                              WTmp=myZoneRepette(N)\myGadget(T)\PosX+myZoneRepette(N)\myGadget(T)\Whith
                              If WTmp>WGad
                                    WGad=WTmp
                              EndIf
                        Next
                        ;Si il y a un gadget plus à droite que la largueur on prend la dimention du gadget
                        If WGad>myZoneRepette(N)\Whith
                              WI=WGad
                        Else
                              WI=(myZoneRepette(N)\Whith-5)
                        EndIf
                        HI=myZoneRepette(N)\LigneHeight* myZoneRepette(N)\NbrLigne
                        myZoneRepette(N)\ID_Canvas=ScrollAreaGadget(#PB_Any,X,Y,W,H,WI,HI,myZoneRepette(N)\LigneHeight,#PB_ScrollArea_Flat)
                        OpenGadgetList(myZoneRepette(N)\ID_Canvas)
                        ;Pour toutes les lignes
                        For I=1 To myZoneRepette(N)\NbrLigne
                              ;Parcours de toutes les lignes
                              For B=0 To ArraySize(myZoneRepette(N)\myLigne())
                                    If myZoneRepette(N)\myLigne(B)\NumLigne=I
                                          R=myZoneRepette(N)\myLigne(B)\ID_Gadget
                                          X=myZoneRepette(N)\myGadget(R)\PosX
                                          Y=myZoneRepette(N)\myGadget(R)\PosY+
                                            myZoneRepette(N)\LigneHeight*(myZoneRepette(N)\myLigne(B)\NumLigne-1)
                                          W=myZoneRepette(N)\myGadget(R)\Whith
                                          H=myZoneRepette(N)\myGadget(R)\Heiht
                                          Debug(myZoneRepette(N)\myLigne(B)\NumLigne)
                                          Select myZoneRepette(N)\myGadget(R)\TypeGadet
                                                Case #TextGadgetType
                                                      myZoneRepette(N)\myLigne(B)\ID_Canvas=TextGadget(#PB_Any,X,Y,W,H,myZoneRepette(N)\myLigne(B)\Value$)
                                                Case #StringGadgetType
                                                      
                                                Default
                                                      MessageRequester("Erreur Affiche","Le Type de gadget "+Str(myZoneRepette(N)\myGadget(R)\TypeGadet)+" n'est pas gèré...")
                                                      ProcedureReturn #False
                                          EndSelect
                                          SetGadgetFont(myZoneRepette(N)\myLigne(B)\ID_Canvas,FontID(myZoneRepette(N)\myGadget(myZoneRepette(N)\myLigne(B)\ID_Gadget)\IdFont))
                                    EndIf
                              Next
                        Next
                        ProcedureReturn #True
                  EndIf
            Next
            MessageRequester("Erreur Affiche","La zone répétée "+ID_Zone+" n'existe pas...")
            ProcedureReturn #False
      EndProcedure

      Procedure AjouteLigne(ID_Zone, Array Valeur$(1))
            ;-Pointe sur la zone répétée
            For N=0 To ArraySize(myZoneRepette())
                  If myZoneRepette(N)\ID_Zone=ID_Zone
                        ;Teste le nombre de paramètre passé en paramètre
                        If ArraySize(Valeur$())<>(myZoneRepette(N)\NbrGadget-1)
                              MessageRequester("Erreur AjouteLigne","Nombre de valeur passées incorrect")
                              ProcedureReturn #False
                        EndIf
                  EndIf
                  myZoneRepette(N)\NbrLigne+1
                  For R=0 To myZoneRepette(N)\NbrGadget-1
                        ReDim myZoneRepette(N)\myLigne(myZoneRepette(N)\NbrItem)
;                         Debug(ArraySize(myZoneRepette(N)\myLigne()) )
                        myZoneRepette(N)\NbrItem+1
                        myZoneRepette(N)\myLigne(myZoneRepette(N)\NbrItem-1)\NumLigne=myZoneRepette(N)\NbrLigne
                        myZoneRepette(N)\myLigne(myZoneRepette(N)\NbrItem-1)\Value$=Valeur$(R)
                        myZoneRepette(N)\myLigne(myZoneRepette(N)\NbrItem-1)\ID_Gadget=myZoneRepette(N)\myGadget(R)\ID_MEM
                  Next
                  ProcedureReturn  #True
            Next
            MessageRequester("Erreur AjouteLigne","La zone répétée "+ID_Zone+" n'existe pas...")
            ProcedureReturn #True
      EndProcedure
      
      Procedure SetFontGadget(ID_Zone,ID_Gadget,ID_Font)
            For I=0 To ArraySize(myZoneRepette())
                  If myZoneRepette(I)\ID_Zone=ID_Zone
                        For N=0 To ArraySize(myZoneRepette(I)\myGadget())
                              If myZoneRepette(I)\myGadget(N)\myID=ID_Gadget
                                    myZoneRepette(I)\myGadget(N)\IdFont=ID_Font
                              EndIf
                        Next
                  EndIf
            Next
      EndProcedure
      
      Procedure teste()
            For N=0 To ArraySize(myZoneRepette())
                  For I=0 To ArraySize(myZoneRepette(N)\myLigne())
                        Debug (myZoneRepette(N)\myLigne(I)\Value$)
                  Next
            Next
      EndProcedure
      
EndModule

Et un code de teste pour l'utilisation

Code : Tout sélectionner

XIncludeFile "ZoneRepetee.pbi"
LoadFont(0,"Arial",14)
LoadFont(1,"Arial",10)
OpenWindow(0,0,0,800,400,"Teste",#PB_Window_Maximize|#PB_Window_SystemMenu)
ZoneRepette::CreateZoneRepetee(1,0,0,600,200,40)
ZoneRepette::AddGadget(1,0,ZoneRepette::#TextGadgetType,ZoneRepette::#StringValueType,
                       10,10,100,30)
ZoneRepette::SetFontGadget(1,0,1)
ZoneRepette::AddGadget(1,1,ZoneRepette::#TextGadgetType,ZoneRepette::#StringValueType,
                       110,10,100,30)
ZoneRepette::SetFontGadget(1,1,0)
ZoneRepette::AddGadget(1,2,ZoneRepette::#TextGadgetType,ZoneRepette::#StringValueType,
                       210,10,100,30)
ZoneRepette::SetFontGadget(1,2,0)
ZoneRepette::AddGadget(1,3,ZoneRepette::#TextGadgetType,ZoneRepette::#StringValueType,
                       310,10,100,30)
ZoneRepette::SetFontGadget(1,3,0)
ZoneRepette::AddGadget(1,4,ZoneRepette::#TextGadgetType,ZoneRepette::#StringValueType,
                       410,10,100,30)
ZoneRepette::SetFontGadget(1,4,0)
ZoneRepette::AddGadget(1,5,ZoneRepette::#TextGadgetType,ZoneRepette::#StringValueType,
                       510,10,100,30)
ZoneRepette::SetFontGadget(1,5,1)
Dim Valeur$(5)
Valeur$(0)="Teste A0"
Valeur$(1)="Teste A1"
Valeur$(2)="Teste A2"
Valeur$(3)="Teste A3"
Valeur$(4)="Teste A4"
Valeur$(5)="Teste A5"
ZoneRepette::AjouteLigne(1,Valeur$())
Valeur$(0)="Teste B0"
Valeur$(1)="Teste B1"
Valeur$(2)="Teste B2"
Valeur$(3)="Teste B3"
Valeur$(4)="Teste B4"
Valeur$(5)="Teste B5"
ZoneRepette::AjouteLigne(1,Valeur$())
ZoneRepette::Affiche(1)
; ZoneRepette::teste()
Repeat
      Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

Évidement je vais ajouter l'ajout d'autres Gadgets, le retour de variable suivant la ligne sélectionnée, des couleurs différentes pour les lignes paires et impaires ect

Tout les avis m'intéressent, bon comme mauvais
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Gadget Zone Répétée Style Windev

Message par majikeyric »

J'ai laissé tomber Windev pour PB... :mrgreen:
Mais il est vrai qu'il y a plein de bonnes idées dans Windev! (j'en ai reprises quelques unes pour PB) (mais j'y ai trouvé plein de bugs, un vitesse d'exécution plus lente (c'est pas du code natif) et une politique commerciale affligeante...)
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Gadget Zone Répétée Style Windev

Message par microdevweb »

Bha ca c'est une question de choix, je choisi windev pour des programme Bureautique car c'est rapide et fiable, de plus avec un seul langage je développe pour Windows, smartphone et web.

Bon le prix par contre c'est pas donné....

Je trouve par contre que PB est vraiment très puisant il fait des petit exe pas gourmand et puissant, voila pourquoi je m'intéresse à faire cette fameuse zone répétée qui est vraiment géniale en WD et le serait aussi en PB
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Gadget Zone Répétée Style Windev

Message par falsam »

microdevweb a écrit :Bon le prix par contre c'est pas donné....
Ayant utilisé Windev je confirme que le prix n'est pas donné (1600 HT si je me souviens bien) Mais ayant le projet qui allait plus que largement me le rentabiliser, je ne regrette rien. Le gros plus de windev ..... c'est qu'il ne manque rien à part un vrai compilateur :)

Pure Basic n'est pas assez axé application de gestion. Bien qu'il soit possible de développer des applications base de données Sqlite, PostgreSQL et même MySql, il manque un descripteur de fichiers de données (Photo) et il manque aussi un bon générateur d'état acceptant des requétes sql en entrée. J'ai fait l'acquisition de Pyrex (Ecrit en Pure Basic) pour combler cette lacune.

Suis je Hors Sujet ? je crois que oui :)

Allez je vais tester ton code microdevweb.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Gadget Zone Répétée Style Windev

Message par falsam »

Le test fut rapide. le principe est une bonne idée mais on est encore loin de la définition du fameux champ répété.

Envisages tu de faire un conteneur pouvant contenir texte et image pour chacune des zones ?
Est ce que ce champ sera cliquable ?

J'avais fait quelques choses en me servant d'un listicongadget

Code : Tout sélectionner

EnableExplicit

Enumeration
  #FontApp
  #FontTitle
  #Mainform
  #ProducLlist
  
  #Image
EndEnumeration

Define.l Event, GEvent, TEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered

Global ListImages.l

Procedure AddGadgetItemImage(Gadget.l, Row.l, Col.i, Text$, ImageIndex.l)
  Protected var.LVITEM

  var\Mask = #LVIF_IMAGE | #LVIF_TEXT
  var\iItem = Row         
  var\iSubItem = Col      
  var\pszText = @Text$    
  var\iImage = ImageIndex 

  If Col<>0
    SendMessage_(GadgetID(gadget), #LVM_SETITEM, 0, @var)
  Else
    SendMessage_(GadgetID(gadget), #LVM_INSERTITEM, 0, @var)
  EndIf
  
EndProcedure

Procedure Open_MainForm()
  Protected IndexImage.l, N.i, Produit.s, PuTtc.s, MemPuTtc.d, Stock.s
  
  OpenWindow(#Mainform, 0, 0, 500, 450, "Catalogue", WindowStyle)
  ListIconGadget(#ProducLlist, 20, 30, 460, 350,"Info produits", 439, #PB_ListIcon_GridLines)
  
  
  
  ;Association d'une liste d'images à la ListIconGadget
  ;On crée la liste d'image avec l'API ImageList_Create
  ListImages = ImageList_Create_(460, 100 ,#ILC_MASK|#ILC_COLOR32, 0, 30)
    
  ;On assigne la liste d'image à la ListIconGadget
  SendMessage_(GadgetID(#ProducLlist), #LVM_SETIMAGELIST, #LVSIL_SMALL, ListImages) 
  
  ;Sélection de la liste produits (En l'absence de la base de données, la liste est en datasection)
  Restore Catalogue
  For N=1 To 7
    Read.s Produit
    Read.s PuTtc
    Read.s Stock
    CreateImage(#Image, 460, 100)
    StartDrawing(ImageOutput(#Image))
    ;Fond de l'image
    Box(0, 0, 460, 100, RGB(255, 255, 255))
    
    ;Image produit
    Box(0, 0, 100, 100, RGB(255, 215, 0))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(#FontApp))
    DrawRotatedText(20, 10, "Image "+Produit, -45, RGB(128, 128, 128))
    
    ;Info produit
    DrawingFont(FontID(#FontTitle))
    DrawText(110, 10, Produit, RGB(169, 169, 169))
    DrawingFont(FontID(#FontApp))
    DrawText(110, 45, "P.u. Ttc", RGB(0, 0, 0))
    DrawText(220, 45, PuTtc + " €", RGB(0, 0, 0))
    
    DrawText(110, 70, "En stock", RGB(0, 0, 0))
    If Stock="1"
      DrawText(220, 70, "Oui", RGB(50, 205, 50))
    Else
      DrawText(220, 70, "Non", RGB(255, 0, 0))
    EndIf
    
    StopDrawing()
    
    ;On ajoute cette nouvelle image à la liste d'images à l'aide de l'API ImageList_AddIcon
    IndexImage = ImageList_Add_(ListImages, ImageID(#Image), 0)
    FreeImage(#image)

    AddGadgetItemImage(#ProducLlist, N-1, 0, "", IndexImage)
    
  Next

EndProcedure

Procedure Start()
  LoadFont(#FontApp, "Arial", 10)
  LoadFont(#FontTitle, "Arial", 12, #PB_Font_Bold)
  
  SetGadgetFont(#PB_Default, FontID(#FontApp))     
  Open_MainForm()
EndProcedure

start()

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  TEvent = EventType()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
      EndSelect
        
    Case #PB_Event_CloseWindow
      ImageList_Destroy_(ListImages)
      End
  EndSelect
ForEver

DataSection
  Catalogue:
  Data.s "Produit 1", " 10.00","1"
  Data.s "Produit 2", " 15.19","0"
  Data.s "Produit 3", " 10.55","1"
  Data.s "Produit 4", " 36.50","1"
  Data.s "Produit 5", "120.50","1"
  Data.s "Produit 6", " 11.50","1"
  Data.s "Produit 7", "  0.50","1"
EndDataSection
j'ai déja posté ce code il me semble.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Gadget Zone Répétée Style Windev

Message par microdevweb »

Bonsoir Falsam,

Il est évident que ce n'est qu'une esquisse bien loin du champs répété, je vais essayé de faire du mieux. Et vais m’intéresser à ton Pyrex.

Merci de tes reparques :D

Mais je penses profondément qu'il serais possible en PB de faire un ID semblable à WD (avec énormément de travail bien sur)
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Gadget Zone Répétée Style Windev

Message par falsam »

Je pense aussi que c'est possible.
J'ai oublié de te donner le lien de Pyrex sur le forum Anglais de Pure Basic.
:arrow: http://www.purebasic.fr/english/viewtop ... ilit=pyrex

Le site Officiel : http://www.nxsoftware.com
Screen Shoot : http://www.purecoder.net/ArcticReports/screenshots.htm

Le produit n'est plus maintenu mais tu peux encore l'acquérir pour une somme plus que raisonable.

Le principe d'impression n'est pas compliqué en Pure Basic.

En début de code

Code : Tout sélectionner

XIncludeFile "nxReport_HeaderFile.pbi"
Global report.nxReport_Report
l'équivalent de iImprimeEtat() en windev commence par le chargement de l'etat

Code : Tout sélectionner

 nxReport_LoadReport("iTest.nxr", @report)
puis l'impression

Code : Tout sélectionner

report\PreviewInNewWindow(0, 0, 800, 650, "Liste des contacts"
Ici j'ai ouvert l'état dans une fenêtre de prévisualisation.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre