Page 1 sur 1

[Résolu] Peut-on faire un DragText() entre 2 StringGadget()

Publié : mer. 05/sept./2018 13:01
par Micoute
Bonjour à tous,

toujours pour l'éducation de mes petit-enfants qui sont déjà rentrés au CE1, depuis un bon moment j'ai donc repris la programmation, mais je voudrais m'instruire aussi pour que mes programmes soient plus diversifiés, et je voudrais me lancer dans le Drag And Drop.


La question est déjà posée dans le titre et j'avoue que j'aimerais que la réponse soit affirmative, c'est pourquoi je fais appel à votre bienveillance pour me guider dans ce chemin que je ne connais pas, je vous fournis mon programme comme modèle à transformer,

je ne vous demande de tout refaire, mais juste qu'il soit fonctionnel pour une seule question et je finirai le travail que vous aurez ébauché, car je n'ai juste besoin d'un peu de lumière pour comprendre le principe.


Je vous remercie par avance.

Code : Tout sélectionner

; 01 Tableau addition

EnableExplicit

Enumeration Fenetres
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Btn_Quitter
EndEnumeration

Enumeration #PB_Compiler_EnumerationValue Step 33
  #Str_
EndEnumeration

Enumeration Polices
  #Police
EndEnumeration

Enumeration sons
  #Bien
  #Verifie
EndEnumeration

Global Evenement, i, Dim  Reponse.s(8)

InitSound()

