Appli "freez" + Editor

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Stéphane
Messages : 29
Inscription : sam. 18/avr./2020 15:17

Appli "freez" + Editor

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Appli "freez" + Editor

Message 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
~~~~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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Appli "freez" + Editor

Message par Ollivier »

Un petit coup d'oeil aussi sur d'autres sites :
Speeder un chargement lourd sur une ListIconGadget()
Stéphane
Messages : 29
Inscription : sam. 18/avr./2020 15:17

Re: Appli "freez" + Editor

Message 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é
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Appli "freez" + Editor

Message 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 





@++
Dernière modification par venom le jeu. 30/avr./2020 6:00, modifié 1 fois.
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Stéphane
Messages : 29
Inscription : sam. 18/avr./2020 15:17

Re: Appli "freez" + Editor

Message 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
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Appli "freez" + Editor

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

Re: Appli "freez" + Editor

Message 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.
Dernière modification par Micoute le jeu. 30/avr./2020 8:35, 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 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Appli "freez" + Editor

Message 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:
Stéphane
Messages : 29
Inscription : sam. 18/avr./2020 15:17

Re: Appli "freez" + Editor

Message par Stéphane »

Merci pour vos réponses, j ai tout ce qu il me faut.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Appli "freez" + Editor

Message 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:
Répondre