Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Llamar componente dinamico (https://www.clubdelphi.com/foros/showthread.php?t=75568)

jlrdz 02-09-2011 17:35:24

Llamar componente dinamico
 
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

Código Delphi [-]

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:

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

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

Código Delphi [-]
procedure llamar_tabla(Tabla: TTable)
begin

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

end;

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

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

Cita:

Empezado por roman (Mensaje 410723)
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í:

Código Delphi [-]
procedure llamar_tabla(Tabla: TTable)
begin

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

end;

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

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

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


La franja horaria es GMT +2. Ahora son las 04:07:32.

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