mettre en gras le caption d'un onglet

Résolu
seba31stien Messages postés 51 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 25 juillet 2006 - 12 juil. 2006 à 18:16
birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre 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

12 réponses

birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 septembre 2006
13 juil. 2006 à 11:52
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
3
Emandhal Messages postés 194 Date d'inscription dimanche 2 mars 2003 Statut Membre Dernière intervention 10 octobre 2006 3
12 juil. 2006 à 19:58
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...
1
seba31stien Messages postés 51 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 25 juillet 2006 1
13 juil. 2006 à 08:15
ta proposition met tous les composants de l'onglet en gras sauf le caption. C'est l'inverse que je veux faire.
0
seba31stien Messages postés 51 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 25 juillet 2006 1
13 juil. 2006 à 08:26
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 septembre 2006
13 juil. 2006 à 11:10
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
0
seba31stien Messages postés 51 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 25 juillet 2006 1
13 juil. 2006 à 11:14
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
0
seba31stien Messages postés 51 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 25 juillet 2006 1
13 juil. 2006 à 12:06
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
0
seba31stien Messages postés 51 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 25 juillet 2006 1
13 juil. 2006 à 12:29
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 ?
0
birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 septembre 2006
13 juil. 2006 à 13:46
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
0
birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 septembre 2006
13 juil. 2006 à 14:24
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
0
birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 septembre 2006
13 juil. 2006 à 14:41
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;
0
birdyz Messages postés 42 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 4 septembre 2006
13 juil. 2006 à 14:41
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;
0
Rejoignez-nous