Fórum Determinar PageControl.TabWidth conforme tamanho do caption #295002

09/09/2005

0

pessoal

eu realizo a criação de tabsheets dinamicamente.
o camptio desse tabscheet é o nome do cliente.
só que eu gostaria de definir um pagecontrol1.tabwidth = 150 e fazer com que o nome do caption se for maior que esse width de 150 receba 3 pontos.

por exemplo:
Maria Silva (é um nome que entra nesse width)
Joaquim Pereira Santos da Silva (não entra) gostaria que o caption então ficasse Joaquim Pereira San...

como faço ?


e ao selecionar um dos tabsheets eu gostaria que o tabwidth desse selecionado ficasse autosize, então ao selecionar o tab do joaquim iria aparecer o nome completo dele.


obrigado

Diogo


Diogoalles

Diogoalles

Responder

Posts

09/09/2005

Massuda

...só que eu gostaria de definir um pagecontrol1.tabwidth = 150 e fazer com que o nome do caption se for maior que esse width de 150 receba 3 pontos.
Ajuste a propriedade TPageControl.OwnerDraw para True. No evento TPageControl.OnTabDraw faça algo assim...
procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  R: TRect;
  S: string;
begin
  with Control.Canvas do begin
    if Active then
      Brush.Color := clHighlight
    else
      Brush.Color := clBtnFace;
    Brush.Style := bsSolid;
    FillRect(Rect);
    if TabIndex >= 0 then begin
      if Active then
        Font.Color := clHighlightText
      else
        Font.Color := clBtnText;
      Brush.Style := bsClear;

      R := Rect;
      S := (Control as TPageControl).Pages[TabIndex].Caption;
      DrawText(Handle, PChar(@S[1]), Length(S), R,
        DT_NOPREFIX or DT_LEFT or DT_BOTTOM or DT_END_ELLIPSIS);
    end;
  end;
end;

...ao selecionar um dos tabsheets eu gostaria que o tabwidth desse selecionado ficasse autosize, então ao selecionar o tab do joaquim iria aparecer o nome completo dele.
Fico devendo esta...


Responder

Gostei + 0

14/09/2005

Diogoalles

olá Massuda

estou tentando o código q vc passou, mas inclusive coloquei um ´brake point´ e em nenhum momento passa pelo código. A propriedade OwnerDraw está True.

procedure TFrm550F.PgCtrlClienteDrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  R: TRect;
  S: string;
begin
  with Control.Canvas do
  begin
    if Active then
      Brush.Color := clHighlight
    else
      Brush.Color := clBtnFace;

    Brush.Style := bsSolid;
    FillRect(Rect);

    if TabIndex >= 0 then
    begin
      if Active then
        Font.Color := clHighlightText
      else
        Font.Color := clBtnText;

      Brush.Style := bsClear;

      R := Rect;
      S := (Control as TPageControl).Pages[TabIndex].Caption;
      DrawText(Handle, PChar(@S[1]), Length(S), R,
        DT_NOPREFIX or DT_LEFT or DT_BOTTOM or DT_END_ELLIPSIS);
    end;
  end;
end;


O que tenho de diferente é que só tenho o componente PageControl no form sem nenhum Tabsheet que são criados dinamicamente da seguinte forma:


  if Tab = nil then
  begin
    Tab := TTabSheet.Create(PgCtrlCliente);
    Tab.Caption := NmPac;
    Tab.PageControl := PgCtrlCliente;
  end;


obrigado
Diogo


Responder

Gostei + 0

14/09/2005

Massuda

Testei o código e aparentemente está OK.

Você definiu o evento TPageControl.OnDrawTab no Object Inspector?

A propriedade TPageControl.TabWidth está com um valor não nulo?


Responder

Gostei + 0

14/09/2005

Diogoalles

Você definiu o evento TPageControl.OnDrawTab no Object Inspector?

isso mesmo

A propriedade TPageControl.TabWidth está com um valor não nulo?

tenho um valor de 180

obrigado


Responder

Gostei + 0

14/09/2005

Massuda

Não sei porque não funciona com você... Quando você executa o código que postei, a tab ativa deveria aparecer em azul e se o título da tab for muito grande, aparece os três pontos/reticências; a única coisa que não faz é o autosize, mas isso eu já tinha avisado no meu post inicial.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar