Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Editando un archivo de texto (https://www.clubdelphi.com/foros/showthread.php?t=53101)

sirsolrac 10-02-2008 23:31:26

Editando un archivo de texto
 
Hola todos.

Tengo este reto para algun ingenioso o muy conocedor del codigo delphi.

He creado un archivo de texto con un programa que basado en delphi. En dicho archivo cada vez que realizo una lectura dentro de mi programa creo una linea nueva de texto (como si fuera un log).

Pero mi problema radica en que necesito que la linea que escribo en el archivo de texto se guarde al inicio y no al final del archivo.

Por ejemplo, este seria mi archivo de texto tal como lo tengo ahorita:
linea 1 (primera linea que se ingresa)
linea 2
linea 3
linea 4 (ultima linea que se ingresa)


Pero el que necesito crear es el siguiente:
linea 4 (ultima linea que se ingresa)
linea 3
linea 2
linea 1 (primera linea que se ingresa)

gracias.

Delphius 10-02-2008 23:38:54

Hola sirsolrac,
¿Cómo estás abriendo el archivo? ¿Con un TStringList?

No tengo delphi a mano, pero este objeto tiene un método Insert().
Este método lo que hace es insertar un texto en determinada posición.

Bastaría con llamarlo así:

Código Delphi [-]
lista.Items.Insert(0,'Esto va al principio');

Y luego guardarlo, aprovechando el SavetoFileName().

Código Delphi [-]
lista.Items.SaveToFileName('C:\..\...');

Como no tengo delphi a mano no puedo comprobar si es items, y el orden de los parámetros.

Si nos aportas detalles podría saber si este método es el más conveniente.

Saludos,

sirsolrac 10-02-2008 23:43:52

esta es la forma en que hago lo del texto.

//escribir resultados en archivo de texto
AssignFile(myFile, 'users.txt');
Append(myFile);
WriteLn(myFile,'');
Write(myFile,'# Tarjeta numero: '+Edit_CardNum.Text+'');
WriteLn(myFile,' ');
Write(myFile,Edit_Block0data.Text+' ' + 'Password = "' + Edit_CardSize.Text+'"',' ' );
WriteLn(myFile,' ');
CloseFile(myFile);

Es mi primer archivo de texto que he creado y no haye otra forma de hacerlo, muy probablemente hay una manera mas optima. Te agradeceria si me ayudas.

PepeLolo 10-02-2008 23:48:05

¡Sencillo!
carga el fichero en un TStrings con tuStrings.loadfromfile(cTuFichero) y añades la línea nueva con tuStrings.Insert(0, cadena), luego lo salvas con tuStrings.savetofile(ctuFichero).

un saludo

Delphius 10-02-2008 23:56:34

sirsolrac,
Siendo esa la manera de trabajar con el archivo. Va a ser un tanto dificil. Porque lo que debes hacer es correr todas las líneas primero y luego sobrrescribir el contenido.

Deberás tener una rutina que haga dicho corrimiento. Para moverse por las líneas tienes a disposición el procedimiento Seek. El funcionamiento de Seek es así:

Código Delphi [-]
Seek(myFile,0);
Con ello te vas al principio y ya puedes ingresar el texto.

Pero antes debes hacer una rutina para mover todo:

1. Abrir el archivo. Con lo cual estarás al final.
2. Ingresas un registro "ficticio".
3. Te mueves 2 valores atrás y lees el valor, ahora te mueves un lugar hacia adelante y lo sobrescribes.
4. Vas decrementando el valor a medida que sobreescribes hasta llegar al comienzo.

Todo se trata de emplear Seek.

Ahora, te podrías evitar ese dolor de cabeza si empleases el Objeto que te comentaba.

Ve probando como te queda el algoritmo. Ya te di una buena pista...

Saludos,

sirsolrac 10-02-2008 23:56:40

Muchas gracias por la ayuda.

Nunca he utilizado la TStrings en delphi, buscare como utilizarla para meter los parametros que me has indicado y te agradesco mucho tu aporte.

Delphius 11-02-2008 00:07:00

sirsolrac, Me parece bien que hayas tenido en cuenta la clase TStrings. Te va resolver muchos problemas.:)

Viendo que recién te inicias aquí sería oportuno darte la bienvenida a estos foros e informarte sobre la guia de estilo.

Antes mayores dudas, ya sabes... aquí estaremos. Pero recomiendo que primeramente, antes de postear, busques si el tema fue tratado con anterioridad.

Saludos,

sirsolrac 11-02-2008 02:32:24

sin ideas
 
Les agradesco mucho su interes por ayudarme y se que ya me han dado las suficientes ideas para poder desarrollar mi aplicacion. Pero por mas que he buscado no encuentro nada especifico que me permita resolver el problema a la hora de escribir el codigo.

Es mi primer programa en delphi y no le hayo como escribir las sentencias utilizando el Tstring con el loadfromfile tal como lo suegerio PepeLolo.

Por cierto tenguna una duda ahi, mi archivo de texto lo tengo que convertir a una lista???

Si me ayudan quizas ya no con ideas sino que con algo de codigo se los agradeceria mucho. Asi de un solo puede quedar un buen ejemplo documentado para compartirlo con cualquier otro entusiasta de delphi.
Muchas gracias.

Delphius 11-02-2008 02:44:02

Cita:

Empezado por sirsolrac (Mensaje 264813)
Les agradesco mucho su interes por ayudarme y se que ya me han dado las suficientes ideas para poder desarrollar mi aplicacion. Pero por mas que he buscado no encuentro nada especifico que me permita resolver el problema a la hora de escribir el codigo.

Es mi primer programa en delphi y no le hayo como escribir las sentencias utilizando el Tstring con el loadfromfile tal como lo suegerio PepeLolo.

Por cierto tenguna una duda ahi, mi archivo de texto lo tengo que convertir a una lista???

Si me ayudan quizas ya no con ideas sino que con algo de codigo se los agradeceria mucho. Asi de un solo puede quedar un buen ejemplo documentado para compartirlo con cualquier otro entusiasta de delphi.
Muchas gracias.

Sería oportuno que nos detalles en forma más presisa que es lo que estás haciendo. En lo posible que nos aportes tu código y en base a ello podemos serte de mayor ayuda.

Para que el código se vea bien copialo y haz clic en un botón que diga "resaltar sintaxis delphi" (el botón que esta al lado que dice SQL).

Si te estás iniciando en delphi te recomiendo leer la Cara Oculta de Delphi 4. En la sección FTP del club lo vas a encontrar.

Saludos,

sirsolrac 11-02-2008 02:59:30

Necesito generar un archivo te texto y escribir siempre en el principio de dicho archivo sin borrar ninguna informacion escrita anteiormente. El codigo para la parte del texto es el siguiente:

Código Delphi [-]
   CardNum: TEdit;
   Block0data: TEdit;
   myFile : TextFile;
   text   : string;

//Aqui escribe en el archivo de texto que previamente ha sido creado
AssignFile(myFile, 'archivotedexto.txt');
Append(myFile);
WriteLn(myFile,'');
Write(myFile,'# Tarjeta numero: '+CardNum.Text+'');  // escirbo una linea dentro del archivo de texto con una variable string
WriteLn(myFile,'  ');
Write(myFile,Block0data.Text+'  ' + 'Dato del bloque = "' + ,'  ' );
WriteLn(myFile,'  ');
CloseFile(myFile);

y esa secuencia se va a ejecutar ciclicamente de manera indefinada para cada lectura que realice mi programa. Les agradeceria si me ayudan con el codigo. De antemano muchas gracias por tomar su tiempo.

Delphius 11-02-2008 03:33:41

El ejemplo que te paso aquí ilustra el uso de un TStringList. Lo primero que se hace es crear el objeto y abrir el archivo.
Con el button1 se van ingresando las lineas. Siempre se van ingresando al final del archivo.
Con el boton2 das por finalizada la operación (simplemente guarda el archivo y lo muestra. se puede seguir ingresando sin problemas).

Y cuando se cierra la aplicación se libera la memoria que ocupa el objeto.

El archivo que se consigue tiene esta forma:

Cita:

# Tarjeta numero: nro2
Dato del bloque = "dato2
# Tarjeta numero: nro1
Dato del bloque = "dato1
Como notarás, primero se ingresaron las lineas nro1 y dato1 y seguidamente nro2 y dato2.

Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    ListBox1: TListBox;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Archivo: TStringList;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   // Creamos el TStringList
   Archivo := TStringList.Create;

   // Abrimos el archivo...
   Archivo.LoadFromFile('C:\Documents and Settings\Marcelo\Escritorio\archivo.txt');
end;

procedure TForm1.Button1Click(Sender: TObject);
var LineaTarjeta, LineaBloque: string;
begin
   // construimos las lineas...
   LineaTarjeta := '# Tarjeta numero:  ' + Edit1.Text;
   LineaBloque := 'Dato del bloque = "' + Edit2.Text;

   // insertamos las lineas en el StringList
   // siempre van desde el comienzo del archivo
   Archivo.Insert(0,LineaTarjeta);
   Archivo.Insert(1,LineaBloque);

   // limpiamos los edits
   Edit1.Text := '';
   Edit2.Text := '';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // aqui guardamos el archivo
  Archivo.SaveToFile('C:\Documents and Settings\Marcelo\Escritorio\archivo.txt');
  ListBox1.Items.Assign(Archivo); 
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // aqui destruimos el objeto
  Archivo.Free;
end;

end.

¿Es esto más o menos lo que deseas conseguir?

Cuando yo decía que aportaras detalles me refería a que profundices sobre el tema, y que expusieras más código del que inicialmente mostraste.
Si haz estado practicando con el TStringList, sería oportuno que expusieras tus resultados.

Saludos,

sirsolrac 11-02-2008 05:25:23

Te agradesco enormemente me hayas ayudado con tu tiempo y conocimiento en programacion.

Pues te comento un poco porque no puse mas del codigo. Como no soy muy bueno programando en delphi mi codigo utiliza un centenar de lineas (se que mas de algun par estan de mas innecesariamente).

No inclui tampoco nada de mis pruebas con TStringList porque solo consegui errores de compilacion que creo k no hubieran abonado nada productivo en la solucion del problema.

Cuando logre adaptar tu codigo en mi programa lo documentare aqui para que a mas de alguien le ayude a futuro. Ya que este es uno de los objetivos, compartir conocimientos con los demas para buscar la superacion de todos.
Muchas gracias a todos, este es un exelente foro.

Delphius 11-02-2008 12:40:06

Cita:

Empezado por sirsolrac (Mensaje 264823)
Te agradesco enormemente me hayas ayudado con tu tiempo y conocimiento en programacion.

Pues te comento un poco porque no puse mas del codigo. Como no soy muy bueno programando en delphi mi codigo utiliza un centenar de lineas (se que mas de algun par estan de mas innecesariamente).

No debes sentirte presionado por el hecho de que seas principiante. No importa que tuvieras muchas o pocas. Para que tu alcanzaras más experiencia y comprendieras fácilmente sería útil ver tu código. No es lo mismo leer código ajeno que el de casa, más si te estás iniciando.

Cita:

Empezado por sirsolrac (Mensaje 264823)
No inclui tampoco nada de mis pruebas con TStringList porque solo consegui errores de compilacion que creo k no hubieran abonado nada productivo en la solucion del problema.

Todo lo contrario. Sería productivo, de esta manera nosotros podríamos saber donde está el error, que lo produce e indicarte las alternativas o maneras de como solucionarlo. De los errores se aprende, y en la programación no es la excepción.

Te recuerdo que no debes mezclar TStringList con los métodos WriteLn,ReadLn, Append, etc.

Cita:

Empezado por sirsolrac (Mensaje 264823)
Cuando logre adaptar tu codigo en mi programa lo documentare aqui para que a mas de alguien le ayude a futuro. Ya que este es uno de los objetivos, compartir conocimientos con los demas para buscar la superacion de todos.
Muchas gracias a todos, este es un exelente foro.

Me alegro que optes por mostrarnos tus avances. Como dices, esto no sólo te beneficia a ti sino al resto de la comunidad.
Aquí estaremos esperando, tu ve tranquilo. Ante problemas tiene la ayuda de Delphi, y clubdelphi.

Saludos,

muppett 15-02-2008 01:18:49

Misma duda pero con memo
 
Yo tengo la misma duda del principio pero yo utilizo un memo y lo guardo es un archivo¿Me podrian ayudar porfa:o?

ixMike 15-02-2008 14:04:59

Cita:

Empezado por muppett (Mensaje 266063)
Yo tengo la misma duda del principio pero yo utilizo un memo y lo guardo es un archivo¿Me podrian ayudar porfa:o?

La propiedad Items de TListBox y la propiedad Lines de TMemo son del mismo tipo (TStrings), así que las puedes tratar igual.

Para leer y guardar un archivo, utiliza los métodos de TStrings SaveToFile y LoadFromFile.


Salu2.

P.D.: No olvides echarle un vistazo a la ayuda de Delphi sobre los componentes y sus propiedades, suele librar de más de un apuro. :)


La franja horaria es GMT +2. Ahora son las 11:45:04.

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