Discussion: Composant TGIFViewer

  1. #1
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut Composant TGIFViewer

    TGIFViewer 👀
    Composant d'animation de GIFs pour Lazarus

    Bonjour à tous,

    Suite à notre discussion, je vous présente le composant TGIFViewer en version 1.0.

    TGIFViewer est un composant visuel pour l'affichage d'animations au format GIF (Graphic Interchange Format) avec Free Pascal et Lazarus.

    Compatibilité : Windows, Linux et MacOS

    Capacités de TGIFViewer :
    • Chargement depuis un stream, un fichier ou une ressource (fonctions LoadFromStream, LoadFromFile, LoadFromResource) ;
    • Extraction des images brutes (**fonction DisplayRawFrame) ;
    • Extraction des images pré-calculées de l'animation (fonction DisplayFrame ) ;
    • Affichage avec ou sans transparence (Transparent) ;
    • Gestion silencieuse de certaines données mal encodées pour permette l'affichage des images sans perturber l'utilisateur ;
    • Gestion des erreurs pour les fichiers mal compressés (OnLoadError) ;
    • Centrage (Center), redimensionnement (Stretch) de l'affichage ;
    • Dimension du composant automatique en fonction de l'image (AutoSize) ;
    • Evénement à la lecture, l'arrêt ou la mise en pause de l'animation (OnStart, OnPause, OnStop) ;
    • Accès aux images et informations du GIF via la propiété Frames.Items[x].
    • Traduction des messages interne via les fichiers po du français à l'anglais à l'aide du composant de Gilles Vasseur TGVTranslate légèrement modifié provenant de son tutoriel Comment internationaliser une application avec Free Pascal/Lazarus (voir demonstration gifview. Notez que vous devez copier le dossier languages dans le dossier de sortie de l'executable )


    Voici une démonstration avec MacOS :




    ℹ️ Contient également deux unités :

    • uFastBitmap : classe pour la manipulation de bitmaps 32 bits au format RGBA ou BGRA suivant l'OS ;
    • TypesHelpers : classes ajoutant des fonctions utiles au type de données (byte, integer, string, double, TDateTime...) les fonctions sont accessibles directement par la complétion du code sous Lazarus.
    • GVTranslate : Classe d'aide pour traduire une application


    ℹ️ Vous pouvez télécharger GIF-ImageTestSuite pour tester avec plusieurs GIFs encodés différemment.

    Installation :
    1. Dans Lazarus, allez dans le menu "Paquet" et sélectionnez "Ouvrir un fichier de paquet (".lpk") ;
    2. Sélectionnez gifviewer_pkg.lpk du dossier Package ;
    3. Cliquez sur le bouton "Compiler" ;
    4. Cliquez sur le bouton "Utiliser" puis "Installer".


    Le composant TGIFViewer sera installé dans la section Beanz Extra.

    Note :
    L'application de démonstration GifView du dossier Demos ne nécessite pas l'installation du composant dans l'EDI pour fonctionner.

    Licence : MPL

    Téléchargement à partir de DVP

    Que pensez-vous de ce composant ?
    Quels outils graphiques souhaiteriez-vous voir développés avec Lazarus ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 941
    Points : 9 740
    Points
    9 740

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Bonjour à tous

    Suite à notre discussion, je vous présente le composant TGIFViewer en version 1.0
    Houla, je te trouve bien précipité, là :
    Nom : girl.png
Affichages : 157
Taille : 65,4 Ko girl
    Nom : ballerouge_1er_tour.png
Affichages : 138
Taille : 404 octets Nom : ballerouge_toursuivant.png
Affichages : 138
Taille : 406 octets balle rouge
    1re boucle boucles suivantes
    Nom : 38732719.png
Affichages : 165
Taille : 244,6 Ko 38732719
    Nom : 48487099.png
Affichages : 154
Taille : 54,4 Ko 48487099
    Nom : rotating_earth_2e_tour.png
Affichages : 140
Taille : 17,3 Ko rotating_earth
    Nom : 769l.png
Affichages : 138
Taille : 51,3 Ko 769l
    Nom : smartfullcolour.png
Affichages : 136
Taille : 7,4 Ko smartfullcolour triangle vert aléatoire
    J'ai arrêté là, il est tard...
    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

  3. #3
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Test sous Windows 10:


    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #4
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Jipété Voir le message
    Houla, je te trouve bien précipité, là :
    J'ai arrêté là, il est tard...
    Effectivement je viens de tester sous Linux il y a un problème avec la transparence.

    Précipité ? NON ! même sous Mac TGIFViewer fonctionne nickel. Je vais essayer de voir ce que je peux modifier. Mais ça sent pas bon du côté du TBitmap avec Linux. C'est vraiment aléatoire comme comportement.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Vraiment chelou comme bug

    Chargement de la girl nickel. Je visualise l'animation image par image pas de soucis. Arrivé à la 16ème image, je redescends et là paf .

    Le problème se situe avec l'utilisation de TBitmap.MaskHandle (voir la fonction TFastBitmap.BuildBitmap) si tu commentes la ligne "Temp.MaskHandle" toutes les images que tu as postées ci-dessus fonctionnent. Par contre Pen-Gif, le singe, la WikiBall sont en vrac.
    Le plus étrange, c'est que la transparence est bien prise en charge pour la première image de chaque gif mais pas les suivantes (c'est suivant les gif : avec girl, l'animation jouée, la première fois est bonne, mais pas la seconde ). Ce bug ne vient pas de mon code. Sinon si quelqu'un a la solution, on est preneur.

    Pour info, j'ai même forcé la couleur alpha à 255 dans "TFastBitmap.PutImage", même problème. En remplaçant "StretchDraw" par "Draw" dans TGifViewer.Paint, l'incohérence de la transparence est encore plus flagrante . A part utiliser mon projet, vu que je travaille avec les bitmaps différemment et où je n'ai pas ce soucis je ne vois pas comment faire. Ou sinon la solution serait comme dans GifAnim : passer par TLazIntfImage avant de passer les données au TBitmap.

    Bref, c'est vraiment frustrant pour le coup
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Et enfin voilà le test sous Linux :



    C'est quand même fou que d'être obligé de passer par TLazIntfImg sous Linux pour que la transparence soit gérée correctement.

    PS : Les sources ont été mises à jour. Tout roule dans les trois mondes
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 941
    Points : 9 740
    Points
    9 740

    Par défaut

    Salut,

    et bravo !
    Bravo pour avoir trouvé le coup du TLazIntfImage, et bravo également pour tout le reste.

    Hélas, il y a encore deux-trois bricoles et ça va être comme l'ascension du Mont-Blanc, les derniers mètres seront les plus difficiles...

    Je me suis concentré uniquement sur le dossier des good89 (il y a sans doute des petites différences de contenu avec le tien, pour le moment on s'en moque), j'ai examiné 54 fichiers, et il y a des soucis de transparence avec balle :
    Nom : balle_img1.png
Affichages : 111
Taille : 1,5 Ko Nom : balle_zoomée.png
Affichages : 111
Taille : 795 octets zoomé à 800 %

    et Animaux-0 et son problème de barre verticale présente ou absente à gauche dans le trou supérieur du B, zoomé à 800 % aussi : à gauche l'image 1, à droite l'image 0 :
    Nom : animaux_zoom800.png
Affichages : 110
Taille : 4,6 Ko

    Ce problème disparaît en affectant clWhite à la couleur transparente : cela ne devrait-il pas être fait automagiquement ?

    Ensuite un souci avec "adapter dimension" qui ne fonctionne pas comme il faudrait :
    • pour les trop grandes images il faut le cocher sinon on en perd mais regarder une petite image ensuite ça va l'agrandir (avec effet de pixellisation) et il faut donc décocher.
    • pour les petites images il faut être décoché mais examiner ensuite des grandes images les tronque : il faut alors cocher.

    Pour certaines images c'est évident qu'elles sont tronquées :

    Nom : bell.png
Affichages : 113
Taille : 46,0 Ko bell non coché
    donc on coche,

    Nom : sun02_adap_coché.png
Affichages : 120
Taille : 130,7 Ko SUN02 coché

    pour d'autres ça n'est pas visible du tout (le feu d'artifice 38732719) et on ne pensera pas à jouer avec la case à cocher.


    Bon dimanche, ne passe pas la journée là-dessus.
    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

  8. #8
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Jipété Voir le message
    Salut,

    et bravo !
    Bravo pour avoir trouvé le coup du TLazIntfImage, et bravo également pour tout le reste.

    Hélas, il y a encore deux-trois bricoles et ça va être comme l'ascension du Mont-Blanc, les derniers mètres seront les plus difficiles...

    Je me suis concentré uniquement sur le dossier des good89 (il y a sans doute des petites différences de contenu avec le tien, pour le moment on s'en moque), j'ai examiné 54 fichiers, et il y a des soucis de transparence avec balle :
    zoomé à 800 %

    et Animaux-0 et son problème de barre verticale présente ou absente à gauche dans le trou supérieur du B, zoomé à 800 % aussi : à gauche l'image 1, à droite l'image 0 :
    Ca je n'y peux rein les images sont comme ça

    Citation Envoyé par Jipété Voir le message
    Ce problème disparaît en affectant clWhite à la couleur transparente : cela ne devrait-il pas être fait automagiquement ?
    Non je ne peux pas le savoir car gif sont marqués comme étant des gifs transparent

    Citation Envoyé par Jipété Voir le message
    Ensuite un souci avec "adapter dimension" qui ne fonctionne pas comme il faudrait :
    • pour les trop grandes images il faut le cocher sinon on en perd mais regarder une petite image ensuite ça va l'agrandir (avec effet de pixellisation) et il faut donc décocher.
    • pour les petites images il faut être décoché mais examiner ensuite des grandes images les tronque : il faut alors cocher.

    Pour
    bell non coché
    donc on coche,
    SUN02 coché

    pour d'autres ça n'est pas visible du tout (le feu d'artifice 38732719) et on ne pensera pas à jouer avec la case à cocher.

    Bon dimanche, ne passe pas la journée là-dessus.
    Ok merci je vais regardé, car j'ai modifié les formules. C'est 3x rien ça juste un petit réajustement à faire

    Bon dimanche

    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  9. #9
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    En passant merci Gilles pour la mise en page et la mise en avant.

    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 941
    Points : 9 740
    Points
    9 740

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Non je ne peux pas le savoir car les gif sont marqués comme étant des gifs transparent


    Voilà ce que je trouve dans le fichier gif89a.txt, concernant le Graphic Control Extension ligne 1218 et suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      4  |               |       Transparent Color Index       Byte
         +---------------+
         +---------------+
      0  |               |       Block Terminator              Byte
         +---------------+
    
          <Packed Fields>  =     Reserved                      3 Bits
                                 Disposal Method               3 Bits
                                 User Input Flag               1 Bit
                                 Transparent Color Flag        1 Bit
    Cela ne suffirait-il pas à notre bonheur ?



    Pendant qu'on y est, ça concerne l'IHM mais je le mets ici quand même :

    j'ai testé (va savoir pourquoi) le message d'erreur de FormDropFiles, et ça donne ça :
    Nom : test_messagedlg.png
Affichages : 110
Taille : 16,7 Ko

    Tu vois écrit "Ok", toi ? Et "Abandonner" ? Moi pas.

    Je suggère ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          MessageDlg('Erreur Inconnue : ' +
          //  #13 + #10 + 'Ok pour continuer' + #13 + #10 + 'Abandonner pour quitter l''application', mtError, [mbOK, mbAbort], 0);
            #13 + #10 + 'Valider pour continuer' + #13 + #10 + 'Annuler pour quitter l''application', mtError, [mbOK, mbCancel], 0);
          // TODO : if MessageDlg.Result = mbCancel then Application.Halt;
    J'ai mis un TODO et un pseudo-code car F1 sur MessageDlg m'envoie dans les choux, donc je ne sais pas détecter le clic sur le bouton...


    Et enfin, un mystère pour moi dans l'unité uFastBitmap :
    le compilateur n'est pas content : Warning: Local variable "ColorRGB24" does not seem to be initialized et ça concerne la ligne 5 (312 du code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TColor32.Create(Color: TColor);
    Var
      ColorRGB24 : TColorRGB24;
    Begin
      ColorRGB24.Create(Color); // là !
      Create(ColorRGB24);
    End;
    Alors je tente ça, comme je le ferais pour une TStringlist par ex. (sl := TStringlist.Create;) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TColor32.Create(Color: TColor);
    Var
      ColorRGB24 : TColorRGB24;
    Begin
    //  ColorRGB24.Create(Color);
      ColorRGB24 := TColorRGB24.Create(Color);
      Create(ColorRGB24);
    End;
    mais là ça ne compile plus du tout : Error: Incompatible types: got "untyped" expected "TColorRGB24" sur la ligne 6.
    Pourquoi ?

    Précisions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Type
      { TColorRGB24 : Définition d'un pixel sur 24 bits au format RGB }
      TColorRGB24Type = packed array[0..2] of byte;
      TColorRGB24 = packed record
        { Creation de la couleur }
        procedure Create(R,G,B : Byte); Overload;
        procedure Create(Color:TColor); Overload;
     
        { Conversion vers un TColor }
        function ToColor : TColor;
     
        Case Integer of
         0 : (V:TColorRGB24Type);    // Acces via Tableau
         1 : (Red,Green,Blue: Byte); // Acces via Composantes
      end;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure TColorRGB24.Create(Color : TColor);
    Var
      lr,lg,lb : Byte;
    Begin
      lr := Color;
      lg := Color shr 8;
      lb := Color shr 16;
      Create(lr,lg,lb);
    End;
    Merci les gourous,
    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

  11. #11
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Le bug du stretch est corrigé et le github mise à jour

    Nom : 2018-06-24_104850.jpg
Affichages : 107
Taille : 53,9 Ko
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  12. #12
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Jipété Voir le message


    Voilà ce que je trouve dans le fichier gif89a.txt, concernant le Graphic Control Extension ligne 1218 et suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      4  |               |       Transparent Color Index       Byte
         +---------------+
         +---------------+
      0  |               |       Block Terminator              Byte
         +---------------+
    
          <Packed Fields>  =     Reserved                      3 Bits
                                 Disposal Method               3 Bits
                                 User Input Flag               1 Bit
                                 Transparent Color Flag        1 Bit
    [/code]
    Cela ne suffirait-il pas à notre bonheur ?
    Malheureusement non, Transparent Color Flag indique si l'image est transparente ou pas. Si l'image est transparente on a un indice pour la couleur transparente. On a aussi un indice pour la couleur de fond. Souvent lorsque l'image est transparente les 2 indices sont identiques. Ensuite pour l'affichage tout dépend de comment est encodé le GIF prend le singe en exemple c'est nickel avec ou sans transparence. Le resultat diffère suivant Disposal Method

    Citation Envoyé par Jipété Voir le message
    Pendant qu'on y est, ça concerne l'IHM mais je le mets ici quand même :

    j'ai testé (va savoir pourquoi) le message d'erreur de FormDropFiles, et ça donne ça :

    Tu vois écrit "Ok", toi ? Et "Abandonner" ? Moi pas.

    Je suggère ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          MessageDlg('Erreur Inconnue : ' +
          //  #13 + #10 + 'Ok pour continuer' + #13 + #10 + 'Abandonner pour quitter l''application', mtError, [mbOK, mbAbort], 0);
            #13 + #10 + 'Valider pour continuer' + #13 + #10 + 'Annuler pour quitter l''application', mtError, [mbOK, mbCancel], 0);
          // TODO : if MessageDlg.Result = mbCancel then Application.Halt;
    [/code]
    J'ai mis un TODO et un pseudo-code car F1 sur MessageDlg m'envoie dans les choux, donc je ne sais pas détecter le clic sur le bouton...
    Ok c'est noté, mais petite question comment tu as fais pour lever cette exception car c'est quasiment impossible qu'elle apparaisse. Car la vérification de la signature du fichier court-circuite le processus.

    Citation Envoyé par Jipété Voir le message
    Et enfin, un mystère pour moi dans l'unité uFastBitmap :
    le compilateur n'est pas content : Warning: Local variable "ColorRGB24" does not seem to be initialized et ça concerne la ligne 5 (312 du code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TColor32.Create(Color: TColor);
    Var
      ColorRGB24 : TColorRGB24;
    Begin
      ColorRGB24.Create(Color); // là !
      Create(ColorRGB24);
    End;
    C'est normale elle n'est pas initialisé, elle l'ai via la procedure Create

    je vais rajouté pou empêcher l'affichage de ce message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {$push}
    {$warn 5057 off}
     ColorRGB24.Create(Color); 
    {$pop}
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {%H-}ColorRGB24.Create(Color);
    Citation Envoyé par Jipété Voir le message
    Alors je tente ça, comme je le ferais pour une TStringlist par ex. (sl := TStringlist.Create;) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TColor32.Create(Color: TColor);
    Var
      ColorRGB24 : TColorRGB24;
    Begin
    //  ColorRGB24.Create(Color);
      ColorRGB24 := TColorRGB24.Create(Color);
      Create(ColorRGB24);
    End;
    mais là ça ne compile plus du tout : Error: Incompatible types: got "untyped" expected "TColorRGB24" sur la ligne 6.
    Pourquoi ?

    Précisions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Type
      { TColorRGB24 : Définition d'un pixel sur 24 bits au format RGB }
      TColorRGB24Type = packed array[0..2] of byte;
      TColorRGB24 = packed record
        { Creation de la couleur }
        procedure Create(R,G,B : Byte); Overload;
        procedure Create(Color:TColor); Overload;
     
        { Conversion vers un TColor }
        function ToColor : TColor;
     
        Case Integer of
         0 : (V:TColorRGB24Type);    // Acces via Tableau
         1 : (Red,Green,Blue: Byte); // Acces via Composantes
      end;
    L'erreur est normal sur ColorRGB24 := TColorRGB24.Create(Color); Create est une Procedure et non une fonction elle ne retourne pas de résultat

    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure TColorRGB24.Create(Color : TColor);
    Var
      lr,lg,lb : Byte;
    Begin
      lr := Color;
      lg := Color shr 8;
      lb := Color shr 16;
      Create(lr,lg,lb);
    End;
    Ici le create est appliqué sur lui même SELF.Create(lr,lg,lb) à la place, j'aurais pu écrire comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Procedure TColorRGB24.Create(Color : TColor);
    Var
      lr,lg,lb : Byte;
    Begin
      lr := Color;
      lg := Color shr 8;
      lb := Color shr 16;
      With Self do
      begin
         Red := lr;
         Green := lg;
         Blue := lb;
      end;
    End;
    Pour la création de ce genre type, je ne sais pas pourquoi mais je préfère utiliser des procédures que des fonctions

    je préfère, comme ci-dessous. Sémantiquement ça me parait plus logique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Const 
     clRed24 : TColorRGB24= (Red:255;Green:0;Blue:0); // ou clRed24 : TColorRGB24= (v:(255,0,0));
    Var
     MaCouleur : TColorRGB24
     
    begin
      // Je préfère
      MaCouleur.Create(255,0,0) // couleur rouge
     
     //à MaCouleur := TColorRGB24.Create(255,0,0)
     
      // Car si on veux assigner une autre couleur on fait simplement
      MaCouleur := clRed24;
    end;
    c'est un choix personnel après tu peux très bien modifier les procédures Create en fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function TColorRGB24.Create(r,g,b):TColorRGB24;
    begin
      With Result do
      begin
         Red := r;
         Green := g;
         Blue := b;
      end;
    end;
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  13. #13
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Je viens de refaire une petite mise à jour. J'avais fais un truc stupide. Mauvais copier-coller d'un bout de code
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 941
    Points : 9 740
    Points
    9 740

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Ok c'est noté, mais petite question comment tu as fais pour lever cette exception car c'est quasiment impossible qu'elle apparaisse. Car la vérification de la signature du fichier court-circuite le processus.
    Tout simple !
    J'ai copié/collé les deux lignes concernées à la fin de TMainFormCreate et hop !, la boîte de message s'est affichée,

    Citation Envoyé par BeanzMaster Voir le message
    c'est un choix personnel après tu peux très bien modifier les procédures Create en fonctions :
    Je ne modifie rien du tout tant qu'on n'en a pas parlé d'abord, et validé par toi ensuite, car sinon ça va générer deux codes différents avec joyeuse prise de tête à l'arrivée de chaque modif, comme par exemple ce qui suit, que j'ai testé et qui ne pose pas de problèmes (puisque j'utilise couramment cette construction et qu'il me semble que c'est recommandé) : pour détruire des objets d'une liste, faut partir d'en haut, donc
    dans uGifViewer ligne 750
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Procedure TGIFImageList.Clear;
    Var
      anItem: TGIFImageListItem;
      i:      Integer;
    Begin
      Inherited Clear;
      If Count > 0 Then
      Begin
    //jpt    For i := 0 To Count - 1 Do
        For i := Count - 1 Downto 0 Do
    et ligne 1860
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure TGIFRenderCacheList.Clear;
    Var
      anItem: TGIFRenderCacheListItem;
      i:      Integer;
    Begin
      If Count > 0 Then
      Begin
    //jpt    For i := 0 To Count - 1 Do
        For i := Count - 1 DownTo 0 Do
    et dans uFastBitmap ligne 480
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TColor32List.Clear;
    Var
      anItem: TColor32Item;
      i : Integer;
    Begin
      inherited Clear;
      If Count > 0 then
      begin
    //jpt    For i := 0 to Count -1 do
        For i := Count -1 DownTo 0 do
    De ce que j'ai compris suite lectures sur SO et autres, si tu détruis en partant de zéro, les objets bien faits vont tout faire descendre d'un cran (pour ne pas avoir liste[0] vide), je te laisse imaginer le temps perdu pour rien, surtout avec les grandes listes.


    Citation Envoyé par BeanzMaster Voir le message
    L'erreur est normale sur ColorRGB24 := TColorRGB24.Create(Color); Create est une Procedure et non une fonction elle ne retourne pas de résultat
    Et quand c'est un constructor comme pour la TStringList, c'est quoi, alors ?
    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

  15. #15
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Jipété Voir le message
    Tout simple !
    J'ai copié/collé les deux lignes concernées à la fin de TMainFormCreate et hop !, la boîte de message s'est affichée,
    ha ben oui comme ça c'est sur

    Citation Envoyé par Jipété Voir le message
    Je ne modifie rien du tout tant qu'on n'en a pas parlé d'abord, et validé par toi ensuite, car sinon ça va générer deux codes différents avec joyeuse prise de tête à l'arrivée de chaque modif, comme par exemple ce qui suit, que j'ai testé et qui ne pose pas de problèmes (puisque j'utilise couramment cette construction et qu'il me semble que c'est recommandé) : pour détruire des objets d'une liste, faut partir d'en haut, donc
    dans uGifViewer ligne 750
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Procedure TGIFImageList.Clear;
    Var
      anItem: TGIFImageListItem;
      i:      Integer;
    Begin
      Inherited Clear;
      If Count > 0 Then
      Begin
    //jpt    For i := 0 To Count - 1 Do
        For i := Count - 1 Downto 0 Do
    De ce que j'ai compris suite lectures sur SO et autres, si tu détruis en partant de zéro, les objets bien faits vont tout faire descendre d'un cran (pour ne pas avoir liste[0] vide), je te laisse imaginer le temps perdu pour rien, surtout avec les grandes listes.
    Oui tu as raison pour les listes je vais modifié c'est comme dans les Destructor c'est mieux de partir sur une gestion "LIFO"

    SO ? ESSO !!!!!!S ??? Source Orge ? c'est quoi c'est ou ?


    Citation Envoyé par Jipété Voir le message
    Et quand c'est un constructor comme pour la TStringList, c'est quoi, alors ?
    Vu que c'est un record et non une classe ce n'est pas un constructor Un constructor dans une classe est considéré lui, comme une fonction spéciale. Et le Destructor comme une procédure. Il me semble que ce n'ai pas possible de faire MaClasse := TMaClasse.Destroy;. Je n'y ai d'ailleurs jamais pensé.

    Tu peux très bien initialisé la variable sans utiliser "Create". Comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Var 
      MaCouleur : TColorRGB24;
     
    Begin
      MaCouleur.Red := 255;
      MaCouleur.Green := 0;
      MaCouleur.Blue := 0;
    end;
    Chose que tu ne peux pas faire avec TStringList qui est une classe.
    La subtilité des Enregistrements avancés ce situe à ce niveau

    Avec des record basique on aurait du écrire du code "non-objet", "procedurale" à l'ancienne

    Function CreateColorRGB24(r,g,b):TColorRGB24; ou procedure CreateColorRGB24(out AColor : TColorRGB24; R,G,B : Byte);si je prend la fonction blend de TColor32 cela aurait donné

    function BlendColor32(Color1, Color2 : TColor32) : TColor32;Le gros avantage c'est que ces fonctions sont disponibles avec l'auto-complémentation. Ce qui évite à ma mémoire de surchauffer. Et en plus on obtient un code plus compacte et cela évite de déclarer des variables intermédiaires.
    On peux même surcharger les opérateurs (+,-,*,/,:=,<,>, and, or,....) Comme dans TColor32 avec le "=". Regardes dans mon projet dans l'unité BZGraphic (TBZColorXXX) pour un exemple plus complet.

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    TColorRGB24 = record
    public
      Class operator -(aColor:TColorRGB24): TColorRGB24;
     
    end;
     
    class operator TColorRGB24.-(aColor:TColorRGB24): TColorRGB24;
    var
      vR,vG,vB : Integer;
      function clampToByte(i:Integer):Byte;
      begin
         result := i;
         if Result > 255 then Result := 255
         else if Result < 0 then Result :=0;
      end;
    begin
     
      With Self do
      begin
         vR := Red - aColor.Red;
         vG := Green - aColor.Green;
         vB := Blue - aColor.Blue;     
         Red := ClampToByte(vR);
         Green := ClampToByte(vG);
         Blue := ClampToByte(vB);
      end;
    end;
     
    // Utilisation
     
    Macouleur := Couleur1 - Couleur2;

    Par exemple :

    Code basique (Schématisé) sans utiliser les enregistrement avancés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Var
      CouleurSource, CouleurDest : TColor32;
     
    For y:=0 to Height-1 do
      For X:=0 to Width-1 do
      begin
        CouleurSource := BmpSource.Pixels[x,y]
        CouleurDest := BmpDest.Pixels[x,Y];
        BmpDest.Pixels[x,Y] := BlendColor32(CouleurDest, CouleurSource);
      end;
    Ou Optimisé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    For y:=0 to Height-1 do
      For X:=0 to Width-1 do
      begin
        BmpDest.Pixels[x,Y] := BlendColor32(BmpDest.Pixels[x,Y], BmpSource.Pixels[x,y]);
      end;
    Avec enregistrement avancé tu peux écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For y:=0 to Height-1 do
      For X:=0 to Width-1 do
      begin
        BmpDest.Pixels[x,Y].Blend(BmpSource.Pixels[x,y]);
      end;
    On a donc un gain de mémoire car on n'a pas besoin des 2 variables (j'aurais pu me contenter d'une seule ou d'aucune, mais c'est plus parlant comme ça je pense) On gagne également en vitesse de traitement
    Les valeurs sont directement modifiées aux lieux de passé par une assignation BmpDest.Pixels[x,Y] :=..... supplémentaire.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 941
    Points : 9 740
    Points
    9 740

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    SO ? ESSO !!!!!!S ??? Source Orge ? c'est quoi c'est où ?
    Stack Overflow, les voisins.

    Citation Envoyé par BeanzMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TColorRGB24 = record
    public
      Class operator -(aColor:TColorRGB24): TColorRGB24;
    end;
     
    class operator TColorRGB24.-(aColor:TColorRGB24): TColorRGB24;
    On gagne également en vitesse de traitement
    Les valeurs sont directement modifiées aux lieux de passé par une assignation BmpDest.Pixels[x,Y] :=..... supplémentaire.
    Manière d'écrire totalement incompréhensible pour moi, au premier coup d'œil.
    Alors si la machine gagne du temps c'est moi qui en perds : aucun intérêt.

    C'est comme cette manière d'écrire en C, tu sais, le test à 2 sorties sur une ligne concise, genre if test<>0 then action1 else action2 qui deviendra x?y:z et à chaque fois faut que j'aille chercher l'explication dans mon bouquin (et d'abord la trouver dans la table des matières, autre perte de temps).
    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

  17. #17
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Nouvelle mise à jour effectuée

    • Traduction des message interne Anglais/Français ( voir l'annonce )
    • Début d'ajout de la traduction en anglais des commentaire des parties interface
    • Quelques modifications mineures




    EDIT : TGIFViewer va bientôt être également publier via Online Package Manager. Je viens tout juste d'avoir un message de GetMem
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 941
    Points : 9 740
    Points
    9 740

    Par défaut

    Bonsoir,

    Ai constaté que si les grandes images fonctionnent correctement maintenant avec l'état de la case à cocher "Adapter", il n'y a rien qui nous dit que l'image ne rentre pas et qu'il faut cocher. Très ennuyeux.
    Mais est-ce que ça concerne l'IHM ou le compo ? Je te laisse en juger.

    Autre chose, toujours concernant l'IHM : j'ai bien vu arriver en haut à droite ce nouveau combo, chacun pourra le changer à sa guise, mais comme je dis toujours, si j'ai un problème avec ma bagnole, faut-il que je l'emmène au guarage ?
    Et le "s" est en trop, puisqu'il n'y aura jamais qu'un langage à la fois.

    Attention, le fait d'essayer une autre valeur avec l'appli tournant dans l'EDI ne la relance pas.
    Par contre, hors EDI, après avoir choisi "fr" ou "en", quand l'appli redémarre elle est toujours en "auto".
    Et si je choisis "en", l'IHM est toujours en français. Il sert à quoi, ce gadget ?


    Ah, pour ne plus être ennuyé par les problèmes de transparence de la balle jaune et du B de Animaux, je force la couleur du fond à clWhite et voilà, et ça ne gêne pas le singe.

    Ton truc est pas mal du tout, maintenant

    Mais parlons technique une minute : il sert à quoi ton TGIFFastMemoryStream, que j'ai un peu regardé, s'il fait la même chose que le TStream de base, sur lequel il s'appuie ?
    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

  19. #19
    Membre expérimenté
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 689
    Points : 1 569
    Points
    1 569
    Billets dans le blog
    2

    Par défaut

    Citation Envoyé par Jipété Voir le message
    Bonsoir,

    Ai constaté que si les grandes images fonctionnent correctement maintenant avec l'état de la case à cocher "Adapter", il n'y a rien qui nous dit que l'image ne rentre pas et qu'il faut cocher. Très ennuyeux.
    Mais est-ce que ça concerne l'IHM ou le compo ? Je te laisse en juger.
    C'est comme avec TImage et les antibiotiques le "Stretch" n'est pas automatique . Rajouter une option AutoStretch est facilement faisable, pourquoi pas !

    Citation Envoyé par Jipété Voir le message
    Autre chose, toujours concernant l'IHM : j'ai bien vu arriver en haut à droite ce nouveau combo, chacun pourra le changer à sa guise, mais comme je dis toujours, si j'ai un problème avec ma bagnole, faut-il que je l'emmène au guarage ?
    Et le "s" est en trop, puisqu'il n'y aura jamais qu'un langage à la fois.
    Oui j'ai mis au pluriel par rapport à la liste qui contient plusieurs langues. Dans l'absolu au singulier est préférable tu as raison. Merci.

    Citation Envoyé par Jipété Voir le message
    Attention, le fait d'essayer une autre valeur avec l'appli tournant dans l'EDI ne la relance pas.
    Par contre, hors EDI, après avoir choisi "fr" ou "en", quand l'appli redémarre elle est toujours en "auto".
    Et si je choisis "en", l'IHM est toujours en français. Il sert à quoi, ce gadget ?
    Normalement cela change la langue comme c'est supposé le faire. J'ai peut-être une erreur dans les noms de fichier
    minuscules/majuscule. La j'ai testé sous Mac et ça ne fonctionne pas et j'ai remarqué que j'ai mis Translate('UGIFViewer') au lieu de uGifViewer, mais ça ne marche toujours pas.
    Je vais allez faire un tour dans Linux pour voir et tester justement.

    EDIT : J'ai oublié de le spécifier dans l'annonce, il faut copier le dossier languages dans le dossier de sortie de l'executable

    Citation Envoyé par Jipété Voir le message
    Ah, pour ne plus être ennuyé par les problèmes de transparence de la balle jaune et du B de Animaux, je force la couleur du fond à clWhite et voilà, et ça ne gêne pas le singe.
    Pour ce genre d'image tu n'as pas le choix que de choisir le bond fond. Sinon la solution c'est de retoucher l'animation avec Gimp. Avec ces 2 là cela le ferai il n'y a pas beaucoup d'images pour l'animation. Avec animaux suffit juste un petit coup de gomme sur la dernière image.

    Citation Envoyé par Jipété Voir le message
    Ton truc est pas mal du tout, maintenant
    Oui ça à bien pris forme. Merci

    Citation Envoyé par Jipété Voir le message
    Mais parlons technique une minute : il sert à quoi ton TGIFFastMemoryStream, que j'ai un peu regardé, s'il fait la même chose que le TStream de base, sur lequel il s'appuie ?
    Le fait qu'il se base sur TStream c'est pour la compatibilité. En fait la classe charge toutes les données en une seule fois dans un bloc (tampon) mémoire et on lit les données avec un pointer. C'est beaucoup plus rapide.
    Je l'ai surtout mis pour ne pas m'embêter à convertir le code du chargeur de GIF. Qui à la base j'ai codé sous mon projet. Dans mon projet la classe correspondant au TGIFFastStream est TBZBufferStream (unité BZStreamClasses) qui est plus évoluée et qui lit les donnée provenant d'un flux (stream) par tampon de X Mo jusqu'à la fin des données. Il me servira plus tard pour gérer le "FileMapping" par exemple.

    Grossièrement, la différence entre tampon (Buffer) et un flux (Stream) est qu'un flux est une séquence qui transfère des informations depuis ou vers une source spécifiée, alors qu'un tampon est une séquence d'octets qui est stockée dans la mémoire.

    Voila j'espère que tu arrives à me comprendre, ce n'est pas évident d'expliquer certaine chose comme ça

    Bonne nuit
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  20. #20
    Membre expert
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 581
    Points : 3 904
    Points
    3 904

    Par défaut

    hello,
    Félicitations pour ton composant !
    Juste une suggestion :
    Il serait peut-être bien d'inclure dans les fichiers de la démo GifView au moins un gif animé. Je te propose le fpclogo

    Nom : fpclogo.gif
Affichages : 63
Taille : 5,7 Ko

    En pièce jointe le logo en gif animé et aussi le lrs (pour peut être remplacer la ressource de l'autre démo GifRes).

    Ami calmant, J.P
    Fichiers attachés Fichiers attachés
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. Réponses: 18
    Dernier message: 03/06/2010, 10h09
  2. Réponses: 18
    Dernier message: 03/06/2010, 10h09
  3. Réponses: 18
    Dernier message: 03/06/2010, 10h09
  4. Annonces de composants, extensions, frameworks etc.
    Par Community Management dans le forum Tests
    Réponses: 12
    Dernier message: 06/01/2009, 13h33
  5. Composant Joomla pour annonces de ventes
    Par young077 dans le forum Joomla
    Réponses: 2
    Dernier message: 07/08/2007, 02h32

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