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

 Delphi Discussion :

Petite question TGraphicControls


Sujet :

Delphi

  1. #1
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut Petite question TGraphicControls
    Hello,

    EDIT : reformulation pour aller droit au coeur de problème : pour quelles raisons d'après vous, l'évènement paint d'un objet graphique peut ne pas être appelé lorsque qu'un autre objet le survole ?


    message initial:

    savez vous dans quels cas un objet de la classe TGraphicControl basique (simple canvas.rectangle dans son paint par exemple), peut se redessiner automatiquement lorsqu'une fenêtre d'une autre application (l'explorateur par exemple) passe au dessus de lui, et pour un autre object tout aussi simple ne pas se redessiner ?

    Sachant que le AOwner des deux objets serait le même (un TPanel tout bête) et attribué de la même manière dans le create (==> AOwner).

    Merci !

    EDIT: en image !!

    1) tout va bien... mais l'explorateur windows s'approche dangereusement...





    2) ha j'en étais sûr, il est venu se coller sur mon appli !!




    3) il repart, mais... damned !! Mes deux TGraphicControl ne se redessinent pas automatiquement de la même manière à un même évènement ! Il manque un bout du trait !!



  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Je crois que c'est la différence entre un TWinControl et un TGraphicControl.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  3. #3
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Je crois que c'est la différence entre un TWinControl et un TGraphicControl.
    Heu.... non, c'est pas le sujet, j'ai deux TGraphicControls, l'un se met à jour, l'autre pas, ils sont pareils de chez pareils... et leur aowner est un même TWinControl, en l'occurence un TPanel...

  4. #4
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    J'avais mal compris l'énoncé .

    De quel composant ces TGraphicControl héritent?
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  5. #5
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Linkin Voir le message
    J'avais mal compris l'énoncé .

    De quel composant ces TGraphicControl héritent?
    C'est une classe de base !

  6. #6
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    En fait, ça dépend un peu de l'humeur de Windows...

    Un composant se dessine lorsqu'il traitement le message WM_PAINT que lui envoie Windows.
    Lorsque tu "survoles" un composant avec un autre tu peux avoir différents cas de figure : Soit windows a conservé un bitmap du composant et le redessine directement, sans déclencher de WM_PAINT, soit si ce n'est pas le cas, windows va invalider la zone qui a été effacée et poster un message WM_PAINT à la fenêtre concernée.
    Ensuite, il faudra attendre que l'appli traite le message pour demander au composant de se redessiner.

    Il est difficile de te répondre plus précisément sans savoir ce que tu fais dans l'appli, comme son codés les composants...
    Il se peut qu'il y en ait un en double-buffered et pas l'autre, que l'appli soit occupé et ne traite pas les messages...

  7. #7
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    En fait, ça dépend un peu de l'humeur de Windows...

    Un composant se dessine lorsqu'il traitement le message WM_PAINT que lui envoie Windows.
    Lorsque tu "survoles" un composant avec un autre tu peux avoir différents cas de figure : Soit windows a conservé un bitmap du composant et le redessine directement, sans déclencher de WM_PAINT, soit si ce n'est pas le cas, windows va invalider la zone qui a été effacée et poster un message WM_PAINT à la fenêtre concernée.
    Ensuite, il faudra attendre que l'appli traite le message pour demander au composant de se redessiner.

    Il est difficile de te répondre plus précisément sans savoir ce que tu fais dans l'appli, comme son codés les composants...
    Il se peut qu'il y en ait un en double-buffered et pas l'autre, que l'appli soit occupé et ne traite pas les messages...

    En fait j'ai mis des espions dans les paint des deux composants, celui qui se redessine tout le temps, ben le paint est appelé tout le temps, l'autre absolument jamais... C'est désespérant des cas pareils.

  8. #8
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    En fait, ça dépend un peu de l'humeur de Windows...

    Un composant se dessine lorsqu'il traitement le message WM_PAINT que lui envoie Windows.
    Lorsque tu "survoles" un composant avec un autre tu peux avoir différents cas de figure : Soit windows a conservé un bitmap du composant et le redessine directement, sans déclencher de WM_PAINT, soit si ce n'est pas le cas, windows va invalider la zone qui a été effacée et poster un message WM_PAINT à la fenêtre concernée.
    Ensuite, il faudra attendre que l'appli traite le message pour demander au composant de se redessiner.

    Il est difficile de te répondre plus précisément sans savoir ce que tu fais dans l'appli, comme son codés les composants...
    Il se peut qu'il y en ait un en double-buffered et pas l'autre, que l'appli soit occupé et ne traite pas les messages...
    j'avais tout le temps cru que windows traité tout les messages ! ou plutôt disons que je n'ai pas saisie le premier passage de la réponse de maître Franck SORIANO .
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Citation Envoyé par peter27x Voir le message
    C'est une classe de base !
    Bien sûr, mais le composant que tu utilises, non. Donc soit tu as codé des parties toi-même directement soit tu es parti d'un descendant de TGraphicControl.

    Dans le premier cas, il faut absolument le code, dans le seond, on pouvait tester sans.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  10. #10
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Bien sûr, mais le composant que tu utilises, non. Donc soit tu as codé des parties toi-même directement soit tu es parti d'un descendant de TGraphicControl.

    Dans le premier cas, il faut absolument le code, dans le seond, on pouvait tester sans.
    J'ai viré la classe en question !

    Je bosse désormais directement avec TGraphicControl et me contente de surcharger le paint... c'est plus cool comme ça... piouuuufff....

  11. #11
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    J'ai mis en image le pb dans le sujet de la file !

  12. #12
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Sur un exemple simple (2 classes: rectangle, ligne avec chiffre), je n'arrive pas à reproduire le problème.

    Je mets le code de dessin (basique) que j'ai mis pour afficher la ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      inherited;
      Canvas.MoveTo(0,0);
      Canvas.LineTo(Width,Height);
     
      Canvas.TextOut(Width div 2, Height div 2, '1');
    Il y a sûrement une interférence entre deux codes. Donc pour pouvoir aller plus loin, il faudrait je pense au moins le code de l'affichage de l'objet ligne.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  13. #13
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Sur un exemple simple (2 classes: rectangle, ligne avec chiffre), je n'arrive pas à reproduire le problème.

    Je mets le code de dessin (basique) que j'ai mis pour afficher la ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      inherited;
      Canvas.MoveTo(0,0);
      Canvas.LineTo(Width,Height);
     
      Canvas.TextOut(Width div 2, Height div 2, '1');
    Il y a sûrement une interférence entre deux codes. Donc pour pouvoir aller plus loin, il faudrait je pense au moins le code de l'affichage de l'objet ligne.
    Il ne passe même pas dans mon paint !!

    Et mettre le code, le code de quoi ? Du paint ? Inutile il passe même pas dedans !

    Côté appelant, mettre quoi ? J'ai 40.000 lignes de code !!


  14. #14
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Quand un Paint n'est pas appelé c'est que normalement un autre composant "opaque" cache ce composant.

    Mais ce n'est pas cohérent, dans ce cas, il ne devrait pas être affiché la première fois.
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  15. #15
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Quand un Paint n'est pas appelé c'est que normalement un autre composant "opaque" cache ce composant.

    Mais ce n'est pas cohérent, dans ce cas, il ne devrait pas être affiché la première fois.
    Haaa ! Ca se rapproche d'une des pistes que j'ai en tête, car en fait le trait que l'on voit n'est pas "entier", il part du centre des deux dessins de style "maisonnette", et est "en dessous"... hum hum hum... bon de toute façon le pb n'est ni très grave, ni bloquant...

  16. #16
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Bon, ça a l'air d'être ça, j'ai changé les coordonnées du trait, je l'ai fait tout petit dans un coin de l'écran, et là le paint est bien invoqué !

    Voilà, simple histoire de guerres de territoires inter TGraphicControls... Pas glop.

    EDIT : FAUX !!!! Le pb venait du fait qu'à certaines conditions le TGraphiccontrol.visible était positionné à false... mais que malgré le fait que celui ci affichait ensuite le trait de son canvas, il était en réalité toujours à visible=false ! D'où absence d'invocation du paint ! Le visible n'était jamais remis à true, mais pourtant il s'affichait bien !!

  17. #17
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Bon courage pour la suite! (vu qu'apparemment tu reprends du code, on a des fois de sacrées surprises)
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  18. #18
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Linkin Voir le message
    Bon courage pour la suite! (vu qu'apparemment tu reprends du code, on a des fois de sacrées surprises)
    Non, non, je sais reconnaitre mes erreurs et pas les reporter en permanence sur du "vieux" code, cette partie là c'était du "moi" à 100%... mea culpa...

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

Discussions similaires

  1. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  2. [CR8.5] petite question ..
    Par mcrocher dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 13/09/2004, 15h04
  3. Une petite question
    Par Etienne1 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/08/2004, 16h19
  4. [FOREIGN KEY] petite question bete ...
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 16h35
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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