Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Manipular PageControl en Form heredado (https://www.clubdelphi.com/foros/showthread.php?t=89508)

scigliano 03-12-2015 17:33:11

Manipular PageControl en Form heredado
 
Hola, un saludo a todos... :)

Tengo un formulario base (UBaseForm), donde guardo los procedimientos y funciones que más utilizo en otros form. Por una consulta que realicé en días pasados aquí en el club, decidí trabajar con "Herencia", he estado leyendo y documentándome al respecto, ya que soy novato en ese tema.

El punto es que necesito manipular las pestañas de un PageControl en un formulario heredado desde el formulario base, pero hasta el momento no he tenido éxito.

Me explico: Tengo un procedimiento en el formulario base al que le paso como parámetros el nombre de un campo y la pestaña donde se encuentra, para que lo muestre y le pase el foco.

A continuación les muestro lo que llevo hecho, para que me orienten.

En la primera prueba, definí el PageControl en la sección Interface/Var, no da error, pero al ejecutar el procedimiento no muestra la pestaña que requiero.

Código Delphi [-]
unit UBaseForm;

interface

uses
  vcl.ComCtrls, ....

type
  TBaseForm = class(TForm)
  .
  .

var
   BaseForm: TBaseForm;
   //******************************************
   //*** OPCION 1: DECLARACION DEL PAGECONTROL
   //******************************************
   PageControl1: TPageControl;

implementation

procedure TBaseForm.MostrarEdit(NameCampo:TEdit ; NameSheet:TTabSheet);
begin
   //*** Activa la pestaña
   PageControl1.ActivePage := NameSheet;
   //*** Pasa el foco al campo
   NameCampo.SetFocus;
   Abort;
end;

En la segunda prueba, definí el PageControl en la sección Var dentro del procedimiento, tampoco da error, pero al ejecutar el procedimiento no muestra la pestaña que requiero.

Código Delphi [-]
unit UBaseForm;

interface

uses
  vcl.ComCtrls, ....

type
  TBaseForm = class(TForm)
  .
  .

var
   BaseForm: TBaseForm;

implementation

procedure TBaseForm.MostrarEdit(NameCampo:TEdit ; NameSheet:TTabSheet);
var
   //******************************************
   //*** OPCION 2: DECLARACION DEL PAGECONTROL
   //******************************************
   PageControl1: TPageControl;
begin
   //*** Activa la pestaña
   PageControl1.ActivePage := NameSheet;
   //*** Pasa el foco al campo
   NameCampo.SetFocus;
   Abort;
end;

Para llamar al procedimiento desde el form heredado, utilizo la siguiente instrucción:
Código Delphi [-]
MostrarEdit(TxtCodigo,TabSheet1);

Al no poder ejecutarse el SetFocus en la pestaña requerida, obviamente aparece el mensaje:
"Cannot focus a disabled or invisible windows"

Qué me falta definir o declarar ? :confused:

Gracias anticipadas por sus comentarios... ^\||/

AgustinOrtu 03-12-2015 18:09:51

Eso es porque la variable PageControl1 que tenes declarada "no es quien tu crees que es"

Estas referenciando a un TPageControl que ni siquiera fue creado; no es el PageControl de tu formulario

Tenes dos alternativas:

1. Recorrer los controles del form, y buscar el PageControl

Código Delphi [-]
// se podria extender pasando como parametro el nombre...
// esta funcion te retorna el primero que encuentra
function TBaseForm.FindPageControl: TPageControl;
var
  I: Integer;
begin
  for I := 0 to ControlCount - 1 do
  begin
    if Controls[i] is TPageControl then
      Exit(Controls[i] as TPageControl);
  end;

  raise Exception.Create('PageControl no encontrado');
end;

2. Tener el PageControl como parametro

Código Delphi [-]
procedure TBaseForm.MostrarEdit(AEdit: TEdit ; APageControl: TPageControl; NameSheet: TTabSheet);
begin
  APageControl.ActivePage := NameSheet;
  AEdit.SetFocus;
end;

No tengo Delphi a mano ahora, pero si mal no recuerdo, los TTabSheet tienen en algun lado una referencia al PageControl; si no es explicito (propiedad de tipo TPageControl) deberia poder obtenerse haciendo:

Código Delphi [-]
  APageControl := NameSheet.Parent as TPageControl;

Por otro lado, porque tenes llamadas al procedimiento Abort? Sabes para que sirve eso?

Caminante 03-12-2015 18:10:05

Hola

Disculpa pero no me quedo muy claro.

El pagecontrol pertenece al formulario base????

ecfisa 03-12-2015 19:09:32

Hola scigliano.

Seguramente te va a resultar interesante lo tratado sobre herencia visual en este libro.

Saludos :)


La franja horaria es GMT +2. Ahora son las 03:35:03.

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