Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   OwnerDraw en TPageControl (https://www.clubdelphi.com/foros/showthread.php?t=65904)

salvica 21-01-2010 13:17:36

OwnerDraw en TPageControl
 
Hola a tod@s, de nuevo con los problemas ;)

Estoy diseñando una aplicación que tiene un TPageControl2 dentro de una pestaña de otro TPageControl1.
Algunas de las pestañas del TPageControl2 deben mostrarse u ocultarse dependiendo del estado de unos botones TCheckBox que actualizo desde una Base de datos.
Las pestañas y los botones los nombro, (para mi comodidad), con el nombre de la clase y otro en mayúsculas separados por el guión bajo (_), por ejemplo si hay un botón llamado CheckBox_PEPE hay una pestaña llamada TabSheet_PEPE.
Para dar "realce" a las pestañas, utilizo el evento OnDrawTab (las pone con el texto en rojo y negrita).

Bien, depués de todo este "rollo", :D el problema es que muestra las pestañas que quiere (o no se hacerlo, que será lo más probable) :mad:
Si desactivo la propiedad OwnerDraw, todo funciona correctamente. :confused:

El código de los botones para ocultar las pestañas es el siguiente:
Código:

procedure TForm_Configuracion.CheckBox_ACTIVAR_PESTANAS_OnClick(Sender: TObject);
var
  TabSheet : TTabSheet;
  Alias    : string;
begin
{ calcular el alias del botón utilizado }
  Alias := TCheckBox(Sender).Name;
  while( Pos('_', Alias)>0 ) do
        Delete( Alias, 1, Pos('_', Alias) );
{ buscar la pestaña correspondiente al botón }
  TabSheet := FindComponent('TabSheet_'+Alias) as TTabSheet;
  if( TabSheet<>nil ) then begin
    { pestaña encontrada, ocultarla o mostrarla }
      TabSheet.TabVisible := TCheckBox(Sender).Checked;
  end;
end;

El código para dar forma a las pestañas es el siguiente (sacado de aquí mismo): ;)
Código:

procedure TForm_Configuracion.PageControl2_OnDrawTab(
  Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect;
  Active: Boolean);
var
  TabSheet : TTabSheet;
  TabAlias : string;
  Margen  : integer;
begin
{ al dibujar las pestañas }
  TabSheet := PageControl2.Pages[TabIndex];
  //if not TabSheet.TabVisible then exit; { no vale, deja las pestañas en blanco }
  TabAlias := TabSheet.Caption;
  with PageControl2.Canvas do begin
      if Active then begin
        { texto en negrita }
          Font.Color := clRed;
          Font.Style := [fsBold];
      end else begin
        { texto normal }
          Font.Color := clBlack;
          Font.Style := [];
      end;
      FillRect(Rect);
      Margen := (Rect.Right-Rect.Left- TextWidth(TabAlias)) div 2;
      TextOut( Rect.Left+Margen, Rect.Top+4, TabAlias );
  end;
end;

Gracias adelantadas por la ayuda
salvica

salvica 22-01-2010 19:24:21

Haber si ahora podeis ayudarme :rolleyes:

En el ejemplo que pone Román aquí me ocurre lo mismo:(, entonces he optado por meter algunos controles en una de las pestañas que debe estar oculta, (hasta ahora estaban vacías y pensaba que lo que estaba viendo era correcto).

Craso error :(:(:(, la variable TabIndex del procedimiento OnDrawTab del TPageControl recibe el número de órden de las pestañas visibles por lo que la línea
Código Delphi [-]
Texto := PageControl1.Pages[TabIndex].Caption
no se corresponde con la realidad

Ejemplo:
Código:

PageIndex  TabIndex  Caption
=========  ========  =======
    0          0      Inicio
    1          -1      Uno
    2          -1      Dos
    3          1      Tres

Pintaría la pestaña cero (PageIndex = 0) con Caption = Inicio
no pintaría pas pestañas uno y dos (TabIndex = -1), o sea TabVisible = false
Al pintar la pestaña tres (TabIndex = 1) PageControl1.Pages[TabIndex].Caption = Uno

¿Como puedo resolver el problema? (Saber el PageIndex de la pestaña a dibujar)

Gracias
Salvica

cesarsoftware 05-02-2010 10:42:29

Hola Salvica

Mira a ver si este codigo te puede ayudar

Código Delphi [-]
procedure TMC.PageControl1Change(Sender: TObject);
begin
  BotonBorraRuta.Enabled := False;
  TBotonBorraRuta.Enabled := False;
  MenuBorraRuta.Enabled := False;
  BotonAutoBorrar.Enabled := False;
  TBotonAutoBorrar.Enabled := False;
  MenuAutoBorrar.Enabled := False;
  case PageControl1.ActivePageIndex of
    0: begin
       TabRutasAjustar();
       AjustaRutaBotones();
       BotonBorraRuta.Enabled := True;
       TBotonBorraRuta.Enabled := True;
       MenuBorraRuta.Enabled := True;
    end;
    1: begin
       TabOperacionAjustar();
       AjustaOperacionBotones();
    end;
    2: begin
       TabInformeAjustar();
    end;
    3: begin
       TabAutoAjustar();
       BotonAutoBorrar.Enabled := True;
       TBotonAutoBorrar.Enabled := True;
       MenuAutoBorrar.Enabled := True;
    end;
    4: begin
       TabFtpAjustar();
    end;
    5: begin
    end;
  end;
end;
 
procedure TMC.PageControl1Changing(Sender: TObject; var AllowChange: Boolean);
begin
  case PageControl1.ActivePageIndex of
    0: begin
    end;
    1: begin
    end;
    2: begin
    end;
    3: begin
    end;
    4: begin
       MemorizaSitioFtp();
       GuardaSitiosFtp();
       LeeSitiosFtp();
    end;
    5: begin
    end;
  end;
end;
 
procedure TMC.PageControl1Enter(Sender: TObject);
begin
  PageControl1Change(Nil);
end;


La franja horaria es GMT +2. Ahora son las 18:13:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi