Page 1 sur 1

Appli "freez" + Editor

Publié : mer. 29/avr./2020 12:40
par Stéphane
Bonjour

J effectue un long traitement et durant ce temps, impossible de déplacer, cliquer ou d effectuer toute autre action sur le form.
Est il possible de l en empêcher ?

Par ailleurs, les affichages de très longues séries de textes provoquent le même problème dans l affichage dans un Editor. Il affiche les premières lignes (il est rempli) et freeze. Aussi, il ne scroll pas automatiquement . Y a t il un moyen de voir l affichage 'normalement" je veux dire par là que quand le gadget est rempli il scroll automatiquement ?

J'ai cherché dans l aide (peut être mal) mais je n ai pas trouvé.
J ai cherché sur internet et ai vu qu il s agissait de messages windows alors j ai cherché dans l aide rien trouvé non plus. Peut etre avec WindowEvent() mais bien qu ayant lu l aide, je n y ai pas trouvé mon bonheur...

Vos conseils sont les bienvenus

Merci

Re: Appli "freez" + Editor

Publié : mer. 29/avr./2020 13:53
par Ar-S
Pense à bien désactiver le debugger si tu veux avoir les vraies conditions de travail de ton programme (et si tu n'as pas besoin du debbug pour la partie lourde).

Code : Tout sélectionner

Disabledebbuger
gros traitement
enabledebugger
Mais pour les opérations lourdes, tu dois utiliser les Threads qui travailleront en parallèle de ta fenêtre principale.
Regarde l'exemple de threaded, c'est très intéressant. Tu as d'autres exemple sur le forum très bien fait.

Tout comme CreateThread avec les mots clés associés : Semaphore, Mutex
Bon là on est plus dans la prog de jojo la bidouille. :)
Fais attention avec les Thread, c'est délicat.
Note : Code est à compiler avec l'option Thread dans les directives de compilation si tu les utilises

Re: Appli "freez" + Editor

Publié : mer. 29/avr./2020 19:20
par Ollivier
Un petit coup d'oeil aussi sur d'autres sites :
Speeder un chargement lourd sur une ListIconGadget()

Re: Appli "freez" + Editor

Publié : mer. 29/avr./2020 23:28
par Stéphane
Merci, je vais m intéresser à ça d autant que je n ai pas l usage du debugger dans cette partie du code et que c est vrai, on peut charger les données au fur et à mesure. J y avais pas pensé... :oops:

Par contre, l un d entre vous pourrait il me dire quelle est la propriété ou directive qui permet de faire que quand le texte s affiche dans un Editor, celui-ci scroll automatiquement une fois rempli. Je pensais que cela était automatique avec Wordwrap mais ce n est pas le cas et je n ai pas trouvé

Re: Appli "freez" + Editor

Publié : mer. 29/avr./2020 23:41
par venom
Salut Stéphane,

Si WordWrap est la bonne solution pour passer a la ligne automatiquement :wink:

un exemple :

Code : Tout sélectionner

  If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
    EditorGadget(8, 8, 8, 306, 133, #PB_Editor_WordWrap)

      AddGadgetItem(8, 0, "PureBasic possède un jeu de commandes étendues (plus de 1 400 commandes internes) auxquelles s'ajoute un accès simplifié à une grande partie de l'API du système d'exploitation. Le programmeur peut appeler les commandes de l'API de Windows, de Linux ou Mac OS directement comme s'il s'agissait des commandes internes à PureBasic, sans avoir à les déclarer au préalable (ainsi que les constantes). Rien de mieux qu'un exemple pratique pour illustrer ceci. Comparons un programme simple en Visual Basic avec son équivalent en PureBasic : comment obtenir le chemin du répertoire Windows. ")
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf 





@++

Re: Appli "freez" + Editor

Publié : mer. 29/avr./2020 23:55
par Stéphane
Merci mais je me suis peut être mal expliqué ou j ai raté un truc.

Si je fais une boucle de 1000 et que j affiche mon texte avec AddGadgetItem(editor,-1,text...) et que mon editor a une hauteur qui permet d afficher seulement 100 lignes, j aurais les 100 premières lignes visibles alors que toutes seront bien affichées mais il faut que j utilise l ascenceur pour descendre jusqu'à la dernière ligne.

Ce que je souhaiterais c est voir de 0 à 99, de 1 à 100, de 2 à 101... le texte défiler verticalement de manière automatique en fait

Re: Appli "freez" + Editor

Publié : jeu. 30/avr./2020 6:17
par Marc56
Stéphane a écrit :Ce que je souhaiterais c est voir de 0 à 99, de 1 à 100, de 2 à 101... le texte défiler verticalement de manière automatique en fait
C'est la fonction de défilement ('scrolling') des gadgets.
Elle n'existe pas nativement, mais tu as quelques solutions via les API

Exemples
https://www.purebasic.fr/english/viewtopic.php?t=18258
http://forums.purebasic.com/english/vie ... 13&t=70635

:wink:

Re: Appli "freez" + Editor

Publié : jeu. 30/avr./2020 7:33
par Micoute
Pourquoi ne fais-tu pas

Code : Tout sélectionner

ResizeGadget(#Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, 30+CountGadgetItems(#Gadget)*23.15
30 et 23.15 sont a déterminer, car ils dépendent de la taille de la police utilisée, #Gadget est le nom de ton gadget.

Re: Appli "freez" + Editor

Publié : jeu. 30/avr./2020 7:56
par Marc56
Ce que je souhaiterais c est voir de 0 à 99, de 1 à 100, de 2 à 101... le texte défiler verticalement de manière automatique en fait
Faire défiler des lignes dans un EditorGadget

Code : Tout sélectionner

; Faire défiler des lignes automatiquement dans un EditorGadget
; Basé sur un code de Srod
; https://www.purebasic.fr/english/viewtopic.php?p=115944#p115944
; Nécessite une version de PB enregistrée (API) 
; Windows only

OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  
EditorGadget(0, 8, 8, 306, 133) 

For a = 0 To 50 
    AddGadgetItem(0, a, "Ligne "+Str(a)) 
Next 

For i = 1 To 5
    SendMessage_(GadgetID(0), #EM_LINESCROLL, 0, 10)
    SetWindowTitle(0, "Ligne: " + Str(i * 10) + " à... ")
    Delay(1000)
Next

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
Autre option: Positionner le curseur dans un EditorGadget
(option: sélectionner des caractères)

Code : Tout sélectionner

; Positionner le curseur dans un EditorGadget
; Basé sur un code de Srod
; https://www.purebasic.fr/english/viewtopic.php?p=115944#p115944
; Nécessite une version de PB enregistrée (API) 
; Windows only

OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  
EditorGadget(0, 8, 8, 306, 133) 

For a = 0 To 500 
    AddGadgetItem(0, a, "Ligne "+Str(a)) 
Next 

; Positionner après le 50 ième caractère
; (avec 2 nombres différents on peut sélectionner des caractères)
SendMessage_(GadgetID(0), #EM_SETSEL, 150, 150)

; Pause 3 secs le temps de voir
Delay(3000)

; Positionner après le dernier caractère
SendMessage_(GadgetID(0), #EM_SETSEL, -1, -1)

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
PS. Un EditorGadget peut être rempli très rapidement en utilisant SetGadgetText() plutôt que AddGadgetItem() quand on n'a pas besoin de voir ce qu'il fait ligne par ligne.

:wink:

Re: Appli "freez" + Editor

Publié : jeu. 30/avr./2020 9:17
par Stéphane
Merci pour vos réponses, j ai tout ce qu il me faut.

Re: Appli "freez" + Editor

Publié : jeu. 30/avr./2020 9:47
par Marc56
Après avoir farfouillé dans l'API, j'ai réalisé ce petit truc qui permet de faire défiler page/page avec les touches PgUp et PgDn (ça existe surement déjà sur le forum)
Le défilement se fait toujours par page même si on change la taille de la fenêtre.

Code : Tout sélectionner

; Faire défiler un EditorGadget page par page
; Basé sur un code de Srod
; https://www.purebasic.fr/english/viewtopic.php?p=115944#p115944
; et sur l'API
; EM_SCROLL message
; https://docs.microsoft.com/en-us/windows/win32/controls/em-scroll
; Nécessite une version de PB enregistrée (API) 
; Windows only

EnableExplicit

Enumeration 
    #Win
    #Edt
    #Pg_Up
    #Pg_Dn
EndEnumeration

OpenWindow(#Win, 0, 0, 322, 150, "Page Up / Page Down", 
           #PB_Window_SystemMenu | 
           #PB_Window_ScreenCentered | 
           #PB_Window_SizeGadget)  
EditorGadget(#Edt, 8, 8, 306, 133) 

; Raccourcis clavier
AddKeyboardShortcut(#Win, #PB_Shortcut_PageUp,   1)
AddKeyboardShortcut(#Win, #PB_Shortcut_PageDown, 2)

; Remplissage pour exemple
Define a.a
For a = 0 To 50 
    AddGadgetItem(#Edt, a, "Ligne "+Str(a)) 
Next 

; Redimensionne l'éditeur selon la taille de la fenêtre
Procedure Resize_Window()
    ResizeGadget(#Edt, 8, 8, WindowWidth(#Win) - 16, WindowHeight(#Win) - 16)
EndProcedure


Repeat 
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow 
            End
            
        Case #PB_Event_SizeWindow
            Resize_Window()
            
        Case #PB_Event_Menu
            Select EventMenu()
                Case 1
                    SendMessage_(GadgetID(#Edt), 
                                 #WM_VSCROLL , #SB_PAGEUP, 0)
                Case 2
                    SendMessage_(GadgetID(#Edt), 
                                 #WM_VSCROLL,  #SB_PAGEDOWN, 0)
            EndSelect
    EndSelect
ForEver

End
Version un peu plus élaborée

Code : Tout sélectionner

; Faire défiler un EditorGadget page par page
; Basé sur un code de Srod
; https://www.purebasic.fr/english/viewtopic.php?p=115944#p115944
; et sur l'API
; EM_SCROLL message
; https://docs.microsoft.com/en-us/windows/win32/controls/em-scroll
; Nécessite une version de PB enregistrée (API) 
; Windows only

EnableExplicit

Enumeration 
    #Win
    #Edt
    #Pg_Up
    #Pg_Dn
    #Btn_First
    #Btn_Up
    #Btn_Dn
    #Btn_Last
    #Stb
EndEnumeration

OpenWindow(#Win, 0, 0, 450, 250, "Page Up / Page Down", 
           #PB_Window_SystemMenu | 
           #PB_Window_ScreenCentered | 
           #PB_Window_SizeGadget)  
EditorGadget(#Edt, 8, 38, WindowWidth(#Win) - 16, WindowHeight(#Win) - 68) 
ButtonGadget(#Btn_First,      8, 8, 100, 25, "Première Ligne")
ButtonGadget(#Btn_Up,       110, 8, 100, 25, "Page Précédente")
ButtonGadget(#Btn_Dn,       212, 8, 100, 25, "Page Suivante")
ButtonGadget(#Btn_Last,     314, 8, 100, 25, "Dernière Ligne")

; Statusbar pour afficher des infos (et montrer le grip)
CreateStatusBar(#Stb, WindowID(#Win))
AddStatusBarField(#PB_Ignore)

; Raccourcis clavier
AddKeyboardShortcut(#Win, #PB_Shortcut_PageUp,   1)
AddKeyboardShortcut(#Win, #PB_Shortcut_PageDown, 2)

; Remplissage pour exemple
Define a.a
For a = 0 To 100 
    AddGadgetItem(#Edt, a, "Ligne "+Str(a)) 
Next 


; Redimensionne l'éditeur selon la taille de la fenêtre
Procedure Resize_Window()
    ResizeGadget(#Edt, #PB_Ignore, #PB_Ignore, WindowWidth(#Win) - 16, WindowHeight(#Win) - 68)
EndProcedure


Procedure Scroll_Page(Direction.c)
    Select Direction
        Case 1
            SendMessage_(GadgetID(#Edt), 
                         #WM_VSCROLL , #SB_PAGEUP, 0)
        Case 2
            SendMessage_(GadgetID(#Edt), 
                         #WM_VSCROLL,  #SB_PAGEDOWN, 0)
        Case 3
            SendMessage_(GadgetID(#Edt), 
                         #EM_SETSEL, 0, 0)        
        Case 4
            SendMessage_(GadgetID(#Edt), 
                         #EM_SETSEL, -1, -1)
    EndSelect
EndProcedure


Repeat 
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow 
            End
            
        Case #PB_Event_SizeWindow
            Resize_Window()
            
        Case #PB_Event_Gadget
            Select EventGadget()
                Case #Btn_Up
                    Scroll_Page(1)
                Case #Btn_Dn
                    Scroll_Page(2)
                Case #Btn_First
                    Scroll_Page(3)               
                Case #Btn_Last
                    Scroll_Page(4)
            EndSelect
            
        Case #PB_Event_Menu ; (raccourcis clavier)
            Select EventMenu()
                Case 1
                    Scroll_Page(1)
                Case 2
                    Scroll_Page(2)
            EndSelect
    EndSelect
ForEver

End
Le défilement se fait page /page même si on ajoute/supprime des lignes
(on peut bloquer en lecture seule avec #PB_Editor_ReadOnly)

:arrow: Du code facile à maintenir (pas d'ID numérique et obligation de déclarer les type de variables (EnableExplicit))

:wink: