Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ejecutar objeto Tquery (https://www.clubdelphi.com/foros/showthread.php?t=36588)

bbjb 17-10-2006 18:49:55

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???

Enan0 17-10-2006 19:40:08

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.

seoane 17-10-2006 19:54:30

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;

bbjb 18-10-2006 09:27:22

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

Lepe 18-10-2006 15:04:13

¿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


La franja horaria es GMT +2. Ahora son las 12:38:09.

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