L'influence du debugger sur l'affichage

Sujets variés concernant le développement en PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

L'influence du debugger sur l'affichage

Message par Anonyme2 »

J'ai passé tout l'après-midi sur ce que je pensais être un bug dans mon projet.

Dans mon projet j'utilise le code de Nico sur les statusbar en couleur (corrigé pour PB d'aujourd'hui)
http://www.purebasic.fr/french/viewtopic.php?f=6&t=2107

C'est quasi son code mise à part le SetWindowCallback() car j'ai une callback type.
Le code de Nico a toujours bien fonctionné.

Ma statusbar a 2 champs et j'en avais masqué un que j'ai voulu réafficher mais ça ne marchait pas bien.
J'ai tenté plein de choses mais en vain, il n'y avait que le redrawwindow qui marchait et encore pas toujours et en plus ça scintillait.
Un debug sur le champs 1 (2ème champ) de la callback montrait que je n'y passait pas alors que pour le champs 0 (1ere champs) c'était ok.

Je travaille toujours avec le debugger intégré et le purificateur à fond, cela ne ralentit pas beaucoup et ça permet de déceler des erreurs en particulier dans les callback ou à l'initialisation.

Comme on est en mode ownerdrawn, je redessine comme Nico le fait dans son code, mais le 2ème champs n'apparaissait pas et ne changeait pas, il fallait un redrawwindow.

J'ai fini par compiler mes 2 cibles en 32 et 64 bits et j'ai exécuté.

Et la tout est Ok. Je relance avec le debugger et ça ne marche plus.

Tout est dit, un problème avec le debugger.
PB 5.31 x64 et x86 la même chose.

un peu de code extrait de mon projet

Code : Tout sélectionner

