1. #1
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 293
    Points : 588
    Points
    588

    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

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    2 933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 2 933
    Points : 7 970
    Points
    7 970

    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 10.1 Berlin Starter Edition - CodeTyphon 6.15 sous Win 7 et 5.20 sous Ubuntu 14.04
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 293
    Points : 588
    Points
    588

    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

  4. #4
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 293
    Points : 588
    Points
    588

    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

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 6 081
    Points : 8 332
    Points
    8 332

    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
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : septembre 2015
    Messages : 293
    Points : 588
    Points
    588

    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

+ 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, 10h59
  2. [Creation composant visuel] Problème avec le focus
    Par Ingham dans le forum Composants VCL
    Réponses: 9
    Dernier message: 23/09/2004, 17h59
  3. est il possible de serialiser un composant visuel ?
    Par uliss dans le forum C++Builder
    Réponses: 12
    Dernier message: 15/04/2004, 11h22
  4. Réponses: 7
    Dernier message: 08/08/2003, 19h09

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