PDA

Ver la Versión Completa : Obtener componente padre


Jere_84
06-06-2012, 14:36:48
Hola gente del club, en una de mis funciones quiero obtener el componente padre de un dbedit y trabajar con este, mi problema es:


var
vComponente: TPageControl;

if (vForm <> nil) then
begin
for i:= 0 to vForm.ComponentCount - 1 do
begin
if (vForm.Components[i] is TDbEdit) then
begin
vComponente:= TDbEdit(vForm.Components[i]).GetParentComponent; <---- aqui
if (vComponente is TPageControl) then
begin
for a:= 0 to vComponente.Tabs.Count - 1 do
begin
.....



Al compilar me da una incompatibilidad entre tipos TPageControl y TComponent. Como puedo o bien pasar TComponent a TPageControl? hay alguna otra propiedad que devuelva el padre con el tipo de clase exacta?

Slds.

Neftali [Germán.Estévez]
06-06-2012, 15:33:59
Hola gente del club, en una de mis funciones quiero obtener el componente padre de un dbedit y trabajar con este, mi problema es:


Prueba así:


var
vComponente: TComponent;

...

if (vComponente is TPageControl) then
begin
for a:= 0 to TPageControl(vComponente).Tabs.Count - 1 do
begin
.....

movorack
06-06-2012, 15:42:12
Hola gente del club, en una de mis funciones quiero obtener el componente padre de un dbedit y trabajar con este, mi problema es:

Hola... prueba con este código a ver si te sirve.


function GetParentOfType(pClassType : TClass;
pComponent : TComponent;
var vComponent : TComponent) : Boolean;
var
lComponent : TComponent;
lBoFound : Boolean;
begin
lBoFound := False;
lComponent := pComponent.GetParentComponent;
while (not lBoFound) and Assigned(lComponent) do
begin
if lComponent.ClassType = pClassType then
begin
vComponent := lComponent;
lBoFound := True;
end
else
lComponent := lComponent.GetParentComponent;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
lComponent : TComponent;
i : Integer;
lTabSheet : TTabSheet;
begin
for i := 0 to Self.ComponentCount - 1 do
begin
if Self.Components[i] is TEdit then
begin
if Length(Trim(TEdit(Self.Components[i]).Text)) = 0 then
begin
if GetParentOfType(TTabSheet, Self.Components[i], lComponent) then
begin
lTabSheet := TTabSheet(lComponent);
if GetParentOfType(TPageControl, lTabSheet, lComponent) then
begin
TPageControl(lComponent).ActivePage := lTabSheet;
TEdit(Self.Components[i]).SetFocus;
end;
end;
end;
end;
end;
end;

luisgutierrezb
06-06-2012, 15:56:13
Bueno, yo detecto varias cosillas, primero:

vComponente:= TDbEdit(vForm.Components[i]).GetParentComponent; <---- aqui


el parent de un dbedit en un pagecontrol es un TTabSheet, y despues el pagecontrol...
otra, la linea de codigo hace un cast inutil, porque da lo mismo si fuera asi:

vComponente:= vForm.Components[i].GetParentComponent;
//para que nos regrese el pagecontro, podria ser asi:
vComponente:= vForm.Components[i].GetParentComponent.GetParentComponent; //si doble, para que regrese 2 atras...


yo pienso que el error de la incompatibilidad es en esta linea:


for a:= 0 to vComponente.Tabs.Count - 1 do


porque vComponente es del tipo Component, no TPageControl, aqui si, hay que hacer el Cast...

Jere_84
06-06-2012, 16:49:44
Prueba así:


var
vComponente: TComponent;

...

if (vComponente is TPageControl) then
begin
for a:= 0 to TPageControl(vComponente).Tabs.Count - 1 do
begin
.....



Gracias Neftali. Funciona.

Slds.

Jere_84
06-06-2012, 16:57:11
Bueno, yo detecto varias cosillas, primero:

vComponente:= TDbEdit(vForm.Components[i]).GetParentComponent; <---- aqui


el parent de un dbedit en un pagecontrol es un TTabSheet, y despues el pagecontrol...
otra, la linea de codigo hace un cast inutil, porque da lo mismo si fuera asi:

vComponente:= vForm.Components[i].GetParentComponent;
//para que nos regrese el pagecontro, podria ser asi:
vComponente:= vForm.Components[i].GetParentComponent.GetParentComponent; //si doble, para que regrese 2 atras...


yo pienso que el error de la incompatibilidad es en esta linea:


for a:= 0 to vComponente.Tabs.Count - 1 do


porque vComponente es del tipo Component, no TPageControl, aqui si, hay que hacer el Cast...

Es cierto, vi que el GetParentComponent volvía a tener la misma función dentro y no entendí porque ahora se que es para volver dos atrás muchas gracias.
Encare la función de otra manera la cambie de la siguiente forma:
1º Recorro el Form.
2º Pregunto si el componente es un PageControl.
3º Me paro en en la pagina numero 1, obtengo y recorro los componentes del tabsheet.
Por ultimo recién en ese momento pregunto si el componente es un DbEdit y si esta en null armo un mensaje con su propiedad caption.
Gracias por la respuesta.

Slds.