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 :

[Windows] Scintillement à la mise à jour d'un TImage [Lazarus]


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut [Windows] Scintillement à la mise à jour d'un TImage
    Bonjour,

    un problème résolu, un autre problème le suit...
    Sur le web ça parle de LockWindowUpdate mais c'est inconnu sous Lazarus alors ça part dans les bidouilles, et ça devient compliqué : je "borde" la màj de l'image avec le couple classique Begin/EndUpdate mais cette fois on dirait qu'ils sont fâchés, en plein divorce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    img4result.Picture.Bitmap.BeginUpdate();
    img4result.Picture.Assign(bmpDst); // mise à jour de l'image
    img4result.Picture.Bitmap.EndUpdate();
    car je chope la jolie image suivante :
    Nom : begin_end_update.jpg
Affichages : 222
Taille : 16,7 Ko


    J'ai aussi tenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    img4result.Canvas.Lock;
    img4result.Picture.Assign(bmpDst); // mise à jour de l'image
    img4result.Canvas.UnLock;
    et je gagne la même image, y a que le texte qui change, canvas not locked quand je passe sur la 3e ligne.
    Le mode pas-à-pas me fait découvrir un TryLock que j'utilise ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    img4result.Canvas.TryLock;
    img4result.Picture.Assign(bmpDst); // mise à jour de l'image
    // img4result.Canvas.UnLock; // commenté pour éviter l'erreur
    Pas d'erreur mais j'ai toujours mon scintillement à la mise à jour, à croire que le lock n'a pas fonctionné. Pourquoi ? Mystère...

    Comment vous faites, vous, sous Windows ?
    (puisque pour une fois je n'ai pas de souci sous Linux)
    et je précise que j'ai DoubleBuffered := True dans le FormCreate.

    Merci,
    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
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Salut JP.

    Je n'ai pas vérifié, mais il est vraisemblable que le TImage utilise lock et unlock en interne.
    D'où ton erreur lors du Unlock.
    Tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if img4result.Canvas.Locked then img4result.Canvas.Unlock;
    Mais c'est amha sans intérêt pour le problème de scintillement.
    Ta mise à jour du TImage est-elle fréquente (plusieurs fois par seconde) ?

    Si ton image n'occupe qu'une partie de la fiche, tu pourrais essayer d'utiliser un TWinControl (p.ex. un tpanel) comme parent du TImage. Et tu ne double-bufférise que celui-ci.

    Amicalement
    Thierry

  3. #3
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut essayes de rajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TForm1 = class(TForm)
    public
      procedure EraseBackground(DC: HDC); override; 
     
    Inmplementation
     
    procedure TForm1.EraseBackground(DC: HDC); 
    begin
      // Ne fait rien
    end;
    Par contre il te faudra rafraichir le TImage à la mano, cad soit mettre "montimage.Invalidate" dans l'évènement "OnPaint" de la Form ou bien à la fin de tes traitements
    • "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
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Salut Thierry,

    Citation Envoyé par ThWilliam Voir le message
    Je n'ai pas vérifié, mais il est vraisemblable que le TImage utilise lock et unlock en interne.
    D'où ton erreur lors du Unlock.
    Tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if img4result.Canvas.Locked then img4result.Canvas.Unlock;
    Pas sûr qu'on se soit bien compris, là : j'ai une erreur de Unlock parce qu'il n'y a pas eu de Lock (sans que cela ne me soit signalé...)

    Bon, maintenant, si le TImage utilise ça en interne, z'auraient pas dû le publier, histoire de ne pas tenter les téméraires comme moi,

    Citation Envoyé par ThWilliam Voir le message
    Ta mise à jour du TImage est-elle fréquente (plusieurs fois par seconde) ?
    Pas du tout : l'utilisateur change des paramètres et clique sur "Appliquer" , il faudrait alors qu'il soit vraiment très rapide !


    Citation Envoyé par ThWilliam Voir le message
    Si ton image n'occupe qu'une partie de la fiche, tu pourrais essayer d'utiliser un TWinControl (p.ex. un tpanel) comme parent du TImage. Et tu ne double-bufférise que celui-ci.
    Les petites images tiendront toutes entières sur la fiche, , et sinon, le TImage est déjà sur un TPanel, passé à DoubleBuffered sans effet, et avec Lock/Unlock de son canvas sans erreur et sans effet, de ses bounds sans effet non plus...

    Citation Envoyé par BeanzMaster Voir le message
    Par contre il te faudra rafraichir le TImage à la mano, cad soit mettre "montimage.Invalidate" dans l'évènement "OnPaint" de la Form ou bien à la fin de tes traitements
    Des traitements impactant le TImage il n'y en a qu'un (à la fois), et c'est lui qui fait scintiller, donc si je mets quelque chose après, c'est plus la peine.

    Mais comme tu le disais dans l'autre fil,
    Citation Envoyé par BeanzMaster Voir le message
    Comme quoi rester simple est ce qui paye le mieux
    je la joue comme ça et là, la mise à jour est imperceptible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // fin de la mise à jour du bitmap de travail bmpDst
    //img4result.Picture.Assign(bmpDst); // mise à jour de l'image --> scintillement
    img4result.Canvas.Draw(0,0, bmpDst);
    Je crois que ça va rester comme ça, à moins que quelqu'un ait une idée fulgurante et lumineuse car, n'oublions pas, le mieux est l'ennemi du bien et là c'est bien.

    On va dire que ça ira comme ça.
    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

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 935
    Points : 9 246
    Points
    9 246
    Par défaut
    hello,
    Jipité tu peux jeter un oeil (et même les deux) sur le paragraphe Graphiques en mouvement - Comment éviter le clignotement dans le wiki freepascal.org Developing_with_Graphics
    Ami calmant, J.P (sans T)
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    En fait, il y avait tout un tas de petites raisons qui généraient une grosse pagaille brouillonne au niveau des TImage (source et cible avec les couleurs modifiées) qui sont portés chacun par un TPanel (avec procédures de centrage) lui-même porté par un TScrollbox.

    L'astuce est donc de blinder les calculs de resize comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        MainForm.BeginFormUpdate;
        FormResize(nil); // centre les panneaux
        MainForm.EndFormUpdate;
    Et là, franchement, plus de soucis !

    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: 0
    Dernier message: 25/05/2016, 14h36
  2. Réponses: 119
    Dernier message: 24/06/2015, 22h06
  3. Windows Phone 7 : mise à jour du Marketplace
    Par Hinault Romaric dans le forum Windows Phone
    Réponses: 14
    Dernier message: 15/03/2011, 12h05
  4. Windows installer et Mise à jours
    Par rangdalf dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 25/02/2008, 10h19

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