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 :

Qui peut m'expliquer


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    Par défaut Qui peut m'expliquer
    ce que fait ce code:

    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
    32
     
    type
      TImagePerso = class (TGraphicControl)
      private
        FOnPaint: TNotifyEvent;
      protected
        procedure Paint; override;
      public
        constructor Create(AOwner:TComponent); override;
        destructor Destroy; override;
        property OnPaint: TNotifyEvent write FOnPaint;
      end;
     
     
    implementation
     
    constructor TImagePerso.Create(AOwner:TComponent);
    begin
      inherited create(AOwner);
      FOnPaint:=nil;
    end;
     
    destructor TImagePerso.Destroy;
    begin
      inherited destroy;
    end;
     
    procedure TImagePerso.Paint;
    begin
      if assigned(FOnPaint) then
        FOnPaint(self);
    end;

    Le onPaint est redirigé vers une procédure de dessin du canvas lors de la création d'objet de ce type... Et tout fonctionne très bien !

    Mais je comprends pas trop le micmac sur la redirection du paint là...

    Vous comprenez vous ?

    J'aimerais que seuls ceux qui sont sûr de comprendre le code me répondent.

    Merci.

    EDIT : je pige mieux ce que fait le code en fait depuis 5 minutes... mais c'est je crois surtout l'utilisation des TNotifyEvent qui me trouble, je maitrise pas encore assez la chose.

  2. #2
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Salut,
    ya pas vraiment grand chose à comprendre...
    c'est juste un implémentation d'un evenement OnPaint en l'occurence.

  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
    Par défaut
    Citation Envoyé par Kaféine Voir le message
    Salut,
    ya pas vraiment grand chose à comprendre...
    c'est juste un implémentation d'un evenement OnPaint en l'occurence.
    oui comme mis dans le "EDIT" en fin du post après coup, je commence moi aussi à piger le truc.

  4. #4
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    plutot que TNotifyEvent, tu peux créer un TOnPaintEvent afin d'avoir le canvas et le rectangle par exemple

    genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TOnPaintEvent = procedure(Canvas: TCanvas; ARect: TRect) of object;

  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
    Par défaut
    Citation Envoyé par Kaféine Voir le message
    plutot que TNotifyEvent, tu peux créer un TOnPaintEvent afin d'avoir le canvas et le rectangle par exemple

    genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TOnPaintEvent = procedure(Canvas: TCanvas; ARect: TRect) of object;
    Je vois pas trop comment tu places ça dans le code ?

    Pour ce qui est du canvas j'y accède sans problème avec le code initial ceci dit.

  6. #6
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    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
    32
    33
    34
    35
     
     
    type
      TOnPaintEvent = procedure(Sender: TObject; ACanvas: TCanvas; ARect: TRect) of object;
     
      TImagePerso = class (TGraphicControl)
      private
        FOnPaint: TOnPaintEvent ;
      protected
        procedure Paint; override;
      public
        constructor Create(AOwner:TComponent); override;
        destructor Destroy; override;
        property OnPaint: TOnPaintEvent read FOnPaint write FOnPaint;
      end;
     
     
    implementation
     
    constructor TImagePerso.Create(AOwner:TComponent);
    begin
      inherited create(AOwner);
      FOnPaint:=nil;
    end;
     
    destructor TImagePerso.Destroy;
    begin
      inherited destroy;
    end;
     
    procedure TImagePerso.Paint;
    begin
      if assigned(FOnPaint) then
        FOnPaint(self, Canvas, ClientRect);
    end;

    Pour ce qui est du canvas j'y accède sans problème avec le code initial ceci dit.
    oui c'est juste pour t'aider à comprendre

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Je me permet d'épurer un peu le code...
    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
     
    type
      TImagePerso = class (TGraphicControl)
      private
        FOnPaint: TNotifyEvent;
      protected
        procedure Paint; override;
      public
        property OnPaint: TNotifyEvent write FOnPaint;
      end;
     
    procedure Register;
     
    implementation
     
    procedure TImagePerso.Paint;
    begin
      if assigned(FOnPaint) then
        FOnPaint(self);
    end;
     
    procedure Register;
    begin
      RegisterComponents('Samples',[TImagePerso]);
    end;
    ...et d'ajouter une méthode Register afin de recenser ce composant dans la palette d'outils car c'est le seul cas ou cela pourrait avoir un sens à mon avis

    et TImagePerso est alors grosso-modo un TPaintBox

    Si c'est pour créer manuellement le composant, je ne vois pas l'intérêt de passer par un événement au lieu de simplement surcharger le Paint

    Mais comme TPaintBox fait déjà la même chose, ce composant tel qu'il est là ne présente aucun intérêt
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    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
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ...
    Mais comme TPaintBox fait déjà la même chose, ce composant tel qu'il est là ne présente aucun intérêt
    Salut,

    en fait c'est un composant existant de l'appli dont je suis reparti pour créer la nouvelle, alors étant junior j'ai naturellement pensé qu'il avait été bien pensé.
    Après en effet, je commence moi même à me demander quel est l'intérêt de ce TIMagePerso, il faut savoir qu'ensuite deux autres classes de dessin différents héritent de ce TImagePerso... Et cette gestion des paint façon spaguetti à travers un double héritage... peut être est ce là la source de mes problèmes de paint qui ne marchent pas dans tous les cas... (cf autre file de ce jour).

    EDIT, je viens d'aller voir TPaintBox dans le F1... hum, c'est exactement ce qu'il me faut finalement...

  9. #9
    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
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    Je me permet d'épurer un peu le code...
    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
     
    type
      TImagePerso = class (TGraphicControl)
      private
        FOnPaint: TNotifyEvent;
      protected
        procedure Paint; override;
      public
        property OnPaint: TNotifyEvent write FOnPaint;
      end;
     
    procedure Register;
     
    implementation
     
    procedure TImagePerso.Paint;
    begin
      if assigned(FOnPaint) then
        FOnPaint(self);
    end;
     
    procedure Register;
    begin
      RegisterComponents('Samples',[TImagePerso]);
    end;
    ...et d'ajouter une méthode Register afin de recenser ce composant dans la palette d'outils car c'est le seul cas ou cela pourrait avoir un sens à mon avis

    et TImagePerso est alors grosso-modo un TPaintBox

    Si c'est pour créer manuellement le composant, je ne vois pas l'intérêt de passer par un événement au lieu de simplement surcharger le Paint

    Mais comme TPaintBox fait déjà la même chose, ce composant tel qu'il est là ne présente aucun intérêt

    2° réponse à Paul, en fait je n'ai pas pu mettre en place TPaintBox car il veut comme parent un TWidgetControl, or mon Panel n'en est pas un. J'ai donc voulou le "caster" en TWidgetControl, mais j'ai alors dû ajouter un "uses QControls", et là ça a commencé à planter dans tous les sens, le compilo m'indiquant des messages d'erreurs incompréhensibles relatif à des déclarations déjà existantes (et absolument pas modifiées évidemment) mais qu'il ne reconnaissait plus, juste en ajoutant Qcontrols dans les uses !

    J'ai essayé de corriger avec 2 ou 3 tentatives, et, devant la liste des erreurs (d'après moi incohérentes), j'ai abandonné le TPaintBox.

    Par contre, j'ai gardé l'idée initiale que tu m'as filée, et ai donc remplacé le TImagePErso directement par le TGraphicControl, en overridant tout simplement le paint, et ça marche... sans avoir à me prendre le chou avec TOnPaint, redirections spaguetti, etc... C'est déjà ça, le code est plus clair désormais.

    Par contre, ce foutu dessin de trait ne se met toujours pas à jour quand une fenêtre le survole... GRRRRRRRRR

  10. #10
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    QControls et TWidgetControl c'est pour une application CLX...pas VCL...est-ce ton cas ?

    Tu as un autre TPaintbox dans la VCL
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  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
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    QControls et TWidgetControl c'est pour une application CLX...pas VCL...est-ce ton cas ?

    Tu as un autre TPaintbox dans la VCL
    ARGGG c'était ça !!?? Je viens de refaire le test, via f1, pour TwidgetControl l'aide delphi me propose uniquement la version clx !!!

    C'est quoi la version VCL, Controls ? QQControls ?

    EDIT: de toute façon "trop tard", je viens de mettre TGraphiccontrol en "direct" dans mes deux classes qui héritaient de TImagePerso... avec override tout bête du paint... mais ça change rien au pb, voir l'explication en image que je viens de mettre dans l'autre file sur les TGraphicControls.

  12. #12
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    TPaintBox est dans ExtCtrls, mais il suffit d'en poser une sur la fiche pour que Delphi ajoute l'unité dans le uses.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. Qui peut m'expliquer ?
    Par Shankara dans le forum VBA Access
    Réponses: 3
    Dernier message: 13/11/2011, 21h38
  2. QUi peut m'expliquer cette commande: myisamchk -r log_visitor_info.MYI
    Par guillaume7684 dans le forum Administration
    Réponses: 2
    Dernier message: 26/12/2010, 11h13
  3. [UBUNTU] Qui peut m'expliquer ce qu'est un live cd ?
    Par Jihed Amine Maaref dans le forum Ubuntu
    Réponses: 21
    Dernier message: 29/08/2006, 21h04
  4. qui peut m'expliquer ce script?
    Par nouna dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 22
    Dernier message: 20/10/2005, 22h33

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