CatchSound(#bien, ?Bien)
CatchSound(#Verifie, ?Verifie)
SoundVolume(#Bien, 50)
SoundVolume(#Verifie, 50)

LoadFont(#Police, "Impact", 40, #PB_Font_HighQuality)
SetGadgetFont(#PB_Default, FontID(#Police))

Declare Programme_principal()
Declare Lire_Donnees()
Declare Verifier_0()
Declare Verifier_1()
Declare Verifier_2()
Declare Verifier_3()
Declare Verifier_4()
Declare Verifier_5()
Declare Verifier_6()
Declare Verifier_7()
Declare Verifier_8()

Lire_Donnees()
Programme_principal()

Procedure Lire_Donnees()
  Restore Donnees
  i = 0
  While i <= ArraySize(Reponse())
    Read$ Reponse(i)
    i + 1
  Wend  
EndProcedure

Procedure Quitter()
  Select EventType()
    Case #PB_EventType_LeftClick
      CloseWindow(#Fenetre_principale)
      End
  EndSelect
EndProcedure

Procedure Programme_principal()
  If OpenWindow(#Fenetre_principale, 0, 0, 580, 640, "Tableaux addition", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
    StringGadget(#Str_+1, 10, 10, 80, 80, "+", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+2, 100, 10, 80, 80, "2", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+3, 190, 10, 80, 80, "4", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+4, 280, 10, 80, 80, "9", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+5, 10, 100, 80, 80, "1", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+6, 100, 100, 80, 80, "", #PB_Text_Center | #SS_CENTERIMAGE) ; 3
    StringGadget(#Str_+7, 190, 100, 80, 80, "", #PB_Text_Center | #SS_CENTERIMAGE) ; 5
    StringGadget(#Str_+8, 280, 100, 80, 80, "", #PB_Text_Center | #SS_CENTERIMAGE) ; 10
    StringGadget(#Str_+9, 10, 190, 80, 80, "3", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+10, 100, 190, 80, 80, "5", #PB_String_ReadOnly)
    StringGadget(#Str_+11, 190, 190, 80, 80, "7", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+12, 280, 190, 80, 80, "", #PB_Text_Center | #SS_CENTERIMAGE) ; 12
    StringGadget(#Str_+13, 10, 280, 80, 80, "5", #PB_String_ReadOnly)
    StringGadget(#Str_+14, 100, 280, 80, 80, "", #PB_Text_Center | #SS_CENTERIMAGE) ; 7
    StringGadget(#Str_+15, 190, 280, 80, 80, "9", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+16, 280, 280, 80, 80, "", #PB_Text_Center | #SS_CENTERIMAGE) ; 14
    StringGadget(#Str_+17, 10, 370, 80, 80, "7", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+18, 100, 370, 80, 80, "", #PB_Text_Center | #SS_CENTERIMAGE) ; 9
    StringGadget(#Str_+19, 190, 370, 80, 80, "11", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+20, 280, 370, 80, 80, "", #PB_Text_Center | #SS_CENTERIMAGE) ; 16
    StringGadget(#Str_+21, 10, 460, 80, 80, "9", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+22, 100, 460, 80, 80, "11", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+23, 190, 460, 80, 80, "", #PB_Text_Center | #SS_CENTERIMAGE) ; 13
    StringGadget(#Str_+24, 280, 460, 80, 80, "18", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    
    StringGadget(#Str_+25, 400, 10, 80, 80, "3", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+26, 400, 120, 80, 80, "7", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+27, 400, 230, 80, 80, "16", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+28, 400, 340, 80, 80, "10", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+29, 400, 450, 80, 80, "9", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+30, 490, 70, 80, 80, "13", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+31, 490, 180, 80, 80, "14", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+32, 490, 290, 80, 80, "12", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    StringGadget(#Str_+33, 490, 400, 80, 80, "5", #PB_Text_Center | #SS_CENTERIMAGE | #PB_String_ReadOnly)
    ButtonGadget(#Btn_Quitter, 10, 550, 560, 80, "Quitter")
    
    
    SetWindowColor(#Fenetre_principale, $FA5961)
    i = #Str_+1
    While i <= #Str_+33
      SetGadgetColor(i, #PB_Gadget_BackColor, $FCAAAE)
      i + 1
    Wend  
    
    BindGadgetEvent(#str_+6, @Verifier_0())
    BindGadgetEvent(#str_+7, @Verifier_1())
    BindGadgetEvent(#str_+8, @Verifier_2())
    BindGadgetEvent(#str_+12, @Verifier_3())
    BindGadgetEvent(#str_+14, @Verifier_4())
    BindGadgetEvent(#str_+16, @Verifier_5())
    BindGadgetEvent(#str_+18, @Verifier_6())
    BindGadgetEvent(#str_+20, @Verifier_7())
    BindGadgetEvent(#str_+23, @Verifier_8())
    BindGadgetEvent(#Btn_Quitter, @Quitter())
  EndIf
EndProcedure

Repeat
  Evenement = WaitWindowEvent(10)
ForEver

DataSection
  Donnees:
  Data$ "3","5","10","12","7","14","9","16","13"
  Bien:
  IncludeBinary "D:\Programmation\Prg Perso\S\Sons\Divers\Bien.wav"
  Verifie:
  IncludeBinary "D:\Programmation\Prg Perso\S\Sons\Divers\Verifie encore.wav"
EndDataSection

Procedure Verifier_0()
  If EventType() = #PB_EventType_Change
    If GetGadgetText(#str_+6) = Reponse(0)
      SetGadgetColor(#str_+6, #PB_Gadget_BackColor, $A8FDAA)
      PlaySound(#Bien)
    Else
      SetGadgetColor(#str_+6, #PB_Gadget_BackColor, $AAA8FD)
      PlaySound(#Verifie)
    EndIf
  EndIf
EndProcedure

Procedure Verifier_1()
  If EventType() = #PB_EventType_Change
    If GetGadgetText(#str_+7) = Reponse(1)
      SetGadgetColor(#str_+7, #PB_Gadget_BackColor, $A8FDAA)
      PlaySound(#Bien)
    Else
      SetGadgetColor(#str_+7, #PB_Gadget_BackColor, $AAA8FD)
      PlaySound(#Verifie)
    EndIf
  EndIf
EndProcedure

Procedure Verifier_2()
  If EventType() = #PB_EventType_Change
    If GetGadgetText(#str_+8) = Reponse(2)
      SetGadgetColor(#str_+8, #PB_Gadget_BackColor, $A8FDAA)
      PlaySound(#Bien)
    Else
      SetGadgetColor(#str_+8, #PB_Gadget_BackColor, $AAA8FD)
      PlaySound(#Verifie)
    EndIf
  EndIf
EndProcedure

Procedure Verifier_3()
  If EventType() = #PB_EventType_Change
    If GetGadgetText(#str_+12) = Reponse(3)
      SetGadgetColor(#str_+12, #PB_Gadget_BackColor, $A8FDAA)
      PlaySound(#Bien)
    Else
      SetGadgetColor(#str_+12, #PB_Gadget_BackColor, $AAA8FD)
      PlaySound(#Verifie)
    EndIf
  EndIf
EndProcedure

Procedure Verifier_4()
  If EventType() = #PB_EventType_Change
    If GetGadgetText(#str_+14) = Reponse(4)
      SetGadgetColor(#str_+14, #PB_Gadget_BackColor, $A8FDAA)
      PlaySound(#Bien)
    Else
      SetGadgetColor(#str_+14, #PB_Gadget_BackColor, $AAA8FD)
      PlaySound(#Verifie)
    EndIf
  EndIf
EndProcedure

Procedure Verifier_5()
  If EventType() = #PB_EventType_Change
    If GetGadgetText(#str_+16) = Reponse(5)
      SetGadgetColor(#str_+16, #PB_Gadget_BackColor, $A8FDAA)
      PlaySound(#Bien)
    Else
      SetGadgetColor(#str_+16, #PB_Gadget_BackColor, $AAA8FD)
      PlaySound(#Verifie)
    EndIf
  EndIf
EndProcedure

Procedure Verifier_6()
  If EventType() = #PB_EventType_Change
    If GetGadgetText(#str_+18) = Reponse(6)
      SetGadgetColor(#str_+18, #PB_Gadget_BackColor, $A8FDAA)
      PlaySound(#Bien)
    Else
      SetGadgetColor(#str_+18, #PB_Gadget_BackColor, $AAA8FD)
      PlaySound(#Verifie)
    EndIf
  EndIf
EndProcedure

Procedure Verifier_7()
  If EventType() = #PB_EventType_Change
    If GetGadgetText(#str_+20) = Reponse(7)
      SetGadgetColor(#str_+20, #PB_Gadget_BackColor, $A8FDAA)
      PlaySound(#Bien)
    Else
      SetGadgetColor(#str_+20, #PB_Gadget_BackColor, $AAA8FD)
      PlaySound(#Verifie)
    EndIf
  EndIf
EndProcedure

Procedure Verifier_8()
  If EventType() = #PB_EventType_Change
    If GetGadgetText(#str_+23) = Reponse(8)
      SetGadgetColor(#str_+23, #PB_Gadget_BackColor, $A8FDAA)
      PlaySound(#Bien)
    Else
      SetGadgetColor(#str_+23, #PB_Gadget_BackColor, $AAA8FD)
      PlaySound(#Verifie)
    EndIf
  EndIf
EndProcedure

Re: Peut-on faire un DragText() entre 2 StringGadget() ?

Publié : mer. 05/sept./2018 13:38
par Ar-S
Salut Micoute.
Vais voulu y jeter un oeil vite fait car je suis dans mes travaux,
Ton code n'est pas executable, tu files pas les sons, pas les datas... Du coup faut tout commenter etc c'est pénible..
Mais bon, à 1ère vu, toutes tes procédures sont identiques... Une seule remaniée suffirait. ça n'a pas de rapport avecta demande mais c'est un fait. Ensuite ton enumeration step 33... why ?

Coté code. Je crois que c'est une erreur de jouer du string pour ce genre de jeu. Ce serait bien plus simple avec des canvas ou même des images créées à la volée mais ça reste faisable.

Si tu veux utiliser du texte comme ici, il va te falloir utiliser DragPrivate() qui gère le drag n drop dans ton appli en indiquant les gadgets puis DragText() pour gérer le déplacement de texte.
L'exemple de la doc montre un exemple de chaque. Les 2 case de gauche (haut vers bas) te permettent de glisser déposer du texte.

Re: Peut-on faire un DragText() entre 2 StringGadget() ?

Publié : mer. 05/sept./2018 14:25
par Micoute
Bonjour Ars,

Je suis tellement habitué dans ma routine a utiliser toujours les mêmes répertoires que j'en oublie leurs existences, alors veuille bien me pardonner.


Je donc placé tous ces fichiers dans ma dropbox dont voici l'adresse:https://www.dropbox.com/sh/4gr87x3drrn8 ... uxqka?dl=0

le Step 33 est mis pour réserver mes 33 StringGadget() utilisées pour le programme.

Re: Peut-on faire un DragText() entre 2 StringGadget() ?

Publié : jeu. 06/sept./2018 8:17
par Marcel
Salut,
je propose :

Code : Tout sélectionner

Procedure Verifier(testID, reposeID)
  If EventType() = #PB_EventType_Change
    If GetGadgetText(#str_+testID) = Reponse(reposeID)
      SetGadgetColor(#str_+testID, #PB_Gadget_BackColor, $A8FDAA)
      PlaySound(#Bien)
    Else
      SetGadgetColor(#str_+testID, #PB_Gadget_BackColor, $AAA8FD)
      PlaySound(#Verifie)
    EndIf
  EndIf
EndProcedure
...
BindGadgetEvent(#str_+6, @Verifier(6, 0))
...
Marcel

Re: Peut-on faire un DragText() entre 2 StringGadget() ?

Publié : jeu. 06/sept./2018 9:11
par Micoute
Bonjour Marcel,

c'est une très bonne idée pour raccourci le listing qui ne fonctionne pas avec BindGadgetEvent(), mais qui fonctionne très bien dans une boucle évènementielle traditionnelle.


Merci pour l'idée simple et efficace.

Re: Peut-on faire un DragText() entre 2 StringGadget() ?

Publié : ven. 07/sept./2018 9:58
par Marc56
Oui, le @Callback() de BindGadgetEvent ne permet pas de passer de paramètre.

BindGadgetEvent(#Gadget, @Callback() [, TypeEvenement])

Il faut passer par la boucle classique ou ruser avec une variable globale (moche)
Un autre exemple qui montre que la méthode Bind... n'est pas la panacée

Quant à ton problème, la méthode la plus simple a été suggérée par Ar-S : créer des images dynamiques (DrawBox + Drawtext) ensuite il suffit de faire un dnd des images.

Je ne comprends pas trop ce que ton programme est censé faire, donc ne peux t'aider.

Re: Peut-on faire un DragText() entre 2 StringGadget() ?

Publié : ven. 07/sept./2018 11:11
par boby

Re: Peut-on faire un DragText() entre 2 StringGadget() ?

Publié : ven. 07/sept./2018 11:41
par Micoute
Merci beaucoup à tous,

j'ai trouvé cette solution qui fonctionne très bien:
https://www.purebasic.fr/english/viewto ... x&p=444842

pour ceux qui ne comprennent pas le principe : pour que mes petits enfants ne se lassent pas de toujours choisir la réponse dans des combos, j'ai envisagé de leur faire glisser la réponse qui se trouve dans un stringgadget vers un autre, réservé à cet effet et si la réponse est la bonne, on change la couleur du gadget pour indiquer que la réponse est valide on non.

Re: [Résolu] Peut-on faire un DragText() entre 2 StringGadge

Publié : ven. 07/sept./2018 12:37
par Marc56
Horreur, je n'ai même pas le niveau CE1 :o je n'avais pas compris que c'est une grille d'addition :oops:
(et c'était dans le tire de la fenêtre windows "Tableaux addition" 8O :cry: )
Donc tu voudrais qu'on puisse faire un dnd du nombre à droite dans les cases vides ?
La bonne réponse étant quand ce nombre est bien l'addition de de la ligne 1 et la colonne 1
Au clavier, ça marche, mais pour certaines case (9+1) il dit à la fois bien et vérifie encore alors que ça marche pour 3+1

Typiquement le genre de truc à faire en POO :mrgreen: (carré, nombre, couleur, déplacement)
Mais plus simplement générer une image par bloc et en double (pour avoir les deux couleurs)

Exemple pour générer les 99 images avec texte centré:

Code : Tout sélectionner

; Créer 99 images numérotées 1 à 99
;  1 à 33 : Bleu (affichage normal)
; 34 à 66 : Vert (réponse ok)
; 67 à 99 : Rose (réponse fausse)

EnableExplicit

LoadFont(1, "Impact", 40, #PB_Font_HighQuality)

Dim Color(2) : Color(0) = $FCAAAE :  Color(1) = $A8FDAA : Color(2) = $AAA8FD

Define i, j, ID
Debug Color(j)
For j = 0 To 2
    For i = 1 To 33
        ID + 1
        CreateImage(ID, 80, 80, 24, Color(j))
        StartDrawing(ImageOutput(ID))
        DrawingMode(#PB_2DDrawing_Outlined)
        Box(0, 0, 79, 79, #Black)
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawingFont(FontID(1))
        Define Text$ = Str(i)
        DrawText(40 - TextWidth(Text$)  / 2, 
                 40 - TextHeight(Text$) / 2, 
                 Text$, #Black)
        StopDrawing()
    Next i
Next j

; Vérification en RAM
ShowLibraryViewer("image", 1)

OpenWindow(0, 10, 10, 100, 100, "")
While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
Ensuite il suffit de créer des imagegadget à la place des editorgadget
À chaque déplacement d'image changer l'image de destination selon que la réponse est bonne ou pas

:wink:

Re: [Résolu] Peut-on faire un DragText() entre 2 StringGadge

Publié : ven. 07/sept./2018 17:19
par Micoute
Merci Marc56, c'est tellement génial que je n'y avais même pas pensé, on est toujours victime de ses habitudes.