mettre en gras le caption d'un onglet [Résolu]

Messages postés
51
Date d'inscription
lundi 13 juin 2005
Dernière intervention
25 juillet 2006
- - Dernière réponse : birdyz
Messages postés
42
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
4 septembre 2006
- 13 juil. 2006 à 14:41
Bonjour,
je souhaiterais mettre en gras le caption d'un onglet d'un pagecontrol. les autres restant en normal.
Tabsheet[1].Font.Style :=[fsbold]; met tout le contenu de l'onglet en gras alors que je ne voudrais que le caption
merci pour toute aide
Seb
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
42
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
4 septembre 2006
3
Merci
Ben c'est pareil. Après création de ton TPageControl (on va dire qu'il s'appelle PageControl1), tu fait

PageControl1.OwnerDraw := True;
PageControl1.OnDrawTab := PageControl1DrawTab;

Tu aura bien sur déclaré et implémenté la procédure PageControl1DrawTab comme je te l'ai décrit avant.

Birdyz

Merci birdyz 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de birdyz
Messages postés
199
Date d'inscription
dimanche 2 mars 2003
Dernière intervention
10 octobre 2006
0
Merci
u,
Sur les composants dans l'onglet, il faut mettre ParentFont := False;
++


Tout problème a sa solution... Mais en général, celle que l'on trouve n'est jamais la bonne...
Commenter la réponse de Emandhal
Messages postés
51
Date d'inscription
lundi 13 juin 2005
Dernière intervention
25 juillet 2006
0
Merci
ta proposition met tous les composants de l'onglet en gras sauf le caption. C'est l'inverse que je veux faire.
Commenter la réponse de seba31stien
Messages postés
51
Date d'inscription
lundi 13 juin 2005
Dernière intervention
25 juillet 2006
0
Merci
rectificatif, sur tous les label, si je mets leur parentfont à false, effectivement, ils n'héritent pas du caractère gras de son parent. mais le caption ne se met jamais en gras;
Comment mettre le caption de caption de l'onglet actif et uniquement celui ci, en gras ?
Commenter la réponse de seba31stien
Messages postés
42
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
4 septembre 2006
0
Merci
Salut Seb

Pour mettre le Titre de l'onglet actif en gras, je pratique de cette manière :

D'abord, il faut mettre le OwnerDraw de ton TPageControl à True

Ensuite, dans le OnDrawTab, je met ceci :

procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  iLeft : integer;
begin
  if Active then
  begin
    PageControl1.Canvas.Font.Style := PageControl1.Canvas.Font.Style + [fsBold];
    iLeft := Rect.Left + 8;
  end
  else
  begin
    PageControl1.Canvas.Font.Style := PageControl1.Canvas.Font.Style - [fsBold];
    iLeft := Rect.Left + 4;
  end;
  PageControl1.Canvas.TextOut(iLeft, Rect.Top + 3, PageControl1.Pages[TabIndex].Caption);
end;

Birdyz
Commenter la réponse de birdyz
Messages postés
51
Date d'inscription
lundi 13 juin 2005
Dernière intervention
25 juillet 2006
0
Merci
merci pour ces renseignements qui m'éclairent.
mon composant pagecontrol est créé dynamiquement, peux tu m'indiquer comment associer cette procedure au composant créé? je sais le faire pour l'évènement onclick d'un TButton créé dynamiquement, mais pas pour un pagecontrol
Seb
Commenter la réponse de seba31stien
Messages postés
51
Date d'inscription
lundi 13 juin 2005
Dernière intervention
25 juillet 2006
0
Merci
Ok, je suis sur autre chose en ce moment, je le teste dès que possible puis j'accepterai la réponse si c'est bon
merci
Commenter la réponse de seba31stien
Messages postés
51
Date d'inscription
lundi 13 juin 2005
Dernière intervention
25 juillet 2006
0
Merci
OK ça marche, j'ai juste remplacé
"if Active then"
par
"if ( Tabsheet[TabIndex+1].Enabled) then"
pour les besoins de mon appli

Par contre, fsbold provoque l'augmentation de la taille du caption, celui ci dépasse de l'onglet.quelle est la proopriété taille de l'onglet ?
Commenter la réponse de seba31stien
Messages postés
42
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
4 septembre 2006
0
Merci
Effectivement pour le if Active. C'est parce que ce code est repris d'un composant que je me suis fais qui dérive de TPageControl. J'ai modifié les lignes ou j'utilisait le self, mais j'ai oublié cette ligne. Pour la taille de l'onglet, c'est effectivement un problème, mais je n'ai pas encore trouvé la solution
Commenter la réponse de birdyz
Messages postés
42
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
4 septembre 2006
0
Merci
Après quelques recherche, j'ai fais ceci (il y a surement possibilité d'améliorer) :

