Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Referenciar componente con un string (https://www.clubdelphi.com/foros/showthread.php?t=22603)

ingel 21-06-2005 14:29:12

Referenciar componente con un string
 
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

me explico un poco mejor..
 
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.

Código Delphi [-]
  FindComponent(Var1).Visible := res;

Hasta luego.

;)

ingel 21-06-2005 17:21:49

disculpa si no te comprendo pero..
 
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

Cita:

Empezado por jachguate
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

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

Cita:

Empezado por ingel
pero como hago lo del moldeo? ... mi POO no es una de mis virtudes

El moldeo realmente no es cosa de OOP.

Código Delphi [-]
comp:=findcomponent(var1);

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


Cita:

Empezado por ingel
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

Cita:

Empezado por roman
Sólo que FindComponent regresa TComponent y no TControl.

:o :o cierto... cierto. Por un momento creí que habia un método FindControl.. :D

Cita:

Empezado por roman
Código Delphi [-]
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.

Código Delphi [-]
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

Cita:

Empezado por jachguate
Código Delphi [-]
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

Cita:

Empezado por roman
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


La franja horaria es GMT +2. Ahora son las 15:48:54.

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