Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Cambiar estilo de Tabsheet (https://www.clubdelphi.com/foros/showthread.php?t=62076)

Bauhaus1975 03-12-2008 12:35:59

Cambiar estilo de Tabsheet
 
Hola, alguien sabe cómo se puede cambiar el estilo, color de fondo, fuente, etc. en un TabSheet. O si hay que usar otro componente.
He cambiado el color de fondo de un formulario, pero la lengüeta del tab mantiene el color original.

Gracias y un saludo.

droguerman 03-12-2008 14:34:39

Yo uso PageExtControl que lo encuentras en torry.net, aquí lo puedes descargar

Bauhaus1975 04-12-2008 08:41:44

Hola, y gracias por tu ayuda.
pero, ¿Existe alguna manera sin usar un componente externo? por curiosidad...
Saludos.

Caro 04-12-2008 15:52:48

Cita:

Empezado por Bauhaus1975 (Mensaje 329565)
¿Existe alguna manera sin usar un componente externo?

Hola, pintando a mano si se puede, debes colocar la propiedad OwnerDraw a True y utilizar el evento OnDrawTab.

Código Delphi [-]
procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
 Re : TRect;
 Titulo : String;
begin
 Re := Rect;
 Titulo := PageControl1.Pages[TabIndex].Caption;
 
 //Para las letras
 if Active then
  begin
   Control.Canvas.Font.Style := [fsBold];
   Control.Canvas.Font.Color := clRed;
  end
 else
  Control.Canvas.Font.Color := clBlack;
 
 //Paar el fondo
 Control.Canvas.Brush.Color := clYellow;
 
 Control.Canvas.FillRect(Re);
 
 //esta línea es para que el TabSheet tome el color de fondo del Tab
 PageControl1.Pages[TabIndex].Brush.Color:=Control.Canvas.Brush.Color;
 
 DrawText(
    Control.Canvas.Handle, PChar(Titulo), Length(Titulo), Re,
    DT_CENTER or DT_VCENTER or DT_SINGLELINE);
end;

Ahora para que se vea mas bonito, pones el PageControl dentro de un panel con Align=alClient y le das un color mas bajo al panel (en nuestro ejemplo un amarillo mas bajito), así tomara ese color el pagecontrol y cuando se ingrese a un tabsheet se maracara todo del color amarillo.

El unico problema que veo es que la primera vez no funciona, tienes que entrar a un TabSheet para que despues tenga ese efecto.

Saluditos

Bauhaus1975 04-12-2008 16:01:53

Gracias por la respuesta.
Voy a probar todo lo que has explicado.
Saludos.

roman 19-01-2009 18:42:54

Cita:

Empezado por Caro (Mensaje 329608)
El unico problema que veo es que la primera vez no funciona, tienes que entrar a un TabSheet para que despues tenga ese efecto.

¿A qué te refieres con esto Caro? Aquí tengo un ejemplo muy parecido al tuyo y no noto nada raro.

// Saludos

Caro 19-01-2009 20:36:11

Cita:

Empezado por roman (Mensaje 334995)
¿A qué te refieres con esto Caro? Aquí tengo un ejemplo muy parecido al tuyo y no noto nada raro.

Hola amiguito muchísimas gracias por responder, estaba segura que un día me responderías sobre la pregunta que hice en este hilo :):D.

Ahora te explico, mi problema esta en que no solo quiero pintar el Tab quiero que se pinte todo el TabSheet cuando este activo, lo que se me ha ocurrido primero es poner un Panel del color que he pintado el Tab pero no se veía muy bien. Con esta línea de codigo:

Código Delphi [-]
 PageControl1.Pages[TabIndex].Brush.Color:=Control.Canvas.Brush.Color;

El TabSheet toma como color de fondo el color del Tab y se ve mejor que con un Panel. Mi problema esta ahí, cuando se ejecuta la primera vez siguiendo el ejemplo de arriba esta pintado con el color amarillo bajito cuando debería estar con el color amarillo fuerte ya que esta activo, pero cuando activas otro Tab no hay problema te lo pinta bien.

Saluditos

roman 19-01-2009 21:05:11

Creo que no estoy entendiendo. En un PageControl, lo único que se ve son: los bordes, la pestaña y la ficha actual. Entonces, el color que tenga una ficha cuando no está activa es irrelevante, por lo que puedes establecer el color desde el inicio (por ejemplo, en el OnCreate del formulario) con el mismo código que ahora usas.

Por otra parte, el evento OnDrawTab está pensado exclusivamente para dibujar la pestaña, y no otras partes del PageControl. Por eso, el que modifiques la propiedad PageControl1.Pages[TabIndex].Brush.Color no tiene ningún efecto inmediato, pues no se dibuja la ficha en ese evento. Pero como sí cambias la propiedad, la próxima vez que se redibuja la ficha, se muestra ya con el color que le hayas asignado. Este redibujado de la ficha se dará, desde luego, cuando actives la ficha, pero, aún sin cambiar de ficha activa, si, por ejemplo, minimizas la aplicación, al restaurarla, verás ya el color amarillo.

// Saludos

Caro 19-01-2009 21:19:02

Cita:

Empezado por roman (Mensaje 335030)
Creo que no estoy entendiendo. En un PageControl, lo único que se ve son: los bordes, la pestaña y la ficha actual. Entonces, el color que tenga una ficha cuando no está activa es irrelevante, por lo que puedes establecer el color desde el inicio (por ejemplo, en el OnCreate del formulario) con el mismo código que ahora usas.

Por otra parte, el evento OnDrawTab está pensado exclusivamente para dibujar la pestaña, y no otras partes del PageControl. Por eso, el que modifiques la propiedad PageControl1.Pages[TabIndex].Brush.Color no tiene ningún efecto inmediato, pues no se dibuja la ficha en ese evento. Pero como sí cambias la propiedad, la próxima vez que se redibuja la ficha, se muestra ya con el color que le hayas asignado. Este redibujado de la ficha se dará, desde luego, cuando actives la ficha, pero, aún sin cambiar de ficha activa, si, por ejemplo, minimizas la aplicación, al restaurarla, verás ya el color amarillo.

// Saludos

Lo había inicializado en el OnCreate con el codigo que puse para que el primer TabSheet tome el color que quiero por defecto, pero me he equivocado de pageControl por lo que veía que no funcionaba, acabo de hacer la prueba con lo que dices de ya tenerlo inicializado todos mis TabSheet desde el principio y funciona bien, como dices no es necesario que este en el evento OnDrawTab, muchas gracias Roman.

Saluditos


La franja horaria es GMT +2. Ahora son las 09:28:50.

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