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 16-12-2008
Cecilio Cecilio is offline
Miembro
 
Registrado: ago 2007
Posts: 140
Poder: 17
Cecilio Va por buen camino
Algo extraño con TstringList

Hola a todos.

He creado un pocedimiento que exporta tablas de Ib a ficheros de texto.

Los nombres de los campos los extraigo usando un TStringList.

pero al liberar el stringlist da un error:

Código Delphi [-]
  gs:=TstringList.Create;
  gs:=ibb.FieldList;
  s:='';
  for v:=0 to gs.Count-1 do
      s:=s+gs[v]+';';
  writeln(t,s);
  gs.free;
...
...
sigue el resto de código sin dar error.
end;

Lo curioso es que el método continua sin problemas y hace la exportación correctamente. Pero al finalizar el procedimiento da el error.

Si quito el gs.free ya no da error.

¿ es porqué pude ser ?
__________________
Saludos Cordiales.
------------------

Responder Con Cita
  #2  
Antiguo 16-12-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Creo que hace falta un poco más de código. ¡Ah! Y el mensaje de error en cuestión...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 16-12-2008
Cecilio Cecilio is offline
Miembro
 
Registrado: ago 2007
Posts: 140
Poder: 17
Cecilio Va por buen camino
Esa es la parte que escribe la lista de nombres de campos. En el resto del código no se hace referencia a ese objeto, por eso lo libero nada más terminar.

De todas formas voy a poner el procedimiento completo.
Código Delphi [-]
procedure TForm1.Generico(tb: string);
var
   s: string;
   t: TextFile;
   n,v: integer;
   gs: TstringList;
   ibb: TIBquery;

begin

  AssignFile(t,destino.Text+tb+'.txt');
  rewrite(t);

 if not IBDatabase1.Connected then
  begin
    IBDatabase1.DatabaseName:=server.Text;
    ibDatabase1.Connected:=true;
  end;
  ibb:= TibQuery.Create(nil);
  ibb.Database:=Ibdatabase1;
  ibb.Transaction:=IbTransaction1;

  Ibb.SQL.Add('select * from '+tb);
  ibb.Open;
  ibb.First;
  ibb.Last;
  Progressbar1.Max:=Ibb.RecordCount;
  progressbar1.Position:=0;

  gs:=TstringList.Create;
  gs:=ibb.FieldList;
  s:='';
  for v:=0 to gs.Count-1 do
      s:=s+gs[v]+';';
  writeln(t,s);

  ibb.First;
  n:=0;
  while not ibb.Eof do
  begin

     s:='';
     for v:=0 to ibb.FieldCount-1 do
      s:=s+ibb.Fields.Fields[v].AsString+';';

     writeln(t,s);

     inc(n);
     progressbar1.Position:=n;
    ibb.Next;
  end;
closeFile(t);
ibb.Close;
ibb.Free;
//gs.Free;

end;
(en este, he probado a ponerlo al final y solo no da error cuando está comentado y no actua.)

El error es algo como: "Exeception class EAccessViolation with message "Access violation at adress 000000. Read of adress 000000. Proced stoped"
Lo genera el debuger, creo.
__________________
Saludos Cordiales.
------------------

Responder Con Cita
  #4  
Antiguo 16-12-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
el error esta en que estas eliminando gb = ibb.fieldlist directamente. Puedes, o bien usar el assign

Código Delphi [-]
gs := TStringList.Create;
gs.Assign(ibb.FieldList)
....
gs.Free;

o bien trabajar directamente con ibb.FieldList, sin liberarlo
Responder Con Cita
  #5  
Antiguo 16-12-2008
Cecilio Cecilio is offline
Miembro
 
Registrado: ago 2007
Posts: 140
Poder: 17
Cecilio Va por buen camino
¡¡¡ Efectivamente !!!

Ahora va genial. Por curiosidad. ¿ poqué funciona con Assign ?

