PDA

Ver la Versión Completa : Cambiar estilo de Tabsheet


Bauhaus1975
03-12-2008, 12:35:59
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í (http://torry.net/vcl/tabs/pagecontrols/PageExtControl.zip) 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
¿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.


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
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í (http://www.clubdelphi.com/foros/showthread.php?t=26049) tengo un ejemplo muy parecido al tuyo y no noto nada raro.

// Saludos

Caro
19-01-2009, 20:36:11
¿A qué te refieres con esto Caro? Aquí (http://www.clubdelphi.com/foros/showthread.php?t=26049) 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:


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
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