Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-10-2006
Avatar de bbjb
bbjb bbjb is offline
Miembro
 
Registrado: jul 2003
Posts: 97
Poder: 21
bbjb Va por buen camino
Ejecutar objeto Tquery

Buenas a tod@s,

Tengo el siguiente problemilla:

En el modulo1, construyo a través de una variable string el nombre del objeto TQuery que quiero ejecutar.
Una vez construida, lo único que tengo que hacer es:

Código:
TQuery(FindComponent(s_query)).Open
Ahora bien, he decidido trasladar esos objetos TQuery a un DataModule donde los reuno a todos.
Creía que lo único que tenía que hacer era añadir al nombre del objeto Tquery que había obtenido anteriormente el prefijo Datamodule, es decir:

Código:
 s_query := "DataModule1."+Trim(s_query);
 TQuery(FindComponent(s_query)).Open
Pero resulta que no es así, porque recibo un error de memoria tal que así:
Cita:
exception class EAccessViolation with message "Violación de acceso a al dirección....."
He de añadir que tengo incluido en el apartado uses del Modulo1, el DataModule donde recogo la TQuery.

Alguien sabe que estoy haciendo mal???
Responder Con Cita
  #2  
Antiguo 17-10-2006
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
mira estaria bueno que dijeras en que linea te da el error. y el codigo de error
porque en mi experienciaa si es 000000 es que algo no esta creado, Fijate de andarlo depuradon paso a paso y por ahi capaz que puedas descular que es.
Responder Con Cita
  #3  
Antiguo 17-10-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Vamos por partes, FindComponet es un método del objeto TComponent y lo que hace es buscar un componente que pertenece al primero, es decir, si tu estas usando FindComponent dentro de un formulario solo encontrara componentes que pertenecen a ese formulario, no componentes que estén en otro formulario ni en un Datamodule. Por lo que lo mas probable es que cuando tu haces:
Código Delphi [-]
  s_query := "DataModule1."+Trim(s_query);
 TQuery(FindComponent(s_query)).Open
la función FindComponent este devolviendo nil, como no lo compruebas y haces directamente un TypeCast e intentas acceder a un método de un objeto que no existe, es ahí donde te da el error.

Prueba a hacer algo como esto:
Código Delphi [-]
var
  Query: TQuery;
begin
  Query:= TQuery(DataModule1.FindComponent(Trim(s_query)));
  if Query <> nil then
    Query.Open;
end;

Última edición por seoane fecha: 17-10-2006 a las 20:18:40.
Responder Con Cita
  #4  
Antiguo 18-10-2006
Avatar de bbjb
bbjb bbjb is offline
Miembro
 
Registrado: jul 2003
Posts: 97
Poder: 21
bbjb Va por buen camino
Púes he puesto en práctica lo que me ha aconsejado Seoane y he resuelto el problema que tenía.

Muchas gracias por todo
Responder Con Cita
  #5  
Antiguo 18-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
¿Pues no resultaría más comodo devolver un TQuery?
Código Delphi [-]
 var q:Tquery;
begin
 q :=  CreaQuery('s_query', 'SELECT * FROM CLIENTES');
 q.Open;
end;
Ya en el datamodule:
Código Delphi [-]

procedure TDatamodule.CreateQuery(const Name:string; sql: string):TQuery;
begin
  Result := TQuery.Create(self); // el datamodule se encarga de destruirlo
  Result.Database := // tu objeto Database;
  // configurar las demás propiedades;
 Result.Name := name;
 Result.sql.text := sql;
end;

Tal y como veo la cosa, quizás fuera bueno añadir todas las querys creadas a un TStringList, así los tendrías agrupados, facilitando la destrucción o el acceso a los mismos.

Edito: El problema que veo, es que un datamodule tendrá muchisimas tablas, querys, campos persistentes etc, realizar un bucle con FindComponent por todos ellos hasta encontrar el query deseado puede ser excesivo, con el TStringList, sería como acceder con un IndexOf a un StringList. En el Stringlist, almacenas el nombre del Query (parámetro Name), despues a su objeto asociado, le añades el Query Creado.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 18-10-2006 a las 15:15:04.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TQuery nenufer Conexión con bases de datos 2 22-05-2006 16:41:03
Objeto Ole omy Varios 0 03-02-2006 21:40:32
Problemas con Tquery Coco_jac Varios 4 26-12-2005 18:43:33
ejecutar sp_helpindex con un TQuery Javi2 SQL 0 03-03-2005 11:24:00
objeto ole omy Varios 6 05-11-2003 18:15:54


La franja horaria es GMT +2. Ahora son las 21:03:12.


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
Copyright 1996-2007 Club Delphi