Dans le OnDrawTab, j'ai ajouter au début de la procédure le code suivant :
  iMaxTaille := 0;
  Font := PageControl1.Pages[0].Font;
  Font.Style := Font.Style + [fsBold];


  for i := 0 to PageControl1.PageCount - 1 do
  begin
    iTaille := TextSize(PageControl1.Pages[i].Caption, Font).X;
    if iTaille > iMaxTaille then
      iMaxTaille := iTaille;
  end;
  PageControl1.TabWidth := iMaxTaille + 16;

Cela nécesite les variables :
  i : integer;
  iTaille, iMaxTaille : integer;
  Font : TFont;

Il faut également ajouter la fonction TextSize (Elle n'est pas de moi, mais viens de www.developpez.com)

Function TextSize(Phrase : string; Police : TFont = nil) : TPoint;
var
  DC: HDC;
  X: Integer;
  Rect: TRect;
  C : TBitmap;
begin
  C := TBitmap.create;
  if police <> nil then  C.canvas.Font := police;


    Rect.Left := 0;
    Rect.Top:=0;
    Rect.Right:=0;
    Rect.Bottom:=0;
    DC := GetDC(0);
    C.Canvas.Handle := DC;
    DrawText(C.Canvas.Handle, PChar(Phrase), Length(Phrase), Rect, (DT_EXPANDTABS or DT_CALCRECT));
    C.Canvas.Handle := 0;
    ReleaseDC(0, DC);
    result.X:=Rect.Right-Rect.Left;
    result.Y:=Rect.Bottom-Rect.Top;
    C.Free;
end;

En gros, je calcul la taille de l'onglet le plus grand, avec la police en gras, et je met tous les ongles à cette taille, en ajoutant 16 pixels pour s'adapter avec la marge de 8 présente dans la procédure d'origine.
Le top serai de retailler chaque onglet à la bonne taille, mais mes cela dépasse mes connaissances

Birdyz
Commenter la réponse de birdyz
Messages postés
42
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
4 septembre 2006
0
Merci
Finalement, j'ai rajouté un petit truc pour centrer le texte dans l'onglet car je trouvais ca trop moche. Donc revoici la procédure complète :

procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  iLeft : integer;
  i : integer;
  iTaille, iMaxTaille : integer;
  Font : TFont;
begin


  iMaxTaille := 0;
  Font := PageControl1.Canvas.Font;
  Font.Style := Font.Style + [fsBold];


  for i := 0 to PageControl1.PageCount - 1 do
  begin
    iTaille := TextSize(PageControl1.Pages[i].Caption, Font).X;
    if iTaille > iMaxTaille then
      iMaxTaille := iTaille;
  end;
  PageControl1.TabWidth := iMaxTaille + 16;


  if Active then
  begin
    PageControl1.Canvas.Font.Style := PageControl1.Canvas.Font.Style + [fsBold];
    iLeft := (Rect.Right - Rect.Left - TextSize(PageControl1.Pages[TabIndex].Caption, PageControl1.Canvas.Font).X) div 2 + Rect.Left;
  end
  else
  begin
    PageControl1.Canvas.Font.Style := PageControl1.Canvas.Font.Style - [fsBold];
    iLeft := (Rect.Right - Rect.Left - TextSize(PageControl1.Pages[TabIndex].Caption, PageControl1.Canvas.Font).X) div 2 + Rect.Left;
  end;
  PageControl1.Canvas.TextOut(iLeft, Rect.Top + 3, PageControl1.Pages[TabIndex].Caption);
end;
Commenter la réponse de birdyz
Messages postés
42
Date d'inscription
jeudi 9 janvier 2003
Dernière intervention
4 septembre 2006
0
Merci
Finalement, j'ai rajouté un petit truc pour centrer le texte dans l'onglet car je trouvais ca trop moche. Donc revoici la procédure complète :

procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  iLeft : integer;
  i : integer;
  iTaille, iMaxTaille : integer;
  Font : TFont;
begin


  iMaxTaille := 0;
  Font := PageControl1.Canvas.Font;
  Font.Style := Font.Style + [fsBold];


  for i := 0 to PageControl1.PageCount - 1 do
  begin
    iTaille := TextSize(PageControl1.Pages[i].Caption, Font).X;
    if iTaille > iMaxTaille then
      iMaxTaille := iTaille;
  end;
  PageControl1.TabWidth := iMaxTaille + 16;


  if Active then
  begin
    PageControl1.Canvas.Font.Style := PageControl1.Canvas.Font.Style + [fsBold];
    iLeft := (Rect.Right - Rect.Left - TextSize(PageControl1.Pages[TabIndex].Caption, PageControl1.Canvas.Font).X) div 2 + Rect.Left;
  end
  else
  begin
    PageControl1.Canvas.Font.Style := PageControl1.Canvas.Font.Style - [fsBold];
    iLeft := (Rect.Right - Rect.Left - TextSize(PageControl1.Pages[TabIndex].Caption, PageControl1.Canvas.Font).X) div 2 + Rect.Left;
  end;
  PageControl1.Canvas.TextOut(iLeft, Rect.Top + 3, PageControl1.Pages[TabIndex].Caption);
end;
Commenter la réponse de birdyz

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.