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 :

Composant visuel. Comportement de Resize avec ProcessMessage [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    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 Composant visuel. Comportement de Resize avec ProcessMessage
    Bonjour, à tous. Petites questions :

    - Est-ce normal que la procedure Resize de composants visuels (hérités de TCustomControl) soit appelée à chaque appel de Application.ProcessMessage. Alors qu'il n'y a aucun changement de taille du composant lui même ou de la fenêtre qui le contient, d'aucunes manières ?

    - Si oui ou non, est que la procedure Invalidate appel ( à un moment ou un autre) Resize (ou une des procedures qui va avec) ?

    Pourquoi toutes ces questions. Lors du chargement d'une image j'appel un évènement "OnProgress" (je vous laisse deviner pourquoi faire). Qui appel à chaque ligne de l'image lue Application.ProcessMessage afin que mon TProgressBar avance. Du coup cet appel réduit considérablement les performances. Imaginez un image de plus de 3000 pixel en hauteur. Chaque appel de Resize appel Invalidate qui lui même appel Paint et tout le bazar dedans. Pourquoi ? pour rien.

    Et j'ai ainsi remarqué grâce à des "logs", ce comportement qui ne devrai pas se produire normalement, non ? (Resize c'est bien quand la taille change, non ?).

    PS : C'est juste pour savoir, car j'ai déja contourné le problème.

    A+
    • "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
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Je te suggère dans un premier temps de n'appeler la modification de la barre de progression que toutes les x lignes.
    Ou bien de tenter un ProgressBar.Repaint à chaque fois, et un ProcessMessages de temps en temps seulement, pour que l'appli réagisse.
    Mais je n'ai pas d'explication sur l'appel du Resize.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  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
    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    Je te suggère dans un premier temps de n'appeler la modification de la barre de progression que toutes les x lignes.
    Ou bien de tenter un ProgressBar.Repaint à chaque fois, et un ProcessMessages de temps en temps seulement, pour que l'appli réagisse.
    Bonjour,
    Toutes les x lignes c'est ce que j'avais fait (tous les 10%) mais idem sur une grande image, le nombre d'appel est beaucoup trop important.
    Je n'avais pas pensé a "Repaint".

    Citation Envoyé par tourlourou Voir le message
    Mais je n'ai pas d'explication sur l'appel du Resize.
    Dommage Sous Delphi ce comportement est-il identique ou pas ?

    J'ai jeté un oeil vite fait dans la LCL, je suis remonté jusqu'a TWidgetxxx sans rien remarqué de spécial. C'est dur de remonter un code complexe, dans lequel on n'a pas écrit une seule ligne.

    - Si oui ou non, est que la procedure Invalidate appel ( à un moment ou un autre) Resize (ou une des procedures qui va avec) ?
    En fait c'est Resize qui appel Invalidate, comme je l'avais noté précédemment. (après cette question en plus )

    Comme je l'avais dis j'ai contourné par le biais d'une variable booléenne dans ma procedure Paint.

    Cela serai quand même bon de savoir si ce comportement est "Normal" afin de faire remonter l'info à l'équipe de Lazarus, le cas échéant. Pour moi il n'est pas logique.

    Merci
    • "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 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
    Bonjour à tous, alors voila j'ai trouvé, j'ai jeté un oeil dans les les sources de la LCL afin de comprendre. Et j'y ai découvert la propriété en lecture seule "IsResizing" (dans TWinControl)
    La LCL utilise un systeme optimisé pour le rafraichissement des compos visuel afin de limiter les appels à "Invalidate et Paint"

    Donc voila si vous désirez comme moi réaliser un petit compo graphique descendant de TCustomControl et que vous ayez besoin de surcharger la procedure Resize. Alors ce petit "IsResizing" permet de savoir si oui ou non les dimensions du "controle" ont changé.

    Pas besoin d'appeler"Invalidate ou paint" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TGLZCustomImageView.Resize;
    begin
      if not(IsResizing) then
      begin
        FBackBuffer.SetSize(ClientWidth,ClientHeight);
        If Transparent then BackBuffer.Clear(clrTransparent) else BackBuffer.Clear(ColorToGLZColor(Color));
      end;
      Inherited Resize;
    end;
    A+

    EDIT : Oups, je suis allé un peu trop vite en besogne. Pour faire ce que je souhaite il faut que je passe par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TGLZCustomImageView.ChangeBounds(ALeft, ATop, AWidth, AHeight: integer; KeepBase: boolean);
    begin
      FBackBuffer.SetSize(ClientWidth,ClientHeight);
      If Transparent then BackBuffer.Clear(clrTransparent) else BackBuffer.Clear(ColorToGLZColor(Color));
    //  FNeededUpdate := True;
      inherited ChangeBounds(ALeft, ATop, AWidth, AHeight, KeepBase);
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Alors ce petit "IsResizing" permet de savoir si oui ou non les dimensions du "contrôle" ont changé.
    Salut,

    t'es sûr de ton coup, là ?

    Parce qu'en termes de traduction, j'émets un doute, surtout si je compare avec l'événement OnChanging du TPageControl par exemple : l'aide (oui, "l'aide", je sais, je sais ...) dit
    OnChanging - event handler while Tab is changing
    du coup je comprendrais IsResizing comme
    event handler while component is resizing
    , en cours de redimensionnement, quoi.

    Teste bien dans tous les sens,
    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 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
    Citation Envoyé par Jipété Voir le message
    Salut,

    t'es sûr de ton coup, là ?

    Parce qu'en termes de traduction, j'émets un doute, surtout si je compare avec l'événement OnChanging du TPageControl par exemple : l'aide (oui, "l'aide", je sais, je sais ...) dit du coup je comprendrais IsResizing comme , en cours de redimensionnement, quoi.

    Teste bien dans tous les sens,
    Salut c'est bien ça, tu as raison, je m'étais mépris. Mais alors pourquoi lorsque je surcharge la procedure Resize celui ci est à False ? Là je comprend pas bien. On est toujours entrain de "redimensionner" le "control". Un comportement normal voudrais que IsResizing soit à TRUE, non ?
    Je n'ai pas regardé ou exactement et quand IsResizing est définie, et même si elle l'ai d'ailleurs.
    C'est pourquoi j'ai rédité mon post après avoir regardé dans une de mes vieux code (le Panel dans les compos que j'avais posté ici, dans le forum il y a quelques temps déja).
    • "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

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

Discussions similaires

  1. pb avec composant visuel créé dynamiquement
    Par richard038 dans le forum Composants VCL
    Réponses: 9
    Dernier message: 12/08/2005, 09h59
  2. [Creation composant visuel] Problème avec le focus
    Par Ingham dans le forum Composants VCL
    Réponses: 9
    Dernier message: 23/09/2004, 16h59
  3. est il possible de serialiser un composant visuel ?
    Par uliss dans le forum C++Builder
    Réponses: 12
    Dernier message: 15/04/2004, 10h22
  4. Réponses: 7
    Dernier message: 08/08/2003, 18h09

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