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 :

TShape absolument pas compatible avec Delphi


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut TShape absolument pas compatible avec Delphi
    Bonjour bonjour,

    aujourd'hui on continue, dans la série "Lazarus est une catastrophe de non-compatibilité"...

    Est-ce lié à Linux ? Je n'en sais rien, j'ai même la flemme de faire les tests sous Windows, vous allez voir il y a tellement peu de code que ça fait peur et pourtant, la catastrophe graphique est inversement proportionnelle à la faible quantité de code.

    Qu'on en juge : je suis bêtement parti de cette discussion Delphi, simple comme tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      image:TBitmap;
    begin
      image := TBitmap.Create;
      ImageList1.GetBitmap(0,image);
      Shape1.Brush.Bitmap:=image;
    end;
    en me disant "tiens tiens, on peut mettre une image dans un TShape ? Testons donc", et voilà mon code qui, en fait, tient en une ligne si on fait abstraction du chargement du fichier .bmp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      if not Ouvrir.Execute then exit;
      image1.Picture.Bitmap.LoadFromFile(Ouvrir.FileName);
      shape1.Brush.Bitmap := image1.Picture.Bitmap;
    Voilà le résultat : à droite image1, un TImage qui contient l'image du fichier .bmp, et à gauche un grand TShape qui commence à 24 left, 16 top (ne tenez pas compte des chiffres au-dessus) :
    Nom : utilis_TShape.png
Affichages : 235
Taille : 49,0 Ko

    Si je fais commencer le TShape à 0,0, la première image, celle d'en haut à gauche, est entière, puisqu'elle est plus petite (96 x 96) que le TShape (232 x 240).

    La bonne question est : mais pourquoi le TShape se croit-il obligé de dupliquer l'image pour se remplir intégralement ? On dirait du Windows 3.1 en mode mosaïque !

    Ensuite je me suis amusé à le redimensionner à 48 x 48 et à en faire trois copies, positionnées côte à côte et avec un léger décalage concernant la hauteur pour les deux derniers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      shape1.Brush.Bitmap := image1.Picture.Bitmap;
      shape2.Brush.Bitmap := image1.Picture.Bitmap;
      shape3.Brush.Bitmap := image1.Picture.Bitmap;
      shape4.Brush.Bitmap := image1.Picture.Bitmap;
    Nom : utilis_TShape2.png