Procedure.i PIM_CallBack_StatusBar(Window, Message, wParam, lParam)
      Protected L_OriginProc_StatusBar = GetProp_(Window, "Pure"+Hex(Window))
      Protected *pointeur.Status_Draw_champs0, *pointeur1.Status_Draw_champs1
      Protected lpSize.size
      Protected hFontOld, Local_Font
      Protected lptm.TEXTMETRIC
      Protected texte$
      ;// variable permettant de dessiner les éléments
      Protected *DrawItem.DRAWITEMSTRUCT = lParam
      
      If lParam
            Select Message
                  Case #WM_DRAWITEM
                        If *DrawItem\CtlType = #ODT_BUTTON
                              ;// c'est un bouton, on quitte la callback, les boutons sont traités ailleurs
                        Else
                              If wParam = GetDlgCtrlID_(GLB_hMainStatusBar)
                                    *DrawItem = lParam
                                    *pointeur = *DrawItem\itemdata
                                    
                                    If *DrawItem\itemID = 1
                                          ;// le champ des erreurs
                                          *DrawItem.DRAWITEMSTRUCT = lParam
                                          *pointeur1=*DrawItem\itemdata
                                          
                                          If GetTextMetrics_(*DrawItem\hDC, lptm)
                                                texte$ = Space((33*2)+2)
                                                GetTextFace_(*DrawItem\hDC, 33*2, texte$)
                                                Local_Font = PIM_Create_SystemFont(lptm, 0, #PB_Font_Italic| #PB_Font_Bold, texte$)
                                                ;// pas de test sur la valeur Longueur_Car_Style
                                                If Local_Font
                                                      hFontOld = SelectObject_(*DrawItem\hDC, Local_Font)
                                                EndIf
                                          EndIf
                                          
                                          SetBkMode_(*DrawItem\hDC, #TRANSPARENT)
                                          ;// charge l'icône warning
                                          SetTextColor_(*DrawItem\hDC, *pointeur1\couleur)
                                          *DrawItem\rcItem\left +28+5 : *DrawItem\rcItem\top -2
                                          DrawText_(*DrawItem\hDC, *pointeur1\Texte, -1, *DrawItem\rcItem , #DT_VCENTER| #DT_LEFT| #DT_SINGLELINE)
                                          ;// on détruit la font
                                          If Local_Font
                                                SelectObject_(*DrawItem\hDC, hFontOld)
                                                DeleteObject_(Local_Font)
                                          EndIf
                                    Else
                                          With  *pointeur
                                                SetBkMode_(*DrawItem\hDC, #TRANSPARENT)
                                                SetTextColor_(*DrawItem\hDC, *pointeur\couleur_zone_Style1)
                                                Local_Font = PIM_Create_Font(GLB_StatusBar_Defaut_Font, \Style_zone_Style1)
                                                If Local_Font
                                                      hFontOld = SelectObject_(*DrawItem\hDC, Local_Font)
                                                EndIf
                                                texte$ = PeekS(@*pointeur\Texte, \Longueur_Car_Style1)
                                                ;// le mot fichier en bleu
                                                SetTextColor_(*DrawItem\hDC, \couleur_zone_Style1)
                                                ;// on retrouve la position de la chaine avec la police dce caractère associée au hdc
                                                If GetTextExtentPoint32_(*DrawItem\hDC, texte$, \Longueur_Car_Style1, @lpSize) = 0
                                                      ;// on détruit la font
                                                      ;// on remet la font initiale pour ensuite écrire normalement
                                                      SelectObject_(*DrawItem\hDC, hFontOld)
                                                      If Local_Font
                                                            DeleteObject_(Local_Font)
                                                      EndIf
                                                      ProcedureReturn #True
                                                EndIf
                                                *DrawItem\rcItem\left + 21+12
                                                ;// on dessine le texte en gras correspondant à la longueur voulue
                                                DrawText_(*DrawItem\hDC, texte$, -1, *DrawItem\rcItem , #DT_VCENTER| #DT_LEFT| #DT_SINGLELINE)
                                                ;// le reste du texte dans la couleur passée par la variable
                                                SetTextColor_(*DrawItem\hDC, *pointeur\couleur_zone_Style2)
                                                *DrawItem\rcItem\left = lpSize\cx + 27+12
                                                ;// on retrouve le texte manquant
                                                texte$ = Mid(*pointeur\Texte, \Longueur_Car_Style1 + 1)
                                                ;// on remet la font initiale pour ensuite écrire normalement
                                                If Local_Font
                                                      SelectObject_(*DrawItem\hDC, hFontOld)
                                                      ;// on détruit la font
                                                      DeleteObject_(Local_Font)
                                                EndIf
                                                DrawText_(*DrawItem\hDC, texte$, -1, *DrawItem\rcItem, #DT_VCENTER| #DT_LEFT| #DT_SINGLELINE)
                                                
                                          EndWith
                                    EndIf
                                    ProcedureReturn #True
                              EndIf
                        EndIf
                        
                  Case #WM_NCDESTROY
                        ;// Remettre la procédure d'origine
                        SetWindowLongPtr_(Window, #GWL_WNDPROC, L_OriginProc_StatusBar)
                        ;// Supprimer la donnée associée à la fenêtre.
                        RemoveProp_(Window,"Pure"+Hex(Window))
            EndSelect
      EndIf
      
      ;On renvoie tous les autres évènements à la procédure d'origine.
      ProcedureReturn CallWindowProc_(L_OriginProc_StatusBar,  Window, Message, wParam, lParam)
EndProcedure

;// la fonction pour redessiner les champs

Procedure PIM_SetStatusBarString()
      CompilerIf #Nom_Procedure = #True
            Debug #PB_Compiler_Procedure
      CompilerEndIf
      ;///////////////////////////////////////////////////////////////////////////////////////////////////
      ;//
      ;// FONCTION: PIM_SetStatusBarString()
      ;//
      ;// BUT: Créer la chaine affichée dans la StatusBar
      ;//
      ;// PARAMS: Aucun. utilises les var globales GLB_Champs_0\Texte, GLB_Msg\StatusBar_Champs0[i]  etc.
      ;//
      ;// RETOURNE: rien
      ;//
      ;///////////////////////////////////////////////////////////////////////////////////////////////////
      ;//  Le champs 1, nom de fichier et infos complémentaires si existe
      ;// le Style_zone_Style1 sert à différencier le mot 'Fichier' pour l'afficher en bleu du reste de la chaine
      ;       couleur_zone_Style1.i  ;// la couleur définie pour la zone de caractères de longeur Longueur_Car_Style1
      ;       Font_zone_Style1.i     ;// la fonte définie pour la zone de caractères de longeur Longueur_Car_Style1
      ;       Style_zone_Style1.i   ;//  le style défini pour la zone de caractères de longeur Longueur_Car_Style1
      ;       ;//                        Style_zone_Style1 = -1 on utilise la font \Font_zone_Style1
      ;       ;//                        #PB_Font_Bold           ; La police de caractère sera en gras
      ;       ;//                        #PB_Font_Italic         ; La police de caractère sera en italique
      ;       ;//                        #PB_Font_Underline      ; La police de caractère sera soulignée
      ;       ;//                        #PB_Font_StrikeOut      ; La police de caractère sera barrée
      ;       Longueur_Car_Style1.i      ;// nombre de caractères utilisant le style \Style_zone_Style1
      ;       Format_text_zone_Style1.i  ;// le format du texte à afficher, correspond au paramètre uFormt de DrawText_()
      ;// **********  la zone restante à afficher   ***********************
      ;       couleur_zone_Style2.i  ;// la couleur définie pour la zone de caractères de longeur Longueur_Car_Style2
      ;       Font_zone_Style2.i     ;// la fonte définie pour la zone de caractères de longeur Longueur_Car_Style2
      ;       Style_zone_Style2.i   ;//  le style défini pour la zone de caractères de longeur Longueur_Car_Style2
      ;       ;//                        Style_zone_Style1 = -1 on utilise la font \Font_zone_Style1
      ;       ;//                        #PB_Font_Bold           ; La police de caractère sera en gras
      ;       ;//                        #PB_Font_Italic         ; La police de caractère sera en italique
      ;       ;//                        #PB_Font_Underline      ; La police de caractère sera soulignée
      ;       ;//                        #PB_Font_StrikeOut      ; La police de caractère sera barrée
      ;       Longueur_Car_Style2.i      ;// nombre de caractères utilisant le style \Style_zone_Style2
      ;       Format_text_zone_Style2.i  ;// le format du reste du texte à afficher, correspond au paramètre uFormt de DrawText_()
      ;//  Le champs 2, les erreurs et sous erreurs si existent
      
      
      ;// compteur de boucle
      Protected i
      ;// variable permettant de lire la langue en datasection
      Protected Langue
      
      Restore INIT_LANGID
      ;// on retrouve la chaine correspondant à la langue
      For i = #First_Language To #Last_Language
            Read Langue
            If Langue = GLB_Langue_id
                  GLB_Champs_0\Texte = GLB_Msg\StatusBar_Champs0[i]
                  GLB_Champs_1\Texte = GLB_Msg\StatusBar_Champs1[i]
                  Break
            EndIf
      Next
      ;// la couleur du mot fichier
      GLB_Champs_0\couleur_zone_Style1 = $BA5E12
      GLB_Champs_0\Style_zone_Style1 = #PB_Font_Bold
      ;// nombre de caractères utilisant le 1er style
      GLB_Champs_0\Longueur_Car_Style1 = FindString(GLB_Champs_0\Texte, ":", 1)
      ;// la couleur du reste de la chaine
      GLB_Champs_0\couleur_zone_Style2 = #Black
      GLB_Champs_0\Style_zone_Style2 = #PB_Font_Bold
      
      ;// la couleur du texte 2ème champs
      GLB_Champs_1\couleur = #couleur_message_erreur
      
      ;// si texte vide 1er champs, alors on efface l'icône de ce champs, sinon on ajoute
      If Len(GLB_Champs_0\Texte)
            i = ImageID(#IcoNomFichier)
      Else
            ;// on supprime l'icône
            i = 0
      EndIf
      SendMessage_(GLB_hMainStatusBar, #SB_SETICON, 0, i)
      
      ;// si texte vide 2ème champs, alors on efface l'icône de ce 2ème champs, sinon on ajoute
      If Len(GLB_Champs_1\Texte)
            i = ImageID(#IcoMessageErreur)
      Else
            ;// on supprime l'icône
            i = 0
      EndIf
      SendMessage_(GLB_hMainStatusBar, #SB_SETICON, 1, i)
      
      SendMessage_(GLB_hMainStatusBar, #SB_SETTEXTW, 0 | #SBT_OWNERDRAW, *GLB_pointeur_champs0)
      SendMessage_(GLB_hMainStatusBar, #SB_SETTEXTW, 1 | #SBT_OWNERDRAW, *GLB_pointeur_champs1)
EndProcedure
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: L'influence du debugger sur l'affichage

Message par microdevweb »

@Denis,

J'ai voulu testé ton code, mais la structure est manquante. Par contre il arrive chez moi que cela bloque sur certain code avec le débogueur suite à mon antivirus. Je le désactive et ca passe.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: L'influence du debugger sur l'affichage

Message par Anonyme2 »

microdevweb a écrit :@Denis,

J'ai voulu testé ton code, mais la structure est manquante. Par contre il arrive chez moi que cela bloque sur certain code avec le débogueur suite à mon antivirus. Je le désactive et ca passe.

microdevweb,

j'ai simplement mis le code comme exemple pour montrer qu'il n'y a rien de spécial.
Répondre