PDA

Ver la Versión Completa : Llamar componente dinamico


jlrdz
02-09-2011, 17:35:24
Saludos a todos primero que nada, tengo una duda y espero puedan ayudarme.

¿Cómo puedo llamar a un componente de forma dinámica?, es decir, yo tengo un módulo de datos donde tengo varias tablas, desde un formulario tengo una funcion a la cual yo le mando el nombre de una tabla



llamar_tabla('telefonos');

..

//mi procedimiento es

procedure llamar_tabla(tabla:string)
begin

//tabla es el nombre que envío
mimodulo.tabla.open; //active, etc..., cualquier otra propiedad.

end;


Pero no puedo hacer referencia a la tabla en el módulo de datos porque lo estoy pasando como una variable string que viene desde la funcion cuando la he llamado y me da el error:

identifier expected but string constant found.

podría hacerlo con Case o if else, por ejemplo:


if tabla='telefonos' then
begin
mimodulo.telefonos.open;
end
else ...


pero si son muchas las tablas seria más codigo y es por eso que quiero hacerlo dinámico, pasarle el nombre de la tabla al procedimiento y luego ya llamar a esa tabla con ese nombre y hacer uso de sus propiedades.

Espero me haya explicado y puedan ayudarme, gracias.

oscarac
02-09-2011, 17:42:43
mmm no estoy muy seguro
pero si haces algo como esto


mimodulo.tabla.Tablename := tabla
mimodulo.tabla.open

jlrdz
02-09-2011, 17:50:40
No creo que sea posible porque tengo varios formularios y cada uno de ellos asignados a una tabla, en este caso eso lo quiero usar específicamente para la funcion Locate de una tabla pero quiero usar ese mismo locate para todas las tablas simplemente cambiando dinamicamente la tabla, el campo a buscar y el la palabra.


mimodulo.tabla.Locate('campo', 'palabra', [loPartialKey]);


donde tabla, campo y palabra los envío al llamar la funcion.

Saludos y gracias por tu respuesta, seguiré intentando.

roman
02-09-2011, 18:21:04
No me queda claro qué quieres lograr. Podrías, en lugar de pasar el nombre de la tabla como parámetro, pasarle el componente en sí:


procedure llamar_tabla(Tabla: TTable)
begin

Tabla.Locate('campo', 'palabra', [loPartialKey]);

end;


y lo llamarías así (por ejemplo):


llamar_tabla(mimodulo.tablaTelefonos);


O bien, algo similar a lo que dice oscarac, creando un objeto Table al vuelo dentro del procedimiento, al cual le asignas el nombre de la tabla.

// Saludos

jlrdz
02-09-2011, 20:35:46
Gracias román, lo hice de esa manera enviando el componente y me funciono bien. Saludos y gracias por sus respuestas. :)

jlrdz
06-09-2011, 16:05:43
No me queda claro qué quieres lograr. Podrías, en lugar de pasar el nombre de la tabla como parámetro, pasarle el componente en sí:


procedure llamar_tabla(Tabla: TTable)
begin

Tabla.Locate('campo', 'palabra', [loPartialKey]);

end;


y lo llamarías así (por ejemplo):


llamar_tabla(mimodulo.tablaTelefonos);


O bien, algo similar a lo que dice oscarac, creando un objeto Table al vuelo dentro del procedimiento, al cual le asignas el nombre de la tabla.

// Saludos

Me surgió otra duda más con esto que me funciona de maravilla, ojalá pudieras ayudarme y es que como me dices, envio el componente a mi procedimiento que es una tabla, esto me limita a solo tablas pero me gustaría enviar componentes de consulta, para las tablas uso el componente TMyTable y para las consultas uso TMyQuery, ¿Cómo puedo modificar mi procedimiento para que los parametros sean opcionales?, o sea que yo pueda enviar ya sea un componente TMyTable o TMyQuery.

Actualmente mi procedimiento está así:


//así lo tengo declarado
procedure llenar_combo(lista: Matriz; tabla:TMyTable);

//así lo mando llamar
llenar_combo(Campos, Mi_Modulo.telefonos);


Eso me limita a sólo poder enviar una tabla y el parametro es requerido, lo que quiero es que tenga la opcion de enviar un componente TMyTable o TMyQuery de forma opcional, espero puedan ayudarme una vez más. Saludos. :)

roman
06-09-2011, 16:31:38
Suongo que puedes pasar como parámetro un TDataSet, ancestro común de todos los componentes de acceso a datos. Claro que, dentro de tu rutina, únicamente podrás usar métodos genéricos del TDataSet.

// Saludos