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 :

Formatage de texte dans un Panel


Sujet :

Composants VCL Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Formatage de texte dans un Panel
    Existe-t-il un exemple qui démontre comment ecrire sur un Tpanel comme on le souhaite.

    Disons que je mets un panel sur un form assez grand.
    Dans la caption je veux ecrire sur plusieurs lignes et commencé à ecrire en haut à gauche.

    Quoi qu'il arrive le caption reste au milieu.

    Il y a-t-il la possibilité de le faire ?

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Citation Envoyé par BuzzLeclaire Voir le message
    Existe-t-il un exemple qui démontre comment ecrire sur un Tpanel comme on le souhaite.

    Disons que je mets un panel sur un form assez grand.
    Dans la caption je veux ecrire sur plusieurs lignes et commencé à ecrire en haut à gauche.

    Quoi qu'il arrive le caption reste au milieu.

    Il y a-t-il la possibilité de le faire ?
    A ma connaissance, non, ce n'est pas possible ...
    Il te faudra ruser avec un label à placer dans le panel ... (align=alClient)
    J'espère que c'est ce que tu désires faire.
    Sinon, il nous faudrait plus d'infos sur ce que tu veux réaliser

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bonjour et merci de vous y intérresser.

    Je créer dynamiquement des Panels dont le parent est un StringGrid.

    MEs panels peuvent avoir des dimensions différente sur ce StringGrid.
    Le texte que je voudrais ecrire pourrais etre similaire à ce que donne un TMemo. Mais je ne peux pas utiliser un TMemo car je n'ai pas acces au canvas n'y au paint d'un TMemo, d'où l'utilisation d'un TPanel.

    Maintenant si j'utilise un Label par dessus mon Tpanel, etant donné que je créer tout cela dynamiquement il y a-t-il des risques, des problème lors qe la création dynamique de 2 objet en même temps ?

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Re,
    Citation Envoyé par BuzzLeclaire Voir le message
    Bonjour et merci de vous y intérresser.

    Je créer dynamiquement des Panels dont le parent est un StringGrid.

    MEs panels peuvent avoir des dimensions différente sur ce StringGrid.
    Le texte que je voudrais ecrire pourrais etre similaire à ce que donne un TMemo. Mais je ne peux pas utiliser un TMemo car je n'ai pas acces au canvas n'y au paint d'un TMemo, d'où l'utilisation d'un TPanel.

    Maintenant si j'utilise un Label par dessus mon Tpanel, etant donné que je créer tout cela dynamiquement il y a-t-il des risques, des problème lors qe la création dynamique de 2 objet en même temps ?
    Non, logiquement aucun soucis Il suffit de bien définir qui doit être créer en premier... Dans ton cas, le Label sera à créer en dernier!
    Note que j'ai utilisé le label pour la propriété transparent à mettre à true pour garder la couleur du Panel ... Mais dans ce cas, le TLabel ne suffirait-il pas ?

    Tiens, un code pondu en 2 minutes:
    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
    procedure TForm1.Button3Click(Sender: TObject);
    var
      monPanel:TPanel;
      monLabel:TLabel;
    begin
      monPanel:=TPanel.Create(Self);
      monPanel.Parent:=Form1;
      monPanel.Width:=100;
      monPanel.Height:=100;
      monPanel.Left:=400;
      monPanel.Top:=200;
      monPanel.Caption:='';
      monPanel.Color:=clBlue;
      monLabel:=TLabel.Create(monPanel);
      monLabel.Parent:=monPanel;
      monLabel.Align:=alClient;
      monLabel.Alignment:=taLeftJustify;
      monLabel.Caption:='Bonjour à tous';
      monLabel.Font.Color:=clWhite;
      monLabel.Transparent:=True;
    end;
    En espérant t'avoir aidé
    A+

  5. #5
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    salut

    Et en plus avec un label tu as la propriété wordwrap.donc plus simple a gérer ..
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    On peut pas dire que cela ne fonctionne pas.
    Je viens à l'instant de le mettre en action
    (j'avais remarque le transparent à true, merci)

    - Le problème c'est la vitesse d'affichage, c'est pas terrible pourtant j'ai que 7 panel dans mon exemple et ce n'ai pas fluide.
    - je gere egalament des evenements onclick, dblclik où doit'je les mettre sur le panel ou sur le label ?
    car la particularite de mon evenement onDblclik est de liberee le composant sur lequel je doubleclique, mais est-ce que si je libere le panel panel.free cela va-t-il detruire mon label ?

    Si il y a un moyen d'accélere l'affichage ce serais parfait.

    Merci grandement tu as tout de meme repondu à ma question par une astuce.

    Je vais pas cliquer sur resolu de suite, j'attend vos commentaires.

  7. #7
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    re

    au fait pourquoi ne pas remplacer directement tes Tpanel par des Tlabel ?
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  8. #8
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    BuzzLeclaire, pourquoi ne modifies-tu pas simplement la procédure que je t'avais écrite...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Procedure Degrader(Panel:TPanel;FStartColor:Tcolor;FEndColor:Tcolor);
    à partir de "DrawText" pour écrire sur plusieurs lignes ?

    En récupérant le Caption dans un TStringList, et en écrivant une boucle, ça fera ce que tu veux très rapidement... si tu veux vraiment un code tout fait, je t'en écrirai un dans la soirée.

  9. #9
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Je me demandais tu vois si c'etait possible.

    Et tu m'en voit charmé...

    Mais je vois pas comment faire.

    Ceci dit je vais essayer de suite de modifier DrawText (je promets rien).

    Merci de l'info.

  10. #10
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Purée tu as raison.
    Pour le moment j'en suis à la vase découverte et cela fonctionne super.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          DrawText(Canevas.Handle, PChar('Premier Ligne') , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
          Rect.Top := Rect.Top + self.Font.Size+2;
          DrawText(Canevas.Handle, PChar('Deuxieme Ligne) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
    par rapport au degrader que tu m'a adapter.

    Sa sent tres tres bon lol..
    je continue. (je suis pa sun pro..donc je tatonne)

  11. #11
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Voilà où j'en suis (etant donner que je ne vois pas comment gérer un TStringList dans la méthode)

    Le MyPanel

    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
    type
       TMyPanel = class(TPanel)
       private
         FStartColor:Tcolor;
         FEndColor:Tcolor ;
         fCaption1:String;
         fCaption2:String;
         fCaption3:String;
         fCaption4:String;
       protected
        procedure Paint;override;
       published
        property StartColor : Tcolor read fStartColor write fStartColor ;
        property EndColor : Tcolor read FEndColor write FEndColor ;
        property Caption1 : String read fCaption1 write fCaption1;
        property Caption2 : String read fCaption2 write fCaption2;
        property Caption3 : String read fCaption3 write fCaption3;
        property Caption4 : String read fCaption4 write fCaption4;
     
       end;
    Au niveau de la procédure Degrade

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          DrawText(Canevas.Handle, PChar(self.Caption1) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
          Rect.Top := Rect.Top + self.Font.Size + 2;
          DrawText(Canevas.Handle, PChar(Self.Caption2) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
          Rect.Top := Rect.Top + self.Font.Size + 2;
          DrawText(Canevas.Handle, PChar(self.Caption3) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
          Rect.Top := Rect.Top + self.Font.Size + 2;
          DrawText(Canevas.Handle, PChar(Self.Caption4) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
    et l'utilisation
    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
    procedure TForm1.FormActivate(Sender: TObject);
    Var
      i: Integer;
      Panel: TMypanel;
      RectLabel: Trect;
    begin
      for i := 1 To 2 do
      Begin
        Panel := TMyPanel.Create(Self);
        Panel.Parent := Self;
        with Panel do
        Begin
          Font.Size := 8;
          Font.Name := 'Tahoma';
          Name := 'PANEL' + inTtoStr(i);
          Caption1 := 'PREMIER LIGNE';
          Caption2 := 'DEUXIEME LIGNE';
          Caption3 := 'TROISIEME LIGNE';
          Caption4 := 'QUATRIEME LIGNE';
          Height := 100;
          Top := 130 * i;
          Panel.StartColor := clCream;
          Panel.EndColor := clBlack;
        end;
      end;
    end;
    Mais je suis sur que ta propostion sera meilleure. (je continue mes recherches)

  12. #12
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Ta solution est un "pis-aller" qui peut fonctionner, si tu connais à l'avance le nombre de lignes maximal qu'il y aura à afficher, mais tu as pigé ce que je voulais dire.

    Sinon, en rentrant du boulot, j'ai pensé à une autre solution : utiliser un TLabel à fond dégradé plutôt qu'un TPanel ! Ainsi tu disposes de toutes les propriétés de formatage de texte du TPanel. Je viens de l'écrire et de le tester vite fait en le mettant dans une unité séparée, voilà ce que ça donne (tu crées une nouvelle unité, tu copies/colles le tout dans cette unité, et tu la sauvegardes sous le nom GradPanel dans le répertoire du projet) :

    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
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    unit GradLabel;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, math, ExtCtrls, StdCtrls;
     
    const
     
     DefStartColor = clBlue;  // valeur par défaut
     DefEndColor   = clWhite; // valeur par défaut
     
    type
     
      TGradLabel = class(TCustomLabel)
       private
        FStartColor : TColor;
        FEndColor   : TColor;
       protected
        procedure Paint;override;
        procedure SetStartColor(AColor:TColor);
        procedure SetEndColor(AColor:TColor);
       public
        constructor Create(AOwner: TComponent); override;
       published
        property StartColor : TColor read FStartColor write SetStartColor;
        property EndColor   : TColor read FEndColor   write SetEndColor;
        property Align;
        property Alignment;
        property Anchors;
        property AutoSize;
        property BiDiMode;
        property Caption;
    //    property Color nodefault;
        property Constraints;
        property DragCursor;
        property DragKind;
        property DragMode;
        property EllipsisPosition;
        property Enabled;
        property FocusControl;
        property Font;
        property ParentBiDiMode;
    //    property ParentColor;
        property ParentFont;
        property ParentShowHint;
        property PopupMenu;
        property ShowAccelChar;
        property ShowHint;
    //    property Transparent;
        property Layout;
        property Visible;
        property WordWrap;
        property OnClick;
        property OnContextPopup;
        property OnDblClick;
        property OnDragDrop;
        property OnDragOver;
        property OnEndDock;
        property OnEndDrag;
        property OnMouseActivate;
        property OnMouseDown;
        property OnMouseMove;
        property OnMouseUp;
        property OnMouseEnter;
        property OnMouseLeave;
        property OnStartDock;
        property OnStartDrag;
      end;
     
     
    implementation
     
    constructor TGradLabel.Create(AOwner: TComponent);
     begin
      inherited Create(AOwner);
      inherited Transparent := True;
      FStartColor := DefStartColor;
      FEndColor   := DefEndColor;
     end;
     
    procedure TGradLabel.SetStartColor(AColor:TColor);
     begin
      if AColor <> FStartColor then
       begin
        FStartColor := AColor;
        Repaint;
       end;
     end;
     
    procedure TGradLabel.SetEndColor(AColor:TColor);
     begin
      if AColor <> FEndColor then
       begin
        FEndColor := AColor;
        Repaint;
       end;
     end;
     
    procedure TGradLabel.Paint;
    Var
      aBand : TRect;    { Bande rectangulaire de couleur courante        }
      i     : Integer;  { Compteur pour parcourir la hauteur de la fiche }
      FStartRGB  : Array[0..2] of Byte;    { RGB de la couleur de départ }
      FCurrentRGB : Array[0..2] of Byte;    { RGB de la couleur courante  }
      FDeltaRGB  : Array[0..2] of Integer; { RGB à ajouter à la couleur de départ pour atteindre la couleur de fin }
      nbtranches: integer;
      Rect:TRect;
    Begin
      Rect.Left   := 0;
      Rect.Top    := 0;
      Rect.Right  := Width;
      Rect.Bottom := Height;
      { Calcul des valeurs RGB pour la couleur courante }
      FStartRGB[0] := GetRValue( ColorToRGB( FStartColor ) );
      FStartRGB[1] := GetGValue( ColorToRGB( FStartColor ) );
      FStartRGB[2] := GetBValue( ColorToRGB( FStartColor ) );
      { Calcul des valeurs à ajouter pour atteindre la couleur de fin }
      FDeltaRGB[0] := GetRValue( ColorToRGB( FEndColor )) - FStartRGB[0] ;
      FDeltaRGB[1] := GetgValue( ColorToRGB( FEndColor )) - FStartRGB[1] ;
      FDeltaRGB[2] := GetbValue( ColorToRGB( FEndColor )) - FStartRGB[2] ;
      { Initialisation des dimensions de la bande de couleur }
      aBand.Left :=Rect.Left;
      aBand.Right:=Rect.Right;
      nbtranches:=min(256, Rect.Bottom-Rect.Top);
      { Boucle pour remplir la fiche courante en dégradé }
      With Canvas Do
      Begin
          Pen.Style:=psSolid;
          Pen.Mode:=pmCopy;
          For i:= 0 To nbtranches-1 Do
          Begin
              { Dimensions verticales de la bande }
              aBand.Left :=Rect.Left;
              aBand.Right:=Rect.Right;
              aBand.Top := Rect.Top+Round((Rect.Bottom-Rect.Top)/nbtranches*i);
              aBand.Bottom := Rect.Top+Round((Rect.Bottom-Rect.Top)/nbtranches*(i+1));
     
              { Calcul de la couleur courante }
              FCurrentRGB[0] := (FStartRGB[0] + MulDiv( i , FDeltaRGB[0] , nbtranches )) mod 256;
              FCurrentRGB[1] := (FStartRGB[1] + MulDiv( i , FDeltaRGB[1] , nbtranches )) mod 256;
              FCurrentRGB[2] := (FStartRGB[2] + MulDiv( i , FDeltaRGB[2] , nbtranches )) mod 256;
              { Affichage sur la fiche }
              Brush.color:=RGB(FCurrentRGB[0],FCurrentRGB[1],FCurrentRGB[2]);
              FillRect(aBand);
          End;
      End;
     inherited Paint; // Dessin normal du texte, par dessus le dégradé
    end;
     
     
    end.
    Compte tenu de la discussion que nous avions eue dans l'autre fil, je pense que ça correspond parfaitement à ce que tu recherches. Ah ! Si tu nous avais dit qu'il fallait du formatage de texte sur plusieurs lignes !

    Les propriétés StartColor et EndColor sont rendues dynamiques dans ma version, et je laisse AutoSize à sa propriété par défaut (on peut la modifier dans le Create, éventuellement). Voilà alors un exemple de FormCreate (ne pas oublier de référencer l'unité GradPanel dans la clause uses de la fiche) :

    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
    procedure TForm1.FormCreate(Sender: TObject);
    Var
      i: Integer;
      Lbl: TGradLabel;
    begin
      for i := 1 To 10 do
      Begin
       Lbl := TGradLabel.Create(Form1);
       with Lbl do
        begin
         Name := 'Label' + IntToStr(i);
         Parent := Form1;
         AutoSize := False;
         Font.Size := 8;
         Font.Name := 'Tahoma';
         Caption := Name+#13#10'deuxième ligne';
         Height := 30;
         Top := 40 * i;
         Width := 100;
        end;
      end;
    end;
    Si tu veux quand même la version avec le TPanel, dis-moi, j'ai aussi trouvé mieux qu'avec un TStringList.

  13. #13
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut,

    Effectivement cela fonctionne trés bien.
    (ps : il faut enlever // property OnMouseActivate; et // property EllipsisPosition

    Mais je ne peut pas avoir le même rendu qu'un Tpanel.

    en fait dans la partie Paint je modifie cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    Begin
      Rect.Left   := 2;
      Rect.Top    := 2;
      Rect.Right  := Width-2;
      Rect.Bottom := Height-2;
    ...
    Pour donner un effet relief. et sur ton Label le text s'écrit toujours à partir d'un left de 0 donc c'est pas présentable.

    Je viens de faire cela (en foyen sur ce forum)
    dis moi comment faire pour avoir une solution d'un Text dont les lignes vont tout seul à la ligne pour eviter d'avoir 10 caption en prorpiété :

    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
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, math, ExtCtrls, StdCtrls, Grids;
     
    type
       TMyPanel = class(TPanel)
       private
         FCorner : Integer;
         FMaxCorner : Integer;
         FStartColor:Tcolor;
         FEndColor:Tcolor ;
         fCaption1:String;
         fCaption2:String;
         fCaption3:String;
         fCaption4:String;
         Procedure SetCorner( Value : Integer);
         Procedure SetRgn;
       protected
        procedure Paint;override;
       public
        constructor Create(AOwner: TComponent); override;
        procedure SetParent( AParent : TWinControl); Override;
        Procedure SetBounds( ALeft, ATop, Awidth, AHeight : Integer); override;
       published
        property StartColor : Tcolor read fStartColor write fStartColor ;
        property EndColor : Tcolor read FEndColor write FEndColor ;
        property Caption1 : String read fCaption1 write fCaption1;
        property Caption2 : String read fCaption2 write fCaption2;
        property Caption3 : String read fCaption3 write fCaption3;
        property Caption4 : String read fCaption4 write fCaption4;
        Property Corner : Integer read FCorner Write SetCorner default 10;
       end;
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormActivate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    constructor TMyPanel.Create;
    begin
      inherited;
      FMaxCorner := 10;
      FCorner := 10;
    end;
     
    Procedure TMyPanel.SetParent( AParent : TWinControl);
    Begin
    inherited;
      SetRgn;
    End;
     
    Procedure TMyPanel.SetRgn;
    Var
      rgn : Hrgn;
    //  ACorner : Integer;
    Begin
      If Parent = Nil then exit;
      rgn := CreateRoundRectRgn(0,  0, Width + 1, Height + 1, FCorner * 2, FCorner * 2);
      SetWindowRgn(handle, rgn, True); {on assigne la région au handle du control fenètré}
      DeleteObject(Rgn); {on supprime la région après usage}
      Invalidate;  {appel à peinture}
    End;
     
    Procedure TMyPanel.SetCorner( Value : Integer);
    Begin
    FMaxCorner :=  min(Height, Width) div 2; {Corner doit être inférieur
      à la moitié du coté le plus petit}
    FCorner := Value;
    EnsureRange( 0, Fcorner, FMaxCorner);
    SetRgn; {mise à jour de la région}
    End;
     
    Procedure TMyPanel.SetBounds(ALeft, ATop, Awidth, AHeight : Integer);
    Var
    OldHeight, OldWidth : Integer;
    Begin
    OldHeight := Height;
    OldWidth := Width;
    inherited;
    If (OldWidth <> Width) or (OldHeight <> Height) then
      SetCorner( Fcorner); {on vérifie que corner reste inférieur à la moitié du
      coté le plus petit : on en profites pour rafraichir la région même si
      Fcorner ne change pas}
    end;
     
    procedure TMyPanel.Paint;
      Procedure Degrader;
      Var
        aBand : TRect;    { Bande rectangulaire de couleur courante }
        i    : Integer;  { Compteur pour parcourir la hauteur de la fiche }
        FStartRGB  : Array[0..2] of Byte;    { RGB de la couleur de départ }
        FCurrentRGB : Array[0..2] of Byte;    { RGB de la couleur courante  }
        FDeltaRGB  : Array[0..2] of Integer; { RGB à ajouter à la couleur de départ pour atteindre la couleur de fin }
        nbtranches: integer;
        Canevas:TControlCanvas;
        Rect:TRect;
      Begin
     
        Rect.Left := 2;
        Rect.Top := 2;
        Rect.Right := Self.Width-2;
        Rect.Bottom := Self.Height-2;
        self.ParentColor := false;
        Canevas:= TControlCanvas.Create;
        Canevas.Control:= self;
        { Calcul des valeurs RGB pour la couleur courante }
        FStartRGB[0] := GetRValue( ColorToRGB( StartColor ) );
        FStartRGB[1] := GetGValue( ColorToRGB( StartColor ) );
        FStartRGB[2] := GetBValue( ColorToRGB( StartColor ) );
        { Calcul des valeurs à ajouter pour atteindre la couleur de fin }
        FDeltaRGB[0] := GetRValue( ColorToRGB( EndColor )) - FStartRGB[0] ;
        FDeltaRGB[1] := GetgValue( ColorToRGB( EndColor )) - FStartRGB[1] ;
        FDeltaRGB[2] := GetbValue( ColorToRGB( EndColor )) - FStartRGB[2] ;
     
        { Initialisation des dimensions de la bande de couleur }
        aBand.Left :=Rect.Left;
        aBand.Right:=Rect.Right;
        nbtranches:=min(256, Rect.Bottom-Rect.Top);
        { Boucle pour remplir la fiche courante en dégradé }
     
        With Canevas Do
        Begin
            Pen.Style:=psSolid;
            Pen.Mode:=pmCopy;
            For i:= 0 To nbtranches-1 Do
            Begin
                { Dimensions verticales de la bande }
                aBand.Left :=Rect.Left;
                aBand.Right:=Rect.Right;
                aBand.Top := Rect.Top+Round((Rect.Bottom-Rect.Top)/nbtranches*i);
                aBand.Bottom := Rect.Top+Round((Rect.Bottom-Rect.Top)/nbtranches*(i+1)); 
     
                { Calcul de la couleur courante }
                FCurrentRGB[0] := (FStartRGB[0] + MulDiv( i , FDeltaRGB[0] , nbtranches )) mod 256;
                FCurrentRGB[1] := (FStartRGB[1] + MulDiv( i , FDeltaRGB[1] , nbtranches )) mod 256;
                FCurrentRGB[2] := (FStartRGB[2] + MulDiv( i , FDeltaRGB[2] , nbtranches )) mod 256;
                { Affichage sur la fiche }
                Brush.color:=RGB(FCurrentRGB[0],FCurrentRGB[1],FCurrentRGB[2]);
                FillRect(aBand);
            End;
          Font.Name := Self.Font.Name;
          Font.Size := Self.Font.Size;
          Brush.Style := bsClear;
     
          DrawText(Canevas.Handle, PChar(self.Caption1) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
          Rect.Top := Rect.Top + Self.Font.Size + 6;
     
          Pen.Color := EndColor;
          MoveTo(Rect.Left,Rect.Top);
          LineTo(Rect.Right,Rect.top);
     
          Rect.Top := Rect.Top + 2;
          DrawText(Canevas.Handle, PChar(Self.Caption2) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
          Rect.Top := Rect.Top + self.Font.Size + 2;
          DrawText(Canevas.Handle, PChar(self.Caption3) , -1, Rect, DT_NOPREFIX or DT_SINGLELINE);
          Rect.Top := Rect.Top + self.Font.Size + 2;
          DrawText(Canevas.Handle, PChar(Self.Caption4) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_SINGLELINE);
        End;
       Canevas.Free; // Libérer le canevas après usage !
      End;
     
    begin
     inherited Paint;
     Degrader;
    end;
     
    procedure TForm1.FormActivate(Sender: TObject);
    Var
      i: Integer;
      Panel: TMypanel;
    begin
      for i := 1 To 2 do
      Begin
        Panel := TMyPanel.Create(Self);
        Panel.Parent := Self;
        with Panel do
        Begin
          Font.Size := 8;
          Font.Name := 'Tahoma';
          Name := 'PANEL' + inTtoStr(i);
          Caption1 := 'PREMIER LIGNE';
          Caption2 := 'DEUXIEME LIGNE';
          Caption3 := 'TROISIEME LIGNE';
    //      Caption4 := 'QUATRIEME LIGNE';
          Height :=  350;
          top := 100;
          width := 100;
          left := 200 * i;
          FCorner := 10;
          FMaxCorner := 10;
          StartColor := clCream;
          EndColor := clBlack;
        end;
      end;
    end;
     
    end.
    comme tu peux le voir le rendu est vraiment pas mal.

    Merci à toi, j'attend tes commentaires et une astuce pour le caption multiligne

  14. #14
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    si je puis me permettre
    transforme tes propriétés caption1, caption2, ... en UNE propriété Captions de type TStringList

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with Panel do
        Begin
          Font.Size := 8;
          Font.Name := 'Tahoma';
          Name := 'PANEL' + inTtoStr(i);
          Captions.Add('PREMIER LIGNE');
          Captions.Add('DEUXIEME LIGNE');
          Captions.Add('TROISIEME LIGNE');
    //      Caption4 := 'QUATRIEME LIGNE';
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  15. #15
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    En fait... il suffit d'enlever le DT_SINGLELINE dans DrawText... ahem

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DrawText(Canevas.Handle, PChar(Panel.Caption) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_VCENTER);
    Sinon, je garde de côté le TLabel dégradé, ça peut servir. Et je ne vois pas pourquoi tu veux supprimer EllipsisPosition et OnMouseActivate...

    On pourrait effectivement l'améliorer avec différents effets, dont l'effet relief, mais là ça devient trop long...

  16. #16
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Yurck
    Mettre le Caption1,2..4 en Stringlist.
    Je c'est pas comment m'y prendre Yurck.

    Salut CapJAck,

    DT_SINGLELINE génial sa marche super.
    Mais si j'ecris un caption plus grand que le Witdh du TPanel il me fait pas une deuxieme ligne et on perd le texte.

    EllipsisPosition et OnMouseActivate : parcque cela me fait une erreur dans la compilation. Il m'ecrit 'do not exist in base class'

    en fait il faudrait pouvoir parcourir le caption et quand le mot ne peut pas entrer dans la ligne du Panel on change de ligne.

    Il exitse peut-être un function qui decoupe un phrase selon la taille d'un Objet ?

  17. #17
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Ok pour les propriétés, c'est parce que tu as une version de Delphi plus ancienne que la mienne (j'utilise Delphi 2005).

    Alors la réponse est : OUI ! Il faut utiliser la constante DT_WORDBREAK :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DrawText(Canevas.Handle, PChar(Panel.Caption) , -1, Rect, DT_CENTER or DT_NOPREFIX or DT_VCENTER or DT_WORDBREAK);
    DT_CENTER et DT_VCENTER sont évidemment facultatifs...

    (Edit : la constante existe, mais elle s'appelle DT_WORDBREAK et pas DT_WORDWRAP... )

  18. #18
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    J'utilise Delphi 2007 !! lol

    Bref.
    Tu est un champion, le DT_WORDWRAP fonctionne à la perfection.

    Je te remercie grandement.

    Je vais maintenant pouvoir continuer mon programme.

    Merci encore mille fois.

    EDIT : DT_WORDBREAK fonctionne MErci.

  19. #19
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    De rien. Marrant pour Delphi 2007, et sinon, j'ai édité.. hem.

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

Discussions similaires

  1. [Débutant] écrire un texte dans un panel
    Par slaima15 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 18/08/2010, 07h57
  2. Formatage de texte dans une table
    Par thunderjulien dans le forum BIRT
    Réponses: 2
    Dernier message: 04/08/2010, 17h20
  3. Formatage du texte dans une fenêtre
    Par Daejung dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/11/2008, 21h56
  4. Formatage de texte dans un dbGrid
    Par ada_azoul dans le forum Bases de données
    Réponses: 4
    Dernier message: 26/03/2008, 11h57
  5. [C# 2.0] Options de formatage du texte dans une MessageBox
    Par oodini dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/07/2006, 13h27

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