Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Error con AdoQuery y 2 Form (https://www.clubdelphi.com/foros/showthread.php?t=61046)

Dado de baja 23-10-2008 07:44:06

Error con AdoQuery y 2 Form
 
Hola.
He creado una pequeña aplicación para uso propio que tira de MySql para guardar una lista de Archivos de respaldo en DVD. :)

Hasta ahora tenía un form principal y un DataModule. En este último un método que es que uso para recoger y guardar datos en la tabla.

Código Delphi [-]
procedure TTDM.GetSql(consulta:string; var ds:Tdataset);
begin
  if not ADCON.Connected then
     ADCON.Connected:=true;

  ADQ.Close;
  adq.SQL.Clear;
  adq.SQL.Text:=consulta;
  adq.Open;
  ds:= adq;

END;

El problema viene cuando al crear una nueva form donde obtengo una lista de archivos agrupados por categorías con el núm de elementos:

Código Delphi [-]
Procedure Tform4.cargaCat;
var
  s: string;
  ds: TdataSet;
begin
s:='Select Categoria, count(*) as n from catdvd group by categoria';
ds:=Tdataset.Create(self);
Tdm.GetSql(s,ds);
with ListBox1 do
begin
  items.Clear;
  ds.First;
  while not ds.Eof do
  begin
    s:=ds.FieldByName('categoria').AsString;
    s:=s+'  ('+ds.FieldByName('n').AsString+')';
    items.Add(s);
    ds.Next;
  end;
end;
ds.Free;
end;

Aquí va todo correctamente, se muestran las categorías y todo.

Pero tras cerrar esta form, cuando hago cualquier nueva consulta desde la form principal da un error de "Access Violation at address..."

Esto pasa siempre que invoco al form de categorías. Y pasa al intentar cerrar el AdoQuery para una nueva consulta.

¿ que puede ser ?

He mirado todo, que no se quede abierto ningun DataSet, que la form de categorías se libere tras cerrarla y no doy con el problema.

Caro 23-10-2008 13:44:52

Hola Cecilio, el error creo que te da por esta parte:

Aquí le pasas un dataset como parametro y cuando haces tu consulta con adq le asignas a ds, supongo que adq es un componente que debe estar en tu formulario o tu dataModule.

Código Delphi [-]
procedure TTDM.GetSql(consulta:string; var ds:Tdataset);
begin
  .......................
  ds:= adq;
end;

Y aquí despues de llamar a GetSql liberas ds, pero como en tu metodo le has asignado adq a ds, ambos estan apuntando a la misma dirección de memoria por lo tanto, si liberas uno se libera también el otro. Y al hacer nuevamente la llamada como no estas creando Adq en ejecución, te da el error del AccessViolation.

Código Delphi [-]
Procedure Tform4.cargaCat;
begin
 ds:=Tdataset.Create(self);
 Tdm.GetSql(s,ds);
 .............................
 .............................
 ds.Free;
end;

Porque no trabajas directamente sobre el DataSet que le mandas por parametro.

Código Delphi [-]
procedure TTDM.GetSql(consulta:string; var AdoQuery:TAdoQuery);
begin
  if not ADCON.Connected then
     ADCON.Connected:=true;
  
  AdoQuery.Connection := ADCON;

  AdoQuery.Close;
  AdoQuery.SQL.Clear;
  AdoQuery.SQL.Text:=consulta;
  AdoQuery.Open;
end;

Código Delphi [-]
Procedure Tform4.cargaCat;
var
  s: string;
  ds: TAdoQuery;
begin
  s:='Select Categoria, count(*) as n from catdvd group by categoria';
  ds:=TAdoQuery.Create(self);
  Tdm.GetSql(s,ds);

  with ListBox1 do
  .....................

Saluditos

Dado de baja 23-10-2008 17:37:04

Gracias caro

A simple vista creo que tienes razón, no me he dado cuenta que al liberar uno lo hacía con el otro.

Voy a probarlo. Sinceramente Gracias.


La franja horaria es GMT +2. Ahora son las 12:02:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi