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

Langage Delphi Discussion :

regroupement de propriétés - détecter le changement


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut regroupement de propriétés - détecter le changement
    Bonjour à tous,

    voilà mon problème :

    je veux créer un composant dérivé de TPanel me permettant une personnalisation de son dessin.
    J'avais dans un premier temps créé de nouvelles propriétés published mais j'ai vite été fatigué de les chercher dans l'editeur de propriétés parmi celles qui existent dejà.
    J'ai donc voulu créer un groupe qui contiendrait toutes les nouvelles options, comme par expl la propriété Option du stringgrid qui va contenir goEditing etc...

    Pour ce faire j'ai créé une classe avec mes différentes options (types variés), elle-même déclarée comme propriété dans ma classe dérivée de TPanel.

    Tout va bien, mes options sont bien regroupées dans un même intitulé dans l'editeur, une fois le composant installé.

    Ce que je ne comprends pas, c'est que lorsque je modifie une de ces options la procedure write de la propriété concernée de la classe des options est bien exécutée alors que la procedure write de la classe parent (le Tpanel) ne l'est pas. Du coup je ne peux pas demander la mise à jour du dessin.

    En attendant j'ai trouvé une solution en utilisant une variable contenant le parent, mais je suis sur qu'il y a plus propre (et ça ne me dit pas ce que j'ai raté )

    Voici le code simplifié (pas toutes les propriétés), pour plus de clarté :
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    unit PanelBG;
     
     
    interface
     
    uses
      SysUtils, windows, Classes, Controls, ExtCtrls, Graphics,dialogs ;
     
      type
     
        TPBGoptions = class
        private
          FParent:Tobject; // <--- solution intermédiaire
          FColorStart: Tcolor;
          FColorEnd: Tcolor;
          FColorMid: Tcolor;
     
     
          procedure SetColorEnd(val: Tcolor);
          procedure SetColorMid(val: Tcolor);
          procedure SetColorStart(val: Tcolor);
     
     
        public
          constructor Create(AOwner: TComponent);
     
        published
          property ColorStart: Tcolor read FColorStart write SetColorStart ;
          property ColorMid: Tcolor read FColorMid write SetColorMid;
          property ColorEnd: Tcolor read FColorEnd write SetColorEnd ;
     
      end;
     
        TPanelBG = class(TPanel)
        private
          FPBGoptions: TPBGoptions;
          procedure SetPBGoptions (val: TPBGoptions);
        Protected
          procedure Paint; override;
        Public
          constructor Create(AOwner: TComponent); override;
        published
          property BGOptions:TPBGoptions read FPBGoptions write SetPBGoptions ;// <---- cette procédure n'est pas exécutée !
        end;
     
    procedure Register;
     
     
    implementation
     
     
     
    procedure Register;
    begin
      RegisterComponents('Samples', [TPanelBG]);
    end;
     
     
    { TPBGoptions }
    constructor TPBGoptions.Create(AOwner: TComponent);
    begin
      FParent:=Aowner; <--- solution intermédiaire
      FColorStart:=clwhite;
      FColorMid:=clSilver;
      FColorEnd:=clBlack;
    end;
     
    procedure TPBGoptions.SetColorStart(val: Tcolor);
    begin
      if val<>FColorStart then begin
        FColorStart:=val;
        TPanelBG(FParent).invalidate;    // <--- solution intermédiaire
      end;
    end;
    procedure TPBGoptions.SetColorMid(val: Tcolor);
    begin
      if val<>FColorMid then begin
        FColorMid:=val;
        TPanelBG(FParent).invalidate;    //<--- solution intermédiaire
      end;
    end;
    procedure TPBGoptions.SetColorEnd(val: Tcolor);
    begin
      if val<>FColorEnd then begin
        FColorEnd:=val;
        TPanelBG(FParent).invalidate;    //<--- solution intermédiaire
      end;
    end;
     
     
    { TPanelBG }
     
    constructor TPanelBG.Create(AOwner: TComponent);
    begin
      inherited;
      DoubleBuffered:=true;
      FPBGoptions:=TPBGoptions.Create(self);
      with FPBGoptions do begin
     
        ColorStart:=clSilver;
        ColorMid:=clgray;
        ColorEnd:=clwhite;
     
      end;
     
    end;
     
    procedure TPanelBG.Paint;
    var p1,fo:integer;
        bmpT:TBitmap;
    begin
      ...
     
     
    end;
     
    procedure TPanelBG.SetPBGoptions(val: TPBGoptions); // <---- cette procédure n'est pas exécutée !
    begin
     
      if val<>FPBGoptions then begin
        FPBGoptions:=val;
     
        invalidate;
        Repaint;
      end;
    end;
     
     
    end.

    merci pour votre aide,
    David

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 710
    Points : 25 596
    Points
    25 596
    Par défaut
    Ne confond pas le Write SetPBGoptions qui n'est appelé que lorsque tu affecte un TPBGoptions

    si tu écris

    PanelBG.BGOptions := OtherOptions;cela correspond à PanelBG.SetBGOptions(OtherOptions);

    si tu écris PanelBG.BGOptions.ColorStart := clRed; cela correspond à PanelBG.FPBGoptions.SetColorStart(clRed);.


    Dans SetColorStart, SetColorMid ... tu dois faire une Notification (voir la TList pour l'idée) au Parent pour lui indiquer la propriété qui à changé (une énumération serait propre !)

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Merci pour ta réponse

    PanelBG.BGOptions := OtherOptions;cela correspond à PanelBG.SetBGOptions(OtherOptions);

    si tu écris PanelBG.BGOptions.ColorStart := clRed; cela correspond à PanelBG.FPBGoptions.SetColorStart(clRed);.
    pour ça, c'est ok.

    Simplement je m'attendais à ce que le changement de l'un des membres de FPBGoptions provoque un appel à TPanelBG.SetPBGoptions;

    Mais apparemment c'est une uniquement une affectation à l'objet qui le permet.

    Dans SetColorStart, SetColorMid ... tu dois faire une Notification (voir la TList pour l'idée) au Parent pour lui indiquer la propriété qui à changé (une énumération serait propre !)
    Ok, donc au final je dois faire remonter l'info au parent.
    Je vais essayer de m'inspirer de TMargin (controls) qui est utilisé dans les propriétés de TPanel justement, avec son FOnChange: TNotifyEvent;
    Quant au Tlist je vais encore y regarder de plus près car à première vue je n'ai pas tout compris sur sa manière de notifier (comment, quoi et à qui)

    Autrement, j'aurais encore aimé ton avis sur ma solution "maison"

    TPanelBG(FParent).invalidate;
    est-ce envisageable ou me la déconseilles-tu ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 710
    Points : 25 596
    Points
    25 596
    Par défaut
    Invalidate, c'est pour forcer le dessin complet !
    Comme tu changes une couleur, cela semble cohérent !

  5. #5
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    c'est peut etre parce que tu as simplifié le code que tu nous met, mais si tu veux que les couleurs soient sauvées dans le dfm, il faut que ton TPBGoptions soit TPersistent. Dans ce cas, si tu fais heriter TPBGoptions de TControl (ou TComponent peut etre), tu n'a plus besoin de gerer toi meme le FParent si tu fais un triuc comme ca :
    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
     
      TPBGoptions = class(TControl)
        ...
      end;
    ...
    constructor TPanelBG.Create(AOwner: TComponent);
    begin
      inherited;
      FOptions := TPBGoptions.Create(Self); // le owner du TPBGoptions est un TPanelBG
    end;
    ...
    procedure TPBGoptions.SetMidColor(...);
    begin
      ...
      if (Owner <> nil) and (Owner is TControl) then
        TControl(Self.Owner).Invalidate;
    end;

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    si tu veux que les couleurs soient sauvées dans le dfm, il faut que ton TPBGoptions soit TPersistent
    ça c'était mon autre problème ! Tu viens de le résoudre avant que je ne poste

    Encore merci à tous deux pour vos conseils

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

Discussions similaires

  1. [M1][W1][N1][D1] Comment détecter un changement de résolution?
    Par jazz matazz dans le forum Contribuez
    Réponses: 6
    Dernier message: 04/03/2006, 22h20
  2. [TQuery] Détecter le changement de champ
    Par sjrd dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/04/2005, 18h20
  3. [Langue Clavier] Comment détecter le changement de la langue ?
    Par Fares BELHAOUAS dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 30/09/2004, 20h26
  4. Comment détecter un changement du réglage de voume sonore ?
    Par mjlub dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 09/01/2004, 18h43

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