IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

[Linux/Windows] Bug de Canvas.Rectangle ou mauvaise utilisation ? [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut [Linux/Windows] Bug de Canvas.Rectangle ou mauvaise utilisation ?
    Bonjour,

    au début j'étudiais .../Lazarus/Version/examples/canvas_test et comme il y a aucune explication et que l'aide est anorexique, j'ai appliqué ma méthode : je réduis à l'essentiel (juste la fiche frmDraw), et je modifie des valeurs, une à la fois, pour voir où et comment ça agit, et j'en tire les conclusions qui vont bien.

    Sauf que là, j'ai bien crû ma dernière heure arrivée, jusqu'à ce que je décide de tout reprendre à zéro pour juste bêtement dessiner un carré avec deux couleurs, et je vous laisse admirer le résultat un superbe trait noir non demandé, entre les deux zones colorées :
    Nom : bug_canvas_rectangle.png
Affichages : 564
Taille : 51,6 Ko

    Moi, je m'attendais vraiment à ce qu'après avoir posé un grand bout rouge, la pose d'un grand bout jaune par-dessus le rouge le recouvre sans espace, mais non...

    L'enregistrement du bmp (bmp.SaveToFile('chemin/fichier');) présentant le même défaut, j'en conclus que la blague doit se cacher dans la fonction Rectangle, sous Linux (1.4 -- oui, je sais) comme sous XP (1.8.2).

    Utiliser ça LCLIntf.Rectangle(FHandle, X1, Y1, X2-1, Y2-1); dans canvas.inc ayant généré un trait noir à droite et un autre en bas, je teste avec LCLIntf.Rectangle(FHandle, X1+1, Y1+1, X2, Y2); mais là ça me met un trait noir à gauche et un autre en haut, mais dans les deux cas le trait entre les deux couleurs est présent.

    La blague doit donc être bien cachée, quelque part dans le code des widgetsets...

    Au fait, vous avez tous remarqué ces -1 dans mes appels à Canvas.Rectangle, c'est pour éliminer les traits noirs à gauche et en haut, qui apparaissent avec le classique Rectangle(0,0,x,y), et le fait de faire LCLIntf.Rectangle(FHandle, X1-1, Y1-1, X2, Y2); permet de revenir à 0,0, mais je vais conserver -1 dans l'IHM, je n'aime pas trifouiller dans les sources, car après, quand on travaille avec des codes venus d'ailleurs, si ça foire on ne sait plus pourquoi.


    Dernière minute : j'arrive à m'affranchir de ce trait noir en passant par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Bmp.Canvas.Pen.Color := clRed; // il semblerait que l'utilisation de .Pen à la place de .Brush
      // impacte le rendu de .Rectangle qui n'a plus besoin des -1
      Bmp.Canvas.Rectangle(0, 0, 149, 149); // 149 pour voir l'effet d'un débordement en bas et à droite --> pas d'effet
      Bmp.Canvas.Brush.Color := clYellow;
      Bmp.Canvas.FillRect(Rect(13, 0, 149, 149));
    Il me reste à étudier et comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Bmp.Canvas.Brush.Color := clBlue;
    Bmp.Canvas.Pen.Width := 8;
    rajoutés avant les 4 lignes ci-dessus, et dont voici l'action :
    Nom : mesures_pen.width.png
Affichages : 424
Taille : 14,1 Ko

    De ces mesures je déduis que Pen.Width dessine une bordure de Width div 2, comportement absolument pas documenté dans l'aide, mais confirmé par le fait que Pen.Height n'existe pas.

    Anecdote : en jouant avec la complétion, j'ai découvert TJoinStyle et là, F1 c'est typique de l'aide dans le monde informatique :
    Citation Envoyé par F1
    The join style can be: Round, Bevel and Miter.
    When style is Round then line joins are round.
    When style is Bevel then line joins are beveled.
    When style is Miter then line joins are mitered.
    C'est tout.
    Et bien sûr tout le monde sait ce qui se cache sous le mot Miter que je rencontre pour la première fois de ma vie...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    Et bien sûr tout le monde sait ce qui se cache sous le mot Miter que je rencontre pour la première fois de ma vie...
    Miter: Guide ou point de contact.
    Mitered: Assemblé ou taillé ou encore biseauté.
    Ça doit déterminer la manière dont sont joints les différents rectangles ?

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par mm_71 Voir le message
    Ça doit déterminer la manière dont sont joints les différents rectangles ?
    Sans doute, mais j'ai bien noté ce point comme "anecdotique" et caractéristique de la qualité de l'aide dans le monde informatique, très proche du zéro absolu, vous en conviendrez.

    Je ferai des tests quand j'aurai besoin d'assembler des morceaux de couleurs diverses et variées, déjà il y a du sport avec Canvas.BrushCopy fortement utilisé dans le projet d'exemple dont j'ai parlé et où là aussi l'aide est égale à elle-même, résultat il faut impérativement tester, tester et encore tester.

    Bientôt un compte-rendu...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Hello,

    Je n'utilise pas Lazarus, mais mon expérience sous Delphi (qui doit être similaire) est qu'un rectangle a une couleur de remplissage (maitrisée par Brush) et une bordure (maitrisée par Pen). Si on veut un rectangle avec une bordure et un remplissage de même couleur, il faut positionner la même couleur pour Brush et Pen (ou éventuellement mettre Pen.Style à "clear" pour ne pas dessiner de bordure, mais à tester).
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Yop !
    Citation Envoyé par M.Dlb Voir le message
    [...] (ou éventuellement mettre Pen.Style à "clear" pour ne pas dessiner de bordure, mais à tester).
    Testé et validé !

    Bon sang mais c'est bien sûr ! J'avais complètement zappé ce point, dans la mesure où j'étais dans un dossier d'exemple portant le nom canvas_test, je le rappelle, et que cet aspect primordial des choses dans la rubrique "Draw" a été complètement passé sous silence par les auteurs !

    Plus besoin du FillRect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      Bmp.Canvas.Pen.Style:=psClear; // M.Dlb /!\ /!\ /!\ +1 
      Bmp.Canvas.Brush.Color := clRed;
      Bmp.Canvas.Rectangle(0, 0, 150, 150); // test de débordement, sans action néfaste
      Bmp.Canvas.Brush.Color := clYellow;
      Bmp.Canvas.Rectangle(13, 0, 150, 150);// recouvre le rouge à partir de 13
      Bmp.Canvas.Brush.Color := clBlue;
      Bmp.Canvas.Rectangle(5, 10, 30, 20);
      Bmp.Canvas.Brush.Color := clMoneyGreen;
      Bmp.Canvas.Rectangle(25, 15,  3, 25); // rect commence à 25 et finit à  3 donc 21 d'occupation
      Bmp.Canvas.Rectangle(25, 30,  3, 35); // rect commence à 25 et finit à  3 donc 21 d'occupation
      Bmp.Canvas.Rectangle( 3, 40, 25, 45); // rect commence à  3 et finit à 25 donc 21 d'occupation
      Canvas.Draw(10,40, Bmp); Exit;
    Nom : Pen_Clear.png
Affichages : 399
Taille : 1,2 Ko (très beaucoup zoomé, lol !)
    C'était bien un problème d'utilisation erronée par lacune de documentation.

    Soyons honnête : on en trouve un bout avec le bouton Show Pens Dialog. Je ne suis pas encore allé voir le code, je constate juste qu'il y a deux styles intéressants, psClear et psInsideFrame [EDIT : pas sous XP où la bordure est présente] qui pourraient faire le même boulot, regardez la colonne de gauche dans l'image ci-dessous, sauf que si j'utilise la seconde option avec le code ci-dessus je me retrouve avec une demi-bordure pour le grand bitmap et des bordures complètes pour les petits alors que sur l'exemple il n'y en a pas.
    Nom : pen_test.png
Affichages : 430
Taille : 48,1 Ko

    Et un truc trouant : Width à 0 ou à 1, Linux comme XP, a le même résultat,
    Quant au Miter, on a l'explication. Tout ça aurait dû être intégré à l'aide sous forme d'images.

    Encore un truc à étudier...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Citation Envoyé par Jipété Voir le message
    [...] deux styles intéressants, psClear et psInsideFrame [EDIT : pas sous XP où la bordure est présente] qui pourraient faire le même boulot, regardez la colonne de gauche dans l'image ci-dessous, sauf que si j'utilise la seconde option avec le code ci-dessus je me retrouve avec une demi-bordure pour le grand bitmap et des bordures complètes pour les petits alors que sur l'exemple il n'y en a pas.
    Pour régler ce problème de bordures non présentes sous Linux, il faut les faire afficher éviter qu'elles soient masquées :
    dans pentest.pas,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        {$IFNDEF LINUX} // ! \
        MyBitmap.Canvas.Brush.Style := bsClear;
        {$ENDIF}        // ! \
        MyBitmap.Canvas.Pen.Color := clBlack;
    Résultat :
    Nom : insideframe_corrigé.png
Affichages : 365
Taille : 2,7 Ko
    C'est mieux, non ?

    Et une précision à propos du nom de cette possibilité : InsideFrame en haut à gauche par-dessus le dessin, et OutsideFrame en bas à droite après le dessin s'il y a la place :
    Nom : inside_outside.png
Affichages : 372
Taille : 718 octets

    À noter que l'application de cette bordure est effectuée à chaque appel de dessin par Canvas.Rectangle(l,t,r,b), d'où le retour du trait vertical au début de la zone jaune,

    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 96
    Dernier message: 27/06/2018, 22h50
  2. Logiciel pr emulation d'autres OS ( linux, windows...)
    Par elitost dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 14/07/2005, 17h16
  3. snmp linux windows
    Par Aramis dans le forum Développement
    Réponses: 2
    Dernier message: 19/06/2005, 23h39
  4. Réponses: 13
    Dernier message: 13/03/2005, 20h56
  5. Les fichiers sous linux/windows
    Par Stessy dans le forum Linux
    Réponses: 5
    Dernier message: 05/12/2003, 09h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo