Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Necesito ayuda con el manejo de archivos usando delphi 7 (https://www.clubdelphi.com/foros/showthread.php?t=58222)

coso 13-07-2008 22:29:49

no hace falta que me trates de usted :D. probablemente es que no se graba el archivo

Código Delphi [-]
       ....
        if slFile[i]='*Inicio' then 
        begin
          flgInicio := True;
          continue;
        end;
 
        if (slFile[i]='*Fin' then
        begin
          flgFin := True;   
          continue;
        end;
        
        if (flgInicio=True) and (flgFin=False) then //esto lo puedes simplificar, pero es solo para que se entienda
        begin
               showmessage('Dentro del bucle...')
            slFileNuevo.Add(slFile[i]); //añadimos en el nuevo
        end;
        ...

si, ejecutando el programa, no te aparece este showmessage, es que no se entra. Quiza sea entonces que los marcadores estan incorrectos (ten en cuenta que '*Inicio' es distinto de '*inicio')

coso 13-07-2008 22:31:37

¿puedes poner el codigo de la funcion?

mauser1985 13-07-2008 22:38:35

Si ya coloque los marcadores que son correcos y he ahi donde me sale la excecion Sr Coso si quiere le mando el archivo problema y ahi usted vera que es lo que pasa.... pues el codigo que tengo es el mismo que me han sugerido solo con algunas modificaciones

coso 13-07-2008 22:39:35

no no, ponlo aqui enganchado, en un mensaje, por si a alguien luego le sale el mismo error...

mauser1985 13-07-2008 22:42:46

ok, este es la excepcion...
Project gid_1.exe raised excepcion class EStringlistError with message 'List Index out of bounds (3006)'. Process stopped. Use step or run to continue...

coso 13-07-2008 22:44:08

no, la excepcion no, el codigo

mauser1985 13-07-2008 22:45:26

A ok .

unit gid1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Edit1: TEdit;
Button4: TButton;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
slfile: tstringlist;
slfilenuevo:tstringlist;
filename:string;
Numerofile:integer;
flginicio,flgfin: boolean;
nombre:string;

implementation

{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);


begin

slfile:=tstringlist.create;
slfilenuevo:=tstringlist.create;

if opendialog1.execute then
begin
filename:=opendialog1.filename;
slfile.loadfromfile(filename);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
flginicio:=false;
flgfin:= false;
numerofile:=1;
for i:=0 to slfile.count - 1 do
begin
if slfile[i]= '*Node' then
flginicio:=true;
if slfile[i]= '*Element' then
flgfin:=true;
if (flgInicio=True) and (flgFin=False) then
slFileNuevo.Add(slFile[i+1]);
if flgFin=True then
begin

showmessage(' Holaaaaa ');
slFileNuevo.SaveToFile(nombre+'.bas');
flgInicio := False;
flgFin := False;
Inc(NumeroFile);
end;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);


begin
nombre:= edit1.Text;
end;

end.

coso 13-07-2008 22:59:19

puedes ajuntar tambien el archivo de datos? es secuencial de texto no? yo en principio no le veo ningun fallo (liberar las tstringlist, como mucho)...:confused: (excepto lo comentado antes para no incluir el '*Fin'...) Supongo que pulsaras primero el 1, luego el 4, luego el 2 y finalmente el 3

mauser1985 13-07-2008 23:02:32

es que el archivo es muy largo si quiere me da su mail y se lo mando por correo, no creo que quepa por aqui de verdad

coso 13-07-2008 23:03:04

[email protected]

coso 13-07-2008 23:26:47

si, ya se lo que te ocurre. La linea con el marcador de final no es '*Element', es *Element, type=C3D4', por lo que sigue corriendo hasta llegar al final. La excepcion te debe venir probablemente por pasarte de largo en el numero de lineas (en la linea slFileNuevo.Add(slFile[i+1]), probablemente). Otro detalle, el 1 no esta en la primera columna, sino que aparece ' 1, ...'

por lo tanto : deberas canviar el if slFile[i] = '*Element' por if Pos(slFile[i],'*Element') <> 0 y el slFileNuevo.Add( añadir slFileNuevo.Add(Trim(strscan(PChar(TrimLeft(slFile[i]),',')) . Fijate, a más, en los posts anteriores que se comenta sobre el continue.

saludos

mauser1985 13-07-2008 23:36:01

Sr. Coso modifique todo lo que ud sugirio ya no me sale la excepcion pero el archivo no me lo guarada como antes

coso 13-07-2008 23:36:55

y lo del hola te sale??

coso 13-07-2008 23:38:21

perdon, al reves : Pos('*Element',slFile[i]) :) altas horas ya por aqui

mauser1985 13-07-2008 23:42:19

Buerno disculpe la molestia de verdad que verguenza con usted es que esto ya me tiene de cabeza, le acabo de modificar el pos, y ni me graba el archivo ni me sale el mensaje hola...

begin
flginicio:=false;
flgfin:= false;
numerofile:=1;
for i:=0 to slfile.count - 1 do
begin
if slfile[i]= '*Node' then
flginicio:=true;
continue;
if Pos('*Element, type=C3D4',slFile[i]) <> 0 then
flgfin:=true;
continue;
showmessage(' Holaaaaa ');
if (flgInicio=True) and (flgFin=False) then
slFileNuevo.Add(slFile[i]);

if flgFin=True then
begin
slFileNuevo.Add(Trim(strscan(PChar(TrimLeft(slFile[i])),',')));

slFileNuevo.SaveToFile(nombre+'.bas');
flgInicio := False;
flgFin := False;
Inc(NumeroFile);
end;
end;
end;

coso 13-07-2008 23:43:35

no, if Pos('*Element',slFile[i]) <> 0...

mauser1985 13-07-2008 23:45:25

nada no me guarda el archivo

coso 13-07-2008 23:55:44

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
        ls,lg : TStringList;
        i, n ,r : longint;
        nm,ns : string;
begin
        if OpenDialog1.Execute then nm := OpenDialog1.Filename else exit; // cogemos nombre a cargar
        ls := TStringList.Create;  // creamos lista
        lg := TStringList.Create;  // creamos lista
        ls.LoadFromFile(nm); // cargamos fichero
        ns := ExtractFilePath(Application.Exename) + '\' + Edit1.Text; // preparamos nombre destino
        r := ls.Count; // numero lineas de fichero
        i := 0;
        n := 0;
        while i < r do 
        if Pos('*Node',ls[i]) <> 0 then // si se encuentra '*Node' en ls[i]...
        begin
          inc(i); // para saltar la linea con el node
          inc(n); // numero archivo
          while (Pos('*Element',ls[i]) = 0) and (i < r) do // mientras no se encuentra element y no se ha llegado al final
          begin
            lg.Add(Trim(strscan(PChar(TrimLeft(ls[i])),','))); // añadimos, eliminando la primera columna
            inc(i);
          end;
          lg.SavetoFile(ns + inttostr(n) + '.txt'); // se ha encontrado element o final, grabamos
        end
        else inc(i); // si no, seguimos
        ls.Free; // liberamos
        lg.Free;
end;

es raro, el codigo anterior parecia que no tuviese ningun error. Mañana le echare un vistazo. Este funciona.

mauser1985 14-07-2008 00:05:02

Muchas gracias Sr Coso ahora con este codigo si me guarda lo que espero

coso 14-07-2008 00:05:26

Código Delphi [-]
if slfile[i]= '*Node' then
begin
flginicio:=true;
continue;
end;
if Pos('*Element',slFile[i]) <> 0 then
begin
flgfin:=true;
continue;
end;


La franja horaria es GMT +2. Ahora son las 20:37:24.

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