Affichages : 226
Taille : 25,6 Ko

    Je vous passe le test du TShape ayant la même taille que le fichier image, le résultat est le même : le TShape se comporte comme une "fenêtre" ouverte sur la fiche, celle-ci ayant été au préalable remplie en mode mosaïque avec l'image du fichier .bmp.

    Alors bien sûr ce genre de gag on ne le détecte pas tout de suite, on se dit qu'on a glissé une erreur dans le code mais là, vu qu'il n'y a qu'une ligne, ça devient difficile...

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Citation Envoyé par Jipété Voir le message
    La bonne question est : mais pourquoi le TShape se croit-il obligé de dupliquer l'image pour se remplir intégralement ?
    La réponse simple serait : parce que tu le lui demandes
    La brosse est utilisée par l'OS pour le remplissage de la surface. Elle n'est pas faite pour uniquement "tamponner" à un endroit (il n'y a aucune notion de coordonnées dans l'assignation de la brosse).

    Citation Envoyé par Jipété Voir le message
    le TShape se comporte comme une "fenêtre" ouverte sur la fiche, celle-ci ayant été au préalable remplie en mode mosaïque avec l'image du fichier .bmp.
    C'est ça, la fenêtre n'a qu'un device context, le TShape facilite l'accès à une partie de ce DC.

    On a déjà parlé de l'origine de la brosse ici. Tu peux cependant la déplacer par SetBrushOrgEx (Windows tout du moins).

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Merci pour ton retour.

    Fouhhh, c'est pas bien de vieillir, je ne me souvenais absolument pas que j'avais déjà posté quelque chose sur ce sujet.

    Écoute, puisque tu as des droits de modo, supprime celui-ci.

  4. #4
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Écoute, puisque tu as des droits de modo, supprime celui-ci.
    Ce n'est peut-être pas nécessaire d'en arriver à cette extrémité, car la discussion pourra malgré tout intéresser quelqu'un rencontrant le problème avec TShape.
    Je me permets une remarque tout de même : pourquoi vouloir absolument faire faire à un composant ce pour quoi il n'est pas fait ? . Comme son nom l'indique, TShape est conçu pour dessiner des formes. Qui plus est, il est spécialisé dans le dessin d'une série de formes prédéfinies de type TShapeType (stRectangle, stSquare, stRoundRect, stRoundSquare, stEllipse, stCircle, stSquaredDiamond, stDiamond). Alors, je pense qu'il ne faut a priori pas lui demander, même si un bout de code ancien traîne dans ce sens, de peindre quelque chose. Si tel est ton objectif, la meilleure des pratiques est de créer un descendant de la classe et non de rentrer en force dans la classe par une porte dérobée .
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Salut, Gilles,
    Citation Envoyé par gvasseur58 Voir le message
    Je me permets une remarque tout de même : pourquoi vouloir absolument faire faire à un composant ce pour quoi il n'est pas fait ? .
    C'est pas moi, m'sieur, c'est pas moi, c'est l'autre, dans le forum à côté

    Citation Envoyé par gvasseur58 Voir le message
    Alors, je pense qu'il ne faut a priori pas lui demander, même si un bout de code ancien traîne dans ce sens, de peindre quelque chose.
    Ah ben vi, un bout de code ancien des 26 et 27 mars... 2017 ! Même pas 2 mois !

    Citation Envoyé par gvasseur58 Voir le message
    Si tel est ton objectif, la meilleure des pratiques est de créer un descendant de la classe et non de rentrer en force dans la classe par une porte dérobée .
    Bah nan, mon objectif était de voir si ces trois lignes en Delphi pouvaient être transposées en Lazarus, et pas plus.

    Mais ce que je retiens de cette histoire, c'est que j'avais complètement zappé mon premier post sur ce sujet, remonté par Andnotor.
    C'est grave, docteur ?
    Faut dire aussi que l'autre fil m'a accaparé l'attention à 110 % et à 100 % du temps...

    (et maintenant, j'essaye de comprendre comment et pourquoi un module de resampling utilisé par DoubleCmd travaille très bien avec des bitmaps chargés en amont par des images contenues dans des fichiers Jpeg et très mal avec des bitmaps chargés par des images contenues dans des fichiers Bitmap

    Allez, juste pour rire, et pour le plaisir de croiser Lena :
    Nom : compar_bmp_with_tlazintf.png
Affichages : 217
Taille : 388,4 Ko

    à gauche un bout de l'original .bmp, 800x600, à droite après le resample à 80 % : vous avec noté les différences dans la zone grise en bas à droite ?
    Mais pourquoi cette zone est impactée et pas le reste ?
    Je vous fais grâce de la copie d'écran mais si je pars de la même source sauf que c'est un .jpg, les couleurs à droite sont parfaites : à y perdre le peu de latin qui me reste...

    EDIT :
    pour faire court et simple, pour générer cette image à droite, j'utilise Stretch(src, dst, ResampleFilters[5].Filter, ResampleFilters[5].Width); avec src et dst qui sont 2 TBitmap créés au début du clic sur le Button, src.LoadFromFile(fic.bmp);, rien que du classique, et je récupère les gris en vrac, comme on peut le voir.

    J'ai tenté un truc de malade, de débile profond, deux instructions qui ne servent à rien, à première vue, et des fois ça paye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      t: TLazIntfImage;
    begin
      ...
      t := src.CreateIntfImage; // ajout
      src.LoadFromIntfImage(t); // ajout
      Stretch(src, dst, ResampleFilters[5].Filter, ResampleFilters[5].Width);
    et c'est tout bon !
    Enfin, pour l'image avec Lena et les gris en vrac qui redeviennent sympathiques -- va falloir tester plus profond...
    )

Discussions similaires

  1. pdfLateX|hyperref - pas compatible avec \appendix ?
    Par Aramis dans le forum Bibliographies - Index - Glossaires
    Réponses: 8
    Dernier message: 20/02/2008, 12h32
  2. prblm rtl100.bpl n'est pas trouve avec delphi 2007
    Par alateemo dans le forum Delphi
    Réponses: 1
    Dernier message: 27/06/2007, 00h04
  3. align=center pas compatible avec wc3 strict :-(
    Par shadowbob dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 10/09/2006, 12h18
  4. Comment modifier les .pas fournis avec Delphi ?
    Par prgasp77 dans le forum Langage
    Réponses: 2
    Dernier message: 09/02/2005, 15h12

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