SpinGadget éditable

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

SpinGadget éditable

Message par Micoute »

Bonjour à tous,

pour les besoin d'un programme que j'ai en projet, j'aurais besoin de plusieurs spingadgets éditables et comme ils ne le sont pas en natif, j'ai donc essayé d'en créer, mais comme vous l'avez compris : je suis dépassé et c'est sûrement lié à l'âge, mon but étant de faire une liste de SpinGadget, mais facile à utiliser.

C'est pourquoi je viens solliciter votre aide bienveillante pour résoudre mon problème et je vous en remercie d'avance.

Code : Tout sélectionner

Enumeration Fenetre
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Cnv_Plus
  #Cnv_Moins
  #Cnv_Valeur
  #Tempo
EndEnumeration

Structure Spin
  Id.i
  X.i
  Y.i
  L.i
  H.i
EndStructure  

Global Nombre.l, repetitionPlus.l, repetitionMoins.l, NewList ListeSpin.Spin()

Procedure plus()
  Nombre = Val(GetGadgetText(#Cnv_Valeur))
  Nombre = Nombre + 1
  SetGadgetText(#Cnv_Valeur, Str(Nombre))
EndProcedure

Procedure moins()
  Nombre = Val(GetGadgetText(#Cnv_Valeur))
  Nombre = Nombre - 1
  SetGadgetText(#Cnv_Valeur, Str(Nombre))
EndProcedure

Procedure CreerSpin(Id, x, y, l, h)
  AddElement(ListeSpin())
  With ListeSpin()
    \Id = Id
    \X = x
    \Y = y
    \L = l
    \H = h
    
  CanvasGadget(#Cnv_Plus+\Id, \x+\l, \y, 15, \h/2, #PB_Canvas_Border)
  CanvasGadget(#Cnv_Moins+\Id, \x+l, \y+\h/2, 15, \h/2, #PB_Canvas_Border)
  StringGadget(#Cnv_Valeur+\Id, \x, \y, \l, \h, "", #PB_Text_Right)
  
  StartDrawing(CanvasOutput(#Cnv_Plus+\Id))
  DrawText(2, -1, "+", $0, $ffffff)
  StopDrawing()
  
  StartDrawing(CanvasOutput(#Cnv_Moins+\Id))
  DrawText(3, -1, "-", $0, $ffffff)
  StopDrawing()
  
  EndWith
EndProcedure

If OpenWindow(#Fenetre_principale, 500, 500, 160, 40, "SpinCanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CreerSpin(0, 0, 0, 60, 30)
  CreerSpin(1, 80,0, 60, 30)
  
  For i = #Cnv_Plus To #Cnv_Valeur
    SetGadgetFont(i, FontID(LoadFont(#PB_Any, "Arial Black", 12)))
  Next i
  
  AddWindowTimer(#Fenetre_principale, #Tempo, 500)
  
  Repeat
    event = WaitWindowEvent()
    gadget = EventGadget()
    type = EventType()
    
    Select event
        
      Case #PB_Event_Timer
        Select EventTimer()
          Case #Tempo ; numero du timer
            If repetitionPlus
              plus()
            ElseIf repetitionMoins
              moins()
            EndIf
        EndSelect
        
      Case #PB_Event_Gadget
        Select Gadget
            
          Case #Cnv_Plus ; canvas +
            Select type
              Case #PB_EventType_LeftButtonDown
                repetitionPlus = 1
                plus()
                
              Case #PB_EventType_LeftButtonUp
                repetitionPlus = 0
                
            EndSelect
            
          Case #Cnv_Moins ; canvas -
            Select type
              Case #PB_EventType_LeftButtonDown
                repetitionMoins = 1
                moins()
                
              Case #PB_EventType_LeftButtonUp
                repetitionMoins = 0
                
            EndSelect
        EndSelect
    EndSelect
    
  Until Event = #PB_Event_CloseWindow
EndIf
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 !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SpinGadget éditable

Message par falsam »

j'aurais besoin de plusieurs spingadgets éditables et comme ils ne le sont pas en natif,
Pour du numérique si c'est natif

Code : Tout sélectionner

OpenWindow(0, 0, 0, 140, 70, "SpinGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SpinGadget(0, 20, 20, 100, 25, 0, 1000, #PB_Spin_Numeric)
SetGadgetState (0, 0) 
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Tu peux modifier la valeur dans la limite de 0 à 1000 et faire défiler aussi avec les flèches haut et bas de ton clavier.
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%
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SpinGadget éditable

Message par Micoute »

Enorme merci falsam, ça ne fonctionnait pas parce mes gadgets étaient trop courts.
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 !
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: SpinGadget éditable

Message par microdevweb »

Bonjour Micoute,

Je vais te faire un petit module pour cela. Je posterais le code aujourd’hui ou demain au plus tard
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: SpinGadget éditable

Message par microdevweb »

Bonjour Micoute,

Comme promis voici un module pour des spin, mais ne connaissant pas vraiment la nature des tes besoins il est asse simple à toi de me dire tes réels besoins.

Note: C'est une class, je sais que cela ne plait pas à tous le monde mais moi je trouve cela plus facile.

Exemple de code teste:

Code : Tout sélectionner

Global.Spin::Spin mySpin ; Exemple avec variable
Global Dim array_spin.Spin::Spin(4) ; Exemple avec tableau

Procedure Event_Spin(*spin.Spin::Spin)
  Debug *spin\GetValue()
EndProcedure

; j'active la procédure callback
Spin::SetCallback(@Event_Spin())

OpenWindow(0,0,0,800,600,"Terste",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
mySpin=Spin::New_Spin(1,10,10,60,30)
; Je teste le min et le max
mySpin\SetMinMax(1,5)
; Ajout des spin dans un tableau
x=10
For i=0 To 3
  array_spin(i)=Spin::New_Spin(0,x,60,60,30)
  x+70
Next
; Teste la modification  de valeur
array_spin(3)\SetValue(5)
Repeat
  WaitWindowEvent()
Until Event()=#PB_Event_CloseWindow
Code du module:

Code : Tout sélectionner

DeclareModule Spin
  Declare New_Spin(value,x,y,w,h)
  Declare SetCallback(*procedure_callback)
  Interface Spin
    SetMinMax(min,max)
    SetValue(value)
    GetValue()
    Free()
  EndInterface
EndDeclareModule
Module Spin
  Prototype PRO_CALL(*address)
  Global *callback
  ; Members
  
  Structure sSpin
    *METHODS
    myPos.sPos
    value.l
    Up_button_ID.l
    Down_button_ID.l
    string_ID.l
    container_ID.l
    minmax_Enable.b
    min.l
    max.l
  EndStructure
  ;-* PRIVATE functions
  Procedure myEvent()
    Protected *This.sSpin=GetGadgetData(EventGadget())
    Protected myCallback.PRO_CALL
    With *This
      Select EventGadget()
        Case \Up_button_ID
          If \minmax_Enable
            If \value+1<=\max
              \value+1
            EndIf
          Else
            \value+1
          EndIf
        Case \Down_button_ID
          If \minmax_Enable
            If \value-1>=\min
              \value-1
            EndIf
          Else
            \value-1
          EndIf
      EndSelect
      SetGadgetText(\string_ID,Str(\value))
      If *callback
        myCallback=*callback
        myCallback(*This)
      EndIf
    EndWith
  EndProcedure
  ;}
  ;-* Constructor
  Procedure New_Spin(value,x,y,w,h)
    Protected *object.sSpin=AllocateStructure(sSpin)
    With *object
      ; création du container et des gadgets
      \container_ID=ContainerGadget(#PB_Any,x,y,w,h)
      \string_ID=StringGadget(#PB_Any,0,0,w-16,h,"",#PB_String_ReadOnly)
      \Up_button_ID=ButtonGadget(#PB_Any,w-16,0,16,h/2,"+")
      \Down_button_ID=ButtonGadget(#PB_Any,w-16,h/2,16,h/2,"-")
      CloseGadgetList()
      \value=value
      SetGadgetText(\string_ID,Str(value))
      SetGadgetData(\Up_button_ID,*object)
      SetGadgetData(\Down_button_ID,*object)
      
      BindGadgetEvent(\Up_button_ID,@myEvent())
      BindGadgetEvent(\Down_button_ID,@myEvent())
      \METHODS=?METHODS
      ProcedureReturn *object
    EndWith
  EndProcedure
  ;}
  Procedure SetCallback(*procedure_callback)
    *callback=*procedure_callback
  EndProcedure
  ;{-* PUBLIC methods
  Procedure SetMinMax(*This.sSpin,min,max)
    With *This
      If max<=min
        MessageRequester("Spin ERROR","The maximum have to lower to minimum")
        ProcedureReturn 
      EndIf
      \minmax_Enable=#True
      \max=max
      \min=min
    EndWith
  EndProcedure
  Procedure SetValue(*This.sSpin,value)
    With *This
      \value=value
      SetGadgetText(\string_ID,Str(\value))
    EndWith
  EndProcedure
  Procedure GetValue(*This.sSpin)
    With *This
      ProcedureReturn \value
    EndWith
  EndProcedure
  Procedure Free(*This.sSpin)
    ClearStructure(*This,sSpin)
  EndProcedure
  ;}
  DataSection 
    METHODS:
    Data.i @SetMinMax()
    Data.i @SetValue()
    Data.i @GetValue()
    Data.i @Free()
  EndDataSection
EndModule
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SpinGadget éditable

Message par falsam »

microdevweb a écrit :C'est une class, je sais que cela ne plait pas à tous le monde mais moi je trouve cela plus facile.
Méthode Coué. Pourquoi faire simple quand on peut faire compliquer :mrgreen:
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%
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SpinGadget éditable

Message par Micoute »

Merci beaucoup, j'aime beaucoup, mais la méthode de falsam me convient parfaitement, j'espère que tu n'es pas trop déçu, car ce n'est pas ma démarche.
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 !
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: SpinGadget éditable

Message par microdevweb »

@micoute,

pas de soucis
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: SpinGadget éditable

Message par Kwai chang caine »

@MicroDevWeb
L'avantage que quelqu'un s'intéresse à la programmation objet, et ai la gentillesse de partager ses sources, c'est que l'on se rend mieux compte de la complexité de ce qui se passe derrière 8O
Comme dab, la complexité ne peut jamais être supprimée, mais juste déplacée, et l'on s’aperçoit aisément de quel coté elle se trouve lorsque l'on code aprés en POO avec tant se simplicité (pour ceux qui s'y connaissent bien sûr en POO).
On comprend aussi mieux pourquoi la POO est plus lente, et aussi pourquoi elle n'est vraiment utile que pour les gros projets.
Car au regard du code de FALSAM, on a un peu la sensation de faire des châteaux de sable avec une pelleteuse :wink:

Quoi qu'il en soit, même si l'on est réticent à l'utilisation de la POO, merci du partage de ta connaissance dans ce domaine, c'est toujours très intéressant et enrichissant 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: SpinGadget éditable

Message par case »

@ KCC tu veux dire le code de microdevweb plutot ?

parceque si ca c'est du code ^^
falsam a écrit :Méthode Coué. Pourquoi faire simple quand on peut faire compliquer :mrgreen:
ImageImage
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: SpinGadget éditable

Message par Kwai chang caine »

Moi je parlais de celui là

Code : Tout sélectionner

OpenWindow(0, 0, 0, 140, 70, "SpinGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SpinGadget(0, 20, 20, 100, 25, 0, 1000, #PB_Spin_Numeric)
SetGadgetState (0, 0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Mais bon ...le code de MicroDevWeb est bien plus puissant :wink:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SpinGadget éditable

Message par Micoute »

Je suis bien d'accord avec ça, mais ce n'est pas dit que je ne vais pas l'utiliser et voir quel code sera le plus court.
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 !
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: SpinGadget éditable

Message par microdevweb »

J'ai peut'être mal lu le topic et pensais que Micoute voulait faire un spin gadget personnalisé.

Maintenant puisque mon code semble ne pas plaire, il sera plus simple pour moi de ne plus le partagé.

J'adore Pb, mais aussi le concept object et il est regrettable qu'un langage aussi puissant ne passe ce cap comme pourtant plus de 80% des langages actuels. Maintenant il y aura toujours des personnes qui refuse le progres et préfère taper leurs lettres à l'aide de vieille machines à écrire mécaniques.

J'aimerais un jour voir PB ici
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: SpinGadget éditable

Message par Micoute »

Au contraire, microdevweb, tu as bien fait de le partager, d'ailleurs je l'utilise beaucoup bien que j'aurais aimé qu'il s'incrémente avec le bouton gauche et se décrément avec le bouton droit.
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 !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: SpinGadget éditable

Message par falsam »

microdevweb a écrit :J'ai peut'être mal lu le topic et pensais que Micoute voulait faire un spin gadget personnalisé.
Il voulait passer par un gadget personnalisé car il ne comprenait pas pourquoi le spin natif n'était pas éditable.
microdevweb a écrit :Maintenant puisque mon code semble ne pas plaire, il sera plus simple pour moi de ne plus le partagé.
Mais c'est qu'il boude ^-^ Faut pas :)
microdevweb a écrit :J'adore Pb, mais aussi le concept object et il est regrettable qu'un langage aussi puissant ne passe ce cap comme pourtant plus de 80% des langages actuels.
C'est justement ce qui fait la spécificité de PureBasic :
- Ne pas être comme les autres langages,
- Facile à comprendre,
- Productivité multiplié par 10.
microdevweb a écrit :il y aura toujours des personnes qui refuse le progres
Tu as compris avec ce que je viens de dire que ce n'est pas une question de progrès. Je code aussi avec le langage JavaScript et je vais essayer de te faire comprendre ce que j'entend par facilité de compréhension et productivité.

Création d'une lumière rouge au coordonnées x,y,z = 0, 100, 50
- PureBasic

Code : Tout sélectionner

light = CreateLight(#PB_Any, RGB(255, 0, 0),  0, 100, 50)
- Javascript avec le framework Babylon.js

Code : Tout sélectionner

var light = new BABYLON.HemisphericLight("light1", new BABYLON.Vector3(0, 100, 50), scene); 
light.diffuse = new BABYLON.Color3(1, 0, 0);
Tu vois la subtilité ?
microdevweb a écrit :J'aimerais un jour voir PB ici
J'aime ce cotés underground et ne pas coder avec les outils de tout le monde. Peut être que tu es un peu trop conformiste hein ? ^-^

PS : A ceux qui liront ce commentaire j'ai volontairement oublié de parler de pérennité de PureBasic.
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%
Répondre