Page 1 sur 1

StringGadget sur image

Publié : ven. 10/juin/2022 9:29
par Bmld76
Bonjour,

J'ai crée une grille de saisie avec des cases de saisie de texte en mettent des StringGadget sur une image. Le fonctionnement est correct sous MacOs mais sur windows impossible d'activer la saisie, le curseur de saisie ne s'affiche. Si vous avez une idée, soit pour solutionner mon programme ou pour le traiter de manière différente.

Image

Voici le code simplifié de mon programme

Code : Tout sélectionner


Procedure grille()
  
  imageID = 10
  Taillecase = 30 
  
  If  CreateImage(imageID, 301, 301,32,RGB(255,255,255)) And StartDrawing(ImageOutput(ImageID))
    BackColor(RGB(Random(255), Random(255), Random(255)))
    FrontColor(RGB(Random(255), Random(255), Random(255)))
    For c = 0 To 11
      Line(c*Taillecase, 0,1,300,$0)
    Next
    
    For l = 0 To 11
      Line(0,l*Taillecase+esp,300,1,$000000)
    Next
    ; cases noires
    StopDrawing() 
    ImageGadget(11, 50 , 50 , 301, 301, ImageID(imageID))
  EndIf
EndProcedure

Procedure CaseString()
  id = 100
  For c = 0 To 9
    For l = 0 To 9
      StringGadget(id, 54 +c*30,  54+l*30, 20, 20, "X")
      id +1
    Next
  Next
  
EndProcedure  

If OpenWindow(0, 0, 0, 600, 400, "Grlle", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
  grille()
  CaseString()

  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf


Merci beaucoup.

Re: StringGadget sur image

Publié : ven. 10/juin/2022 9:47
par Marc56
Bonjour,

Tu peux forcer l'affichage du curseur sur un des gadgets avec SetActiveGadget()

Code : Tout sélectionner

...
Procedure CaseString()
  id = 100
  For c = 0 To 9
    For l = 0 To 9
      StringGadget(id, 54 +c*30,  54+l*30, 20, 20, "X")
      id +1
    Next
  Next
  SetActiveGadget(100) ; <-- Rendre actif l'un des gadgets
EndProcedure  
...
:wink:

Re: StringGadget sur image

Publié : ven. 10/juin/2022 13:47
par microdevweb
Bonjour,

Le problème vient du fait qu'une image n'est pas un container, mais en ustilisant un canvas cela devrait fonctionner

Cordialement

Code : Tout sélectionner


Procedure CaseString()
  id = 100
  For c = 0 To 9
    For l = 0 To 9
      StringGadget(id, 4 +c*30,  4+l*30, 20, 20, "X")
      id +1
    Next
  Next
  
EndProcedure  


Procedure grille()
  
  imageID = 10
  Taillecase = 30 
  
  CanvasGadget(imageID,50,50,301,301,#PB_Canvas_Container)
  StartDrawing(CanvasOutput(imageID))
  FillArea(0,0,RGB(255,255,255),RGB(255,255,255))
  BackColor(RGB(Random(255), Random(255), Random(255)))
  FrontColor(RGB(Random(255), Random(255), Random(255)))
  For c = 0 To 11
    Line(c*Taillecase, 0,1,300,$0)
  Next
  
  For l = 0 To 11
    Line(0,l*Taillecase+esp,300,1,$000000)
  Next
  StopDrawing()
EndProcedure


If OpenWindow(0, 0, 0, 600, 400, "Grlle", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
  grille()
  CaseString()
  CloseGadgetList()

  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: StringGadget sur image

Publié : ven. 10/juin/2022 13:50
par Ar-S

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 600, 400, "Grlle", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    grille()
    DisableGadget(11,1) ; <--- Tu disable ton imagegadget, tout simplement
  CaseString()

  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: StringGadget sur image - résolu

Publié : ven. 10/juin/2022 14:01
par Bmld76
j'avais testé Canvas mais pas avec le paramètre 'contener'. La solution avec DisableGadget(11,1) est en plus très simple. Ça fonctionne correctement.

Merci pour ces excellentes réponses si rapidement, je vais pouvoir continuer le portage de mon logiciel sur windows.

Re: StringGadget sur image

Publié : ven. 10/juin/2022 14:46
par microdevweb
Libre à toi de choisir la solution qui te convient le mieux. Juste une petite remarque, en utilisant un canvas comme container, les éléments à placer seront placés depuis le bord du container et non pas le bord de la fenêtre.

Tu peux aussi éventuelement disposer ton image et tes string dans un container

Re: StringGadget sur image

Publié : sam. 11/juin/2022 6:45
par Marc56
Étrange, sur mon Windows, quand j'utilise la solution DisableGadget(11,1) je suis obligé d'appuyer sur TAB pour activer la première case, alors qu'avec ma solution (SetActiveGadget(100)) le curseur est déjà sur la première case (ID 100) dès l'ouverture du programme et on peut écrire sans avoir à pointer la case.
Ce n'est pas ce que tu veux ?

(Amélioration: Je mets maintenant SetActiveGadget() juste avant Repeat pour ne l'activer qu'une seule fois)
C'est la manière standard de conception d'une GUI: Activer un gadget par défaut à l'ouverture d'un programme.

(Testé avec PB 6.00 B10 C Backend, mais aussi 5.73 LTS et 5.46 LTS. Windows x64)

Re: StringGadget sur image

Publié : dim. 12/juin/2022 16:04
par Bmld76
Bonjour,

C'est effectivement ce que je désire, la première case est activée mais je vous ai mis un extrait simplifié de mon programme ( 16000 lignes), la gestion de la saisi est plus complexe. Le portage windows est terminé. Merci.

Cordialement