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

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

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

Message 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
Dernière modification par Micoute le ven. 07/sept./2018 11:42, modifié 1 fois.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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.
~~~~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
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marcel
Messages : 24
Inscription : jeu. 18/févr./2010 21:52
Localisation : Darmstadt - Allemagne
Contact :

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

Message 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
Win 10 - PB 5.31 et 5.71
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

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

Message 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.
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

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

Message par boby »

Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

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

Message 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:
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre