Page 1 sur 1
[OK] Canvas à la volée et traitement.
Publié : jeu. 12/oct./2023 21:24
par Ar-S
Salut salut.
Je code un soft qui va fouiller dans un dossier contenant des fichiers. Je veux qu'il crée automatiquement 1 canvas par fichier.
Code : Tout sélectionner
Xico = 0
N = 0
ForEach Fichier()
AddElement(icon())
icon()\Pos = N
icon()\x = Xico
icon()\imageID = image
icon()\Name$ = Fichier()\NameToSee$
Xico+36
N+1
Next
; Je ponds mes canvas sur une barre
element = 0
ForEach icon()
CanvasGadget(element, icon()\x, 0, 32, 32)
StartDrawing(CanvasOutput(element))
Box(0,0,32,32,$0)
DrawImage(icon()\imageID,0,0,32,32)
StopDrawing()
Debug "Canvas " + Str(element) + " créé"
element + 1
Next
Jusqu'ici OK.
Maintenant c'est le traitement de ces canvas qui me pose problème
Je voudrais NE PAS avoir à me taper un :
Case 0
Case 1
Case 2
Case 3
etc etc
Donc pour ma boucle je fais un
Code : Tout sélectionner
NbIco = ListSize(icon())
Repeat
Event = WaitWindowEvent(16)
Select Event
;- == EVENT GADGET ==
Case #PB_Event_Gadget
Select EventGadget()
Case 0 To NbIco -1 ; Les canvas sont bien créé avec les images
; ICI je coince
Si j'utilise GetActiveGadget() il m'envoie dans les choux si je l'utilise en me disant que le gadget n'est pas initialisé..
Re: Canvas à la volée et traitement.
Publié : ven. 13/oct./2023 9:44
par falsam
Petit code de test. Résultat dans la barre de titre de la fenêtre.
Code : Tout sélectionner
EnableExplicit
Enumeration window
#mf
EndEnumeration
Enumeration gadget
EndEnumeration
Structure NewIcon
pos.i
x.i
EndStructure
Global NewList Icon.NewIcon(), Xico, N, Nico, Element, Event, GadgetSelect
;Sommaire
Declare Start()
Declare Exit()
Start()
Procedure Start()
OpenWindow(#mf, 0, 0, 400, 40, "Selection du gadget ?", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
; Quelques icones
For N = 0 To 10
AddElement(Icon())
icon()\pos = N
icon()\x = Xico
Xico+36
Next
; Dessin des icones
ForEach Icon()
CanvasGadget(element, icon()\x, 0, 32, 32)
StartDrawing(CanvasOutput(element))
Box(0,0,32,32,$00D7FF)
StopDrawing()
element + 1
Next
Nico = ListSize(Icon())
; Loop
Repeat
Event = WaitWindowEvent(16)
GadgetSelect = EventGadget()
Select Event
;- == EVENT GADGET ==
Case #PB_Event_Gadget
Select GadgetSelect
Case 0 To Nico-1 ; Les canvas sont bien créé avec les images
; ICI je coince
SetWindowTitle(#mf, "Selection du gadget " + GadgetSelect)
Case #PB_Event_CloseWindow
Exit()
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndProcedure
Procedure Exit()
End
EndProcedure
Re: Canvas à la volée et traitement.
Publié : ven. 13/oct./2023 10:58
par Mesa
Quand le nombre de gadget n'est pas connu à l'avance, il faut utiliserBindGadgetEvent.
Code : Tout sélectionner
;
; ------------------------------------------------------------
;
; PureBasic - FileSystem example file
;
; (c) Fantaisie Software
;
; ------------------------------------------------------------
;
Global NewList liste.s()
Global NewList canvas.i()
Global NewMap canvasmap()
Global x=10
Procedure enter()
Debug "enter canvas n°" + canvasmap(Str(EventGadget()))
EndProcedure
Procedure clic()
Debug "clic canvas n°" + canvasmap(Str(EventGadget()))
EndProcedure
Procedure button()
ClearGadgetItems(2) ; Clear all the items found in the ListView
ClearList(Liste())
ClearList(canvas())
limiteurdecanvas=0
x=10
If ExamineDirectory(0, GetGadgetText(0), "*.*")
While NextDirectoryEntry(0)
FileName$ = DirectoryEntryName(0)
If DirectoryEntryType(0) = #PB_DirectoryEntry_Directory
FileName$ = "[DIR] "+FileName$
EndIf
AddGadgetItem(2, -1, FileName$)
AddElement(liste())
liste()=FileName$
limiteurdecanvas + 1 ; je limite à 5 canvas pour plus de simplicité
If limiteurdecanvas <=5
AddElement(canvas())
canvas()=CanvasGadget(#PB_Any,x,200,32,32)
canvasmap(Str(canvas()))=limiteurdecanvas
x=x+42
StartDrawing(CanvasOutput(canvas()))
Box(0,0,32,32,#Red)
StopDrawing()
Debug canvas()
BindGadgetEvent(canvas(), @enter() , #PB_EventType_MouseEnter )
BindGadgetEvent(canvas(), @clic() , #PB_EventType_LeftClick )
EndIf
Wend
Else
MessageRequester("Error","Can't examine this directory: "+GetGadgetText(0),0)
EndIf
EndProcedure
If OpenWindow(0, 100, 200, 290, 600, "PureBasic - FileSystem Example")
StringGadget (0, 10, 10, 202, 24, GetHomeDirectory())
ButtonGadget (1, 220, 10, 60 , 24, "List")
ListViewGadget(2, 10, 40, 270, 150)
DisableGadget(1, 1)
button()
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget() = 1 ; Read
button()
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
End
Re: Canvas à la volée et traitement.
Publié : ven. 13/oct./2023 15:30
par Ar-S
Merci à tous les deux.
@Falsam => Nico/NbIco = erreur de frappe (j'ai corrigé le post initial merci)
@Mesa. pas mal de mettre une list pour les canvas.
Pourquoi "il faut" utiliser un bindevent ? J'avoue j'ai du mal a les utiliser. Trop l'habitude des ma vieille boucle.
Peut être pour que le rafraichissement se face à la volée en cas d'ajout de cavas après coup ?
- Mon prog liste un dossier et créé les canvas
- Le Drag and drop est cependant activé. Si un user ajoute un fichier, je termine juste le drag n drop par un ListSize( icon() ) qui du coup met à jour les infos dans la boucle.
Le
GadgetSelect = EventGadget() est ce qui me manquait.

Je savais que c'était con.
ça fait plaisir de se remettre à PB mais des bases s'envolent quand on pratique plus trop
Du coup je poursuis avec l'ajoue d'un petit oldGadget histoire de ne pas répéter les détection tant qu'on est sur le même canvas.
Code : Tout sélectionner
Repeat
Event = WaitWindowEvent(16)
GadgetSelect = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 0 To Nico-1 ; Les canvas
If oldGadget <> GadgetSelect
SelectElement( icon(), GadgetSelect)
Debug "Survol de " + icon()\Name$
LaCible$ = icon()\Cible$
oldGadget = GadgetSelect
EndIf
Re: [OK] Canvas à la volée et traitement.
Publié : lun. 16/oct./2023 22:07
par Ollivier
Salut à tous !
Mon conseil, au regard de cette idée lumineuse (en gros, un ListIconGadget hyper souple).
une suggestion de structure :
Code : Tout sélectionner
; légende : ' -> ' = pointe vers
Structure filing
x.d
y.d
w.d
h.d
standBy.d ; durée depuis laquelle l'icône n'a pas été survolé ou manipulé
gadgetType.i ; 1 = canvas // 2 = image
gadgetHandle.i
*drag ; -> procédure appelée en cas d'appui bouton g souris
*drop ; -> procédure appelée en cas de lacher bouton g souris
*rightDrag ; on devine
*rightDrop
*flyOver ; -> procédure appelée en cas de survol souris
*click ; -> procédure appelée en cas de simple clic
*doubleClick ; -> procédure appelée en cas de double clic
*rightClick ; on devine
*rightDoubleClick
*wheel ; devine
^draw ; -> procédure qui dessine l'icône
*parent ; -> structure filing mère
*child ; -> vers tableau descendants
*leftBros ; -> structures frère pour navigation avec flèches clavier
*topBros ;
*rightBros ;
*bottomBros ;
*key[256] ; procédure selon code touche appuyée/maintenue
*keyWait[256] ; procédure vers instant t d'appui touche (pour répétition)
*ctrlKey
*altKey
*home
*end
*delete
*insert
EndStructure
L'imageGadget dévore moins de ressources