Si de camino alquien quiere mejorar el código que he puesto mejor, así aprendo directamente de los maestros.
__________________
Saludos Cordiales.
------------------

Responder Con Cita
  #6  
Antiguo 16-12-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Uf, estoy muy muy liado, si no ya le echaba un vistazo. En cuanto al assign, cuando tu usas un igual, =, con objetos lo que verdaderamente estas haciendo es decir que la dirección de memoria de uno va a ser la misma que la del otro. Asi que lo que tu hacias era crear un objeto TStringList con cierta dirección de memoria, y luego en esa misma variable poner la dirección de memoria del ibb.FieldList (por lo que la otra se perdia en el limbo). Luego al llegar al free, lo que estabas liberando era ibb.FieldList mediante la variable gb. Assign lo que hace (y una consulta al f1 siempre va bien ) es copiar todas las propiedades de un objeto a otro.
Responder Con Cita
  #7  
Antiguo 16-12-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
[quote=Cecilio;331090Si de camino alquien quiere mejorar el código que he puesto mejor, así aprendo directamente de los maestros. [/quote]

Hola cecilio, la diferencia entre el Assign y el igual ya te lo ha explicado el amigo coso. También puedes utilizar el procedimiento GetFieldNames que te devuelve la lista de campos de tu DataSet en el TString que le pases como parametro y para grabar en tu archivo puedes hacerlo direcatmente con SaveToFile de tu StringList.

Tu codigo quedaría así mas o menos

Código Delphi [-]
procedure TForm1.Generico(tb: string);
var
   s: string;
   n,v: integer;
   slCampos, slDatos: TstringList;
   ibb: TIBquery;
begin
 if not IBDatabase1.Connected then
  begin
    IBDatabase1.DatabaseName:=server.Text;
    ibDatabase1.Connected:=true;
  end;
  ibb:= TibQuery.Create(nil);
  ibb.Database:=Ibdatabase1;
  ibb.Transaction:=IbTransaction1;

  Ibb.SQL.Add('select * from '+tb);
  ibb.Open;

  slCampos :=TstringList.Create;
  slDatos :=TstringList.Create;
 
Try
  ibb.First;
  ibb.Last;
  Progressbar1.Max:=Ibb.RecordCount;
  progressbar1.Position:=0;

  ibb.GetFieldNames(slCampos);

  s:='';
  for v:=0 to slCampos.Count-1 do
      s:=s+slCampos[v]+';';
  
  slDatos.Add(s);

  ibb.First;
  n:=0;
  while not ibb.Eof do
  begin

     s:='';
     for v:=0 to ibb.FieldCount-1 do
      s:=s+ibb.Fields.Fields[v].AsString+';';

     slDatos.Add(s);

     inc(n);
     progressbar1.Position:=n;
    ibb.Next;
  end;//While
  slDatos.SaveToFile('C:\file.txt');
Finally
 ibb.Close;
 ibb.Free;
 slCampos.Free;
 slDatos.Free;
end;//try
end;

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #8  
Antiguo 16-12-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

Aquí hay otro ejemplo de cómo vaciar el contenido de un conjunto de datos a un CSV: http://www.youcantwin.com/dasblogce/...SaveToCsv.aspx

Se menciona a los Client Data Sets, pero la función sirve con cualquier otro tipo de conjunto de datos.

Pero, al igual que Linett, creo que yo también emplearía un TStringList y vaciaría el contenido a disco con el método SaveToFile, en lugar de usar las antiguas y entrañables funciones para manejo de archivos de Pascal.

Un vaciado abrazo.

Al González.
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
extraño error con TStringList lookmydoom OOP 4 11-01-2007 22:38:50
Algo Extraño Esau Varios 2 28-05-2006 17:50:04
Algo un poco extraño JerS Varios 1 19-10-2005 22:22:56
Es algo importante ejecución de .exe y algo más ayúdenme kakesoft Varios 5 02-05-2005 10:01:14


La franja horaria es GMT +2. Ahora son las 13:07:25.


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