[OK] Canvas à la volée et traitement.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

[OK] Canvas à la volée et traitement.

Message 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é..
~~~~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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Canvas à la volée et traitement.

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Canvas à la volée et traitement.

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Canvas à la volée et traitement.

Message 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. :oops: 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
~~~~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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [OK] Canvas à la volée et traitement.

Message 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
Répondre