PDA

Ver la Versión Completa : Referenciar componente con un string


ingel
21-06-2005, 14:29:12
Hola a todos..
Lo que quiero hacer el lo siguiente ..si se puede...Tengo una tabla donde tengo 3 campos : NombreFormulario (string) , NombreComponente (string), Visible(boolean).. entonces cada vez que entro a un formulario quiero filtrar esa tabla y habilitar los componentes segun esten en true o false en dicha tabla..
Saludos a todos
Gracias

Ohcan
21-06-2005, 14:34:16
No sé si te he entendido muy bien...

Podrías usar FindComponent...

Siento no ser más explícito... tengo un poco de prisa, si puedo luego sigo.

Saludos.

ingel
21-06-2005, 15:39:36
lo que yo voy a obtener en variables es :

var1:= TTable.fieldbyname('NOMBRECOMPONENTE).asstring;
res := TTable.fieldbyname('ES_VISIBLE').asboolean;

de la tabla filtrada segun el nombre del formulario donde ingrese.

entonces Var1 valdrá por ej. 'Button1'

lo que quiero hacer en el show del Formx es :

Formx.var1.visible := res;

que equivaldria a poner Formx.button1.visible := true; (o false)


Saludos y gracias

jachguate
21-06-2005, 16:34:40
Pues lo ya dicho te sirve.


FindComponent(Var1).Visible := res;


Hasta luego.

;)

ingel
21-06-2005, 17:21:49
como le indico que el componente que leo en un string tiene la propiedad VISIBLE..o sea que es un boton por ejemplo..
el codigo que hice es...

Procedure HabilitaComp(Formulario:TForm);
var vis:boolean;var1:string;
comp:Tcomponent;
begin
with FDatos.TControlComp do begin
filter := 'NOMBREFORM='+#39+Formulario.Name+#39;
filtered := true;
while Not eof do begin
vis :=fieldbyname('VISIBLE').asboolean;
var1:=fieldbyname('NOMBRECOMP').asstring;
with (formulario as TForm) do begin
comp:=findcomponent(var1);
comp.visible := vis;
end;
next;
end;
end;
end;

obviamente no me compila porque no reconoce a VISIBLE....
quise declarar en una VAR tipo TBitBtn pero no me dejo... como le indico que comp es un boton?

Saludos
gracias..

jachguate
21-06-2005, 17:33:49
Hola. En primer lugar, después de 44 mensajes, es de esperar que publiques los trozos de código entre etiquetas [ delphi ], [ sql ] o [ code ], según corresponda. El código que publicaste es realmente dificil de leer!!

Dado que no lo leí, pues me baso en el texto.

El punto es que aqui estamos tratando polimorficamente a los controles, y todos los controles, al heredar de TControl, tienen la propiedad visible. Ya el hecho de que se muestren o se dejen de mostrar en pantalla cada uno con su forma específica se lo dejamos a la herencia (maravilla de POO!).

Hasta luego.

;)

roman
21-06-2005, 17:34:16
Tienes que hacer un moldeo de tipos. FindComponent regresa una referencia de tipo TComponent así que debes moldearla a TButton.

Por favor usa las etiquetas [ code ] o [ delphi ] para que tu código sea legible. Podrás encontrar ayuda de cómo hacerlo en los mensajes que aparecen al principio de cada foro.

// Saludos

roman
21-06-2005, 17:36:04
al heredar de TControl, tienen la propiedad visible.

Sólo que FindComponent regresa TComponent y no TControl.

// Saludos

ingel
21-06-2005, 17:53:45
no suelo enviar codigo ..prometo la proxima hacerlo con las etiquetas..
ahora ... estan claras las rtas ..pero como hago lo del moldeo? ... mi POO no es una de mis virtudes :(

Encontre este hilo...
¿Cómo puedo llamar al método heredado de una clase que no es el ancestro directo?
voy bien encaminado.. o nada que ver ...

roman
21-06-2005, 18:00:18
pero como hago lo del moldeo? ... mi POO no es una de mis virtudes


El moldeo realmente no es cosa de OOP.


comp:=findcomponent(var1);

// asegúrate de que está la componente o te expones a un AV
if Assigned(comp) then
TBitBtn(comp).visible := vis;




Encontre este hilo...
¿Cómo puedo llamar al método heredado de una clase que no es el ancestro directo?
voy bien encaminado.. o nada que ver ...

Nada que ver. Y cualquier forma de llamar a un método que no sea del padre directo rompe la filosofía de la OOP.

// Saludos

jachguate
21-06-2005, 18:56:33
Sólo que FindComponent regresa TComponent y no TControl.
:o :o cierto... cierto. Por un momento creí que habia un método FindControl.. :D



comp:=findcomponent(var1);

// asegúrate de que está la componente o te expones a un AV
if Assigned(comp) then
TBitBtn(comp).visible := vis;



De igual manera, yo recomendaría un casteo seguro, no sea que al final de cuentas tampoco sea botón. Otra que sigue siendo válida es dejarlo todo apuntado a controles (TControl), así podrás ocultar/mostrar también etiquetas, grids, radio buttons, y muchas cosas mas.


comp:=findcomponent(var1);

// asegúrate de que está la componente o te expones a un AV
if Assigned(comp) and (comp is TControl) then
TControl(comp).visible := vis;


Hasta luego.

;)

roman
21-06-2005, 19:05:12
comp:=findcomponent(var1);

// asegúrate de que está la componente o te expones a un AV
if Assigned(comp) and (comp is TControl) then
TControl(comp).visible := vis;



En este caso sobra ya la primera condición: si Comp es nil seguramente no será TControl ;)

// Saludos

maeyanes
21-06-2005, 19:34:58
Pero si Comp es nil (Assigned(Comp) = False), ya no se evalua la segunda parte de la sentencia if, claro, suponiendo que la opción Complete boolean eval esté desactivada en las propiedades del Proyecto... :)


Saludos...

jachguate
21-06-2005, 20:40:50
En este caso sobra ya la primera condición: si Comp es nil seguramente no será TControl ;)

// Saludos

:o:o:o Vos.. siempre dando cátedra... :) Estas en lo cierto.

Seguro podria resumirse solamente a la segunda condición.

Hasta luego.

;)

maeyanes
21-06-2005, 21:01:57
No seguramente, según la ayuda de Delphi, es válido hacerlo, ya que, como mencionó roman, si Comp es nil, pues obviamente no será TControl... :p


Y yo que pensé que sabía hacer un buen uso del is... :D