Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Deshabilitar un TabSheet de un PageControl (https://www.clubdelphi.com/foros/showthread.php?t=32612)

Colgueit 10-06-2006 18:07:10

Deshabilitar un TabSheet de un PageControl
 
Hola,

Estoy intentando deshabilitar un TabSheet de un PageControl.

Deberia ser simplemente haciendo TabSheet.enabled := false ó PageControl.Pages[index].enabled:= false.

Pero con ninguno se me deshabilita. Vaya que ni cambiando la propiedad enabled del Object Inspector.

Entonces, ¿Como se deshabilita?.

Muchas Gracias :rolleyes:

Lepe 10-06-2006 18:49:58

O bien puedes poner visible a false de ese TabSheet, o bien colocar todos los componentes que tenga dentro de un Panel inhabilitado.

Saludos

dec 10-06-2006 18:57:43

Hola,

Cita:

Pero con ninguno se me deshabilita. Vaya que ni cambiando la propiedad enabled del Object Inspector.



Bueno. Lo que ocurre es que cuando deshabilitas de ese modo una "pestaña" (un objeto "TTabSheet") no significa que no puedas acceder a ella, sino que todo su contenido se encontrará deshabilitado. Esto es, si tienes un "Memo" y un botón dentro de una pestaña y la deshabilitas, aunque podrás acceder a dicha pestaña, no podrás escribir en el "Memo" ni utilizar el botón.

Si lo que quieres es ocultar la pestaña, esto es, para que no pueda ser seleccionada, tienes la propiedad "TabVisible". De otro modo acaso puedas valerte de los eventos "OnShow" y "OnHide" de los objetos "TTabSheet"... o bueno, tal vez exista algún otro modo que a mí se me escapa ahora mismo. ;)

Colgueit 10-06-2006 20:52:36

Antetodo gracias a los dos,

Pero eso ya lo sabía. Creo que no me explique bien, perdon.
Lo que quiero es que el titulo de la pestaña sea visible (a modo boton deshabilitado) pero que si está deshabilitada no se pueda acceder al contenido de la pestaña, esto es, que si pulso en la pestaña X no haga nada.
¿esto como se hace?

Espero haberme explicado mejor.

Un Saludo!

dec 10-06-2006 21:17:37

Hola,

No sé si has leído lo que te he respondido anteriormente. Lo que te he tratado de explicar es lo que ocurre cuando deshabilitas una pestaña. Es decir, que lo que tú quieres conseguir no se consigue deshabilitando la pestaña, vamos.

Ahora bien, ¿existe algún modo de conseguir lo que quieres? Mejor aún, ¿existe algún modo de conseguir el efecto que quieres, puesto que parece que como "debería" funcionar no funciona? Pues esto es lo que también creo haber dicho que no sé.

Seguramente, buscándole las vueltas... qué sé yo, jugando con los eventos anteriormente mencionados, con la posibilidad de cambiar el color del "Caption" de una pestaña,... tal vez sea posible, pero, desde luego, ahora mismo, no se me ocurre por dónde empezar.

Colgueit 10-06-2006 21:38:13

Respuesta a mi mismo
 
Gracias Dec,

Al final lo he conseguido, lo explico y pongo aquí el código por si alguien le ha surgido el mismo problema.

Lo que he hecho es crear una variable que guarda el indice del ultimo TabSheet seleccinado y cuando cambio de TabSheet compruebo si es el que no quiero que se visualize, si es ese vuelvo al TabSheet anterior.
Código Delphi [-]
TabAnterior:Integer;

procedure TFormX.PageControlChange(Sender: TObject);
begin
   if (PageControlVisitas.ActivePageIndex = 6) then
   begin
     If TabAnterior=6 then
       TabAnterior:=0;
     PageControl.ActivePageIndex := TabAnterior
   end
   else
      TabAnterior := PageControlVisitas.ActivePageIndex;
end;

Un saludo!

Colgueit 10-06-2006 21:54:19

Se me olvidada...
 
Una ultima cosa , que estoy probando y no se hacerlo. ¿Como cambio el color de una pestaña en concreto? Se cambiar el color de todas, obiamente, y el color de la pestaña activa. Pero lo quiero es cambiar el color de una pestaña cualquiera , este activa o no.

Hasta luegoooo

dec 10-06-2006 21:56:38

Hola,

Me alegro. Yo tambiéne estaba investigando y creo que entre los dos y Román puedes lograr más o menos lo que querías en un principio. El método que has puesto quedaría así:

Código Delphi [-]
procedure TForm1.PageControl1Change(Sender: TObject);
begin
  if not (PageControl1.ActivePage.Enabled) then
  begin
    PageControl1.ActivePageIndex := TabAnterior
  end
  else
    TabAnterior := PageControl1.ActivePageIndex;
end;

El evento "OnDrawTab" del "PageControl" quedaría así:

Código Delphi [-]
procedure TForm1.PageControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  R: TRect;
  Texto: String;

begin
  if not (PageControl1.Pages[TabIndex].Enabled) then
    Control.Canvas.Font.Color := clGrayText;

  Texto := PageControl1.Pages[TabIndex].Caption;

  R := Rect;
  Control.Canvas.FillRect(R);

  if not Active then
    InflateRect(R, 0, -3);

  DrawText(Control.Canvas.Handle, PChar(Texto), -1,
    R, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;

La propiedad "OwnerDraw" del "PageControl" ha de valer "True", para el anterior código haga su trabajo.

Por último, ya podrías habilitar/deshabilitar pestañas mediante su propiedad "Enabled":

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  TabSheet2.Enabled := false;
  TabSheet4.Enabled := false;
  PageControl1.Repaint;
end;

El problema que he visto (de momento) es que al utilizar el evento "OnDrawTab", si utilizas también la unidad "XpMan", para lograr la apariencia del tema de Windows XP, ya sabes, pues resulta que la cosa no parece funcionar correctamente...

Es decir, el tema de Windows XP se aplicará (tendrá efecto) sobre otros controles, pero, no sobre el "PageControl", no sé si me explico. ;)

dec 10-06-2006 22:01:36

1 Archivos Adjunto(s)
Hola,

Como puede verse, me limité a copiar el código que Román escribió en su momento en cierto Hilo de estos Foros. Entonces, parece que las siguientes instrucciones:

Código Delphi [-]
  if not Active then
    InflateRect(R, 0, -3);

No son necesarias en el código anterior, o, en todo caso, llevan a cabo algo que ahora mismo se me escapa. Que conste. ;)

Actualización: Adjunto una especie de ejemplo de esto que estamos tratando.

Colgueit 10-06-2006 22:36:04

Muchisimas Gracias Dec!!!!!!!!!!!

Ya lo tengo en perfecto funcionamiento, y aparte he hecho que ademas de mostrar en gris el Tab deshabilitado, tambien hago que se muestre en otro color el Tab activo. Solo es una pequeña modificacion del codigo que me has pasado.
Código Delphi [-]
procedure TFormVisitas.PageControl1DrawTab(
  Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect;
  Active: Boolean);
var
  R,R2: TRect;
  Texto,Texto2: String;
begin

  if not (PageControl1.Pages[TabIndex].Enabled) then
    Control.Canvas.Font.Color := clGrayText;
  Texto2 := PageControl1.Pages[TabIndex].Caption;
  R2 := Rect;
  Control.Canvas.FillRect(R2);
  if not Active then
    InflateRect(R2, 0, -3);
 
  if Active then
    Control.Canvas.Font.Color := clBlue;
  Texto := PageControlVisitas.Pages[TabIndex].Caption;
  R := Rect;
  Control.Canvas.FillRect(R);
  if not Active then
    InflateRect(R, 0, -3);
 
  DrawText(Control.Canvas.Handle, PChar(Texto2), -1, R,
  DT_SINGLELINE or DT_CENTER or DT_VCENTER);
  DrawText(Control.Canvas.Handle, PChar(Texto), -1, R2,
  DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;


Muchas gracias otra vez!!!!!!! Agradezco mucho tu tiempo!!!!

dec 10-06-2006 22:42:44

Hola,

Bueno, pues las gracias son mutuas entonces, porque de no haber sido por ti no hubiera yo sabido continuar. Justamente, si no llegas a escribir la implementación del método "OnChange" para el "PageControl" me parece a mí que me hubiera quedado encallado, así que gracias a ti. Y no se olvide a Román, puesto que el código del evento "OnDrawTab" lo escribió él originalmente. :D


La franja horaria es GMT +2. Ahora son las 09:26:57.

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