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

Composants VCL Delphi Discussion :

Erreur: Control " has no parent windows


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 22
    Points : 22
    Points
    22
    Par défaut Erreur: Control " has no parent windows
    Salut

    j'essaie de developper un composant basé sur TgraphicControl.
    Le code se compile correctement, et le composant est correctement installé dans un nouvel onglet.
    Par contre quand j'essaie de metttre ce composant dans une feuille, voici le message d'erreur que j'obtiens: -- Control " has no parent windows --
    Est ce que qulqu'un peut m'aider ?
    J'ai remarqué que le message d'erreur n'apparait que si la procedure drawComposant est appelée dans le constructor Create.
    Le but est que le composant se dessine avec (par exemple) un fond noir et un cadre. Si j'enleve drawComposant du constructeur, je n'ai pas de message d'erreur, mais le composant qui se dessine alors dans la feuille n'a pas de contour, bref il est difficile de le visualiser.

    Merci

    Voici le bout de code simplifié qui presente le probleme:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    unit test ;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls  ;
     
     
    type
      TTest = class(TGraphicControl)
      private
        P_ComponentBackGroundColor : TColor;
        procedure SetCpBckgColor(Value:TColor) ;
      protected
        procedure DrawComposant;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property CpBckgColor      : TColor    read P_ComponentBackGroundColor write SetCpBckgColor ;
      end;
     
    procedure Register;
     
    implementation
     
    procedure TTest.DrawComposant;
    begin
          // creation Background du composant
          self.Canvas.Brush.Color := P_ComponentBackGroundColor;
          self.Canvas.FillRect(Rect(0,0,self.Width,self.Height));
          // --------------------------------
          invalidate;
    end;
     
    procedure TTest.SetCpBckgColor (Value:TColor);
    begin
       if P_ComponentBackGroundColor <> value then
       begin
          P_ComponentBackGroundColor := Value ;
          DrawComposant ;
       end;
    end;
     
    constructor TTest.Create(AOwner: TComponent);
    begin
      inherited Create (AOwner);
      P_ComponentBackGroundColor := clBlack ;
      Height := 100;
      Width := 400;
      DrawComposant;
    end;
     
    destructor TTEST.Destroy;
    begin
      inherited Destroy;
    end;
     
    procedure Register;
    begin
      RegisterComponents('Tests', [TTEST]);
    end;
     
    end.

    [Balise [code] rajoutée par Seb]
    [Pensez-y vous-même à l'avenir. Merci.]

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Il faut que tu supprimes le DrawComposant du Create, car tu ne peux pas dessiner un composant non créé.

    Le dessin doit être effectué en surchargeant la méthode paint.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      ...
      protected
        procedure Paint; override;
      ...
     
    Procedure TTEST.Paint; 
    begin 
      DrawComponent;
    end;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 22
    Points : 22
    Points
    22
    Par défaut
    Merci pour le conseil Nono40.
    Maintenant, je n'ai plus le message d'erreur, par contre le resultat n'est pas joli à voir .
    La surface du composant clignote, et le cpu = 100 %
    Y a t il moyen de ne pas avoir ce probleme ?
    Merci
    bob

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Dans le DrawComponent tu fais un Invalidate, donc tu demandes au composant de se redessiner après s'être dessiné... Et ainsi de suite...

    D'autre part, quand tu changes une propriété, il vaut mieux faire un Invalidate, car si tu en changes plusieurs à la suite le composant ne sera dessiné qu'une seule fois.

    Le self. est inutile aussi.

    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
    procedure TTest.DrawComposant; 
    begin 
      // creation Background du composant 
      Canvas.Brush.Color := P_ComponentBackGroundColor; 
      Canvas.FillRect(Rect(0,0,Width,Height)); 
    end; 
     
    procedure TTest.SetCpBckgColor (Value:TColor); 
    begin 
      if P_ComponentBackGroundColor <> value then 
      begin 
        P_ComponentBackGroundColor := Value ; 
        Invalidate; 
      end; 
    end;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 22
    Points : 22
    Points
    22
    Par défaut [resolu]
    Ca marche.
    Merci pour ton aide

  6. #6
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Pour mettre [résolu], il faut cliquer sur le bouton en bas à gauche de la page .
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

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

Discussions similaires

  1. Erreur A circular control reference has been made.
    Par staticx dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/01/2013, 14h31
  2. Système controle parental Windows
    Par Nowwis dans le forum jQuery
    Réponses: 0
    Dernier message: 12/08/2011, 12h26
  3. Réponses: 10
    Dernier message: 13/10/2008, 18h07
  4. Erreur 82 lors d'installations sous windows XP
    Par steeves5 dans le forum Windows XP
    Réponses: 2
    Dernier message: 14/12/2005, 17h33
  5. [VB 5.0] Controler le son du lecteur windows média
    Par Fullmetal dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 24/09/2005, 07h41

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