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 19-03-2004
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
Guardar varios memos en un archivo

Estoy diseñando (Delphi 6) una aplicación de escritorio que consta de un PageControl y cinco TabSheet con un Memo cada uno.
Existe la posibilidad de que el usuario cree nuevos Tabshett en tiempo de ejecución.
Mi pregunta es la siguiente ¿Cómo guardar el contenido de todos los memos en sólo un archivo?
Tengo la idea de que se podría hacer con un archivo de registro (record) con variables String a las que se asignen los memos. Pero no sé cómo guardarlas y luego se carguen nuevamente en sus memos correspondientes.
Les agradecería me orienten.
Muchas gracias y hasta pronto
Responder Con Cita
  #2  
Antiguo 19-03-2004
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Lightbulb

No estoy mui seguro, pero quizás pudieras usar ficheros .ini que te permiten guardar en diferentes secciones.

lo que me hace dudar es la cantidad de texto que puede haber en cada memo, no se si los .ini te dejarán meter tanto texto en una variable pero podrías probarlo

Saludos yusnerqui
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #3  
Antiguo 20-03-2004
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
Cita:
Empezado por yusnerqui
No estoy muy seguro, pero quizás pudieras usar ficheros .ini que te permiten guardar en diferentes secciones.
Lo que me hace dudar es la cantidad de texto que puede haber en cada memo, no se si los .ini te dejarán meter tanto texto en una variable pero podrías probarlo

Saludos yusnerqui
Gracias por la respuesta yusnerqui. No sé cómo implementar su sugerencia.
Si lo pudés aclarar un poco más me harías un favor. Lo mismo si aparece otra idea.
Me pregunto si no será necesario hacer una base de datos para resolver esto. Pero no lo tengo para nada claro.
Un saludo y hasta pronto
Responder Con Cita
  #4  
Antiguo 21-03-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Otra idea es almacenarlos en tablas o bien, si no quieres motores de bases de datos, en ficheros XML
Responder Con Cita
  #5  
Antiguo 21-03-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
y porque todos en un solo archivo???

Tambien podes crear un archivo por cada memo, y valerte de los métodos SaveToFile y LoadFromFile de su propiedad lines....
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 21-03-2004
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
Cita:
Empezado por jachguate
y porque todos en un solo archivo???

Tambien podes crear un archivo por cada memo, y valerte de los métodos SaveToFile y LoadFromFile de su propiedad lines....
Es cierto que podría hacerlo de esa manera. Lo que pasa es que el modo de guardar en un sólo archivo lo he visto en muchas aplicaciones trial que trato de imitar para aprender a resolver los problemas que me plantean.
Un saludo

Última edición por esocrates fecha: 21-03-2004 a las 14:39:50.
Responder Con Cita
  #7  
Antiguo 21-03-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Bueno, no es exactamente una solucion.... pero en fin,.....

Las lmdtools hacen lo que quieres con el componente LmdstringList.

Es un "TStringsList" de Tstrings que hace lo que deseas.

Yo uso la version Freeware, LMDTOOLS V.6 Special Edition.


Código:
LMDstr.LoadFromFile('c:\strings.txt');

grid.RowCount:= LMDstr.Items[0].Items.Count; 

for i:=0 to LMDstr.Count-1 do 
  grid.Cols[i].Assign(LMDstr.Items[i].items);
Con este código, asigno primero las filas del StringGrid,
Despues, cargo en cada columna, los datos de cada TString.

SAludos
Responder Con Cita
  #8  
Antiguo 21-03-2004
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
Cita:
Empezado por Lepe


Código:
LMDstr.LoadFromFile('c:\strings.txt');

grid.RowCount:= LMDstr.Items[0].Items.Count; 

for i:=0 to LMDstr.Count-1 do 
  grid.Cols[i].Assign(LMDstr.Items[i].items);
Con este código, asigno primero las filas del StringGrid,
Despues, cargo en cada columna, los datos de cada TString.

SAludos
Hola Lepe. Gracias por tu aporte. No comprendo a partir del código sugerido cómo ingreso el contenido de cinco Memos y luego restituyo a cada uno el texto guardado en el LmdstringList.
Un saludo
Responder Con Cita
  #9  
Antiguo 21-03-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Bueno.... en principio no sabia si usabas las LmdTools, así que puse un esbozo de como sería. A continuacion tienes algo mas serio.

Necesitas en un Form:
- tres botones (Tbutton)
- tres memos ( no hace falta que salgas a la calle a buscar ninguno..... con los de la paleta Standar de delphi ya vale )
- Un componente TlmdStringList en tu formulario.
- Un Label.

Código:
procedure TForm1.Button1Click(Sender: TObject);
var i,j,k:Integer;
    v : TLMDListItem;
begin
for k := 0 to 2 do   // vamos a añadir 3 TlmdStringList
begin
  j:=  LMDStringList1.Add(v);  // en j recogemos el indice del recien creado TlmdStringList
  for i:= 0 to 2 do
    LMDStringList1.Items[j].Items.Add('StringList nº ' + IntToStr(j)+ ' linea '+ IntToStr(i));
    //añadimos varias lineas indicando en que Stringlist está y el nº de cada linea
    // esto seria el contenido de cada memo
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
LMDStringList1.SaveToFile('c:\mismemos.txt'); // pos eso 
end;

procedure TForm1.Button3Click(Sender: TObject);
var i:Integer;
begin
LMDStringList1.LoadFromFile('c:\mismemos.txt');   // pos vale, pos me alegro
label1.Caption := ' Total de TLmdStringList: '+IntToStr(LMDStringList1.Count);

  // items[0]  es el primer StringList Creado
  // Items[0].items son las lineas de cada memo.
  Memo1.Lines.Assign(LMDStringList1.Items[0].items);
  Memo2.Lines.Assign(LMDStringList1.Items[1].Items);
  Memo3.Lines.Assign(LMDStringList1.Items[2].Items);
end;
Arrancas el programa, pulsas el boton 1, despues el 2 y por ultimo el 3 y verás como se leen desde el archivo c:\mismemos.txt los 3 stringlist y se ponen en el memo correspondiente.

Da la casualidad que me hoy mismo he estado trabajando con este componente para guardar las columnas de un StringGrid en un único archivo, por eso te puse ese código mas bien rarito.




Con este codigo no creo que tengas problemas, y si los tienes, ya sabes

Saludos desde Lepe
Responder Con Cita
  #10  
Antiguo 21-03-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Logicamente ese código es para empezar... despues tendrás que hacer algo más.

Por ejemplo, en lmdstringList1.items[0].Description puedes guardar... no sé, el TabIndex del tabSheet, y despues, al cargar el LMDStringList, accedes a esa propiedad, la conviertes a un nº entero, y creas la pagina del TabSheet, el memo, y por ultimo le asignas las Lineas.

Espero haberme explicado.
Responder Con Cita
  #11  
Antiguo 21-03-2004
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
Muchas gracias Lepe. Ya tengo el Control y lo voy a ensayar con tus instrucciones. Veremos qué pasa y te cuento.
Un saludo y hasta pronto
Responder Con Cita
  #12  
Antiguo 22-03-2004
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
Hola Lepe, He puesto en práctica el control y el modelo de código que me facilitaste. Consigo hacer algunas cosas interesantes pero no lo que pretendo lograr que es guardar el contenido de varios memos en un sólo archivo y rescatar los textos en los memos correspondientes.
Intento con una variable TStrings a la que asigno el memo y me da un error de acceso y si lo intento con una variable String me devuelve el error de incompatibilidad entre tipos String y TStrings.
En fin estoy trabado. Acepto sugerencias sobre este control o de otra índole.
Un saludo y hasta pronto
Responder Con Cita
  #13  
Antiguo 22-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Realmente no entiendo esto de querer guardar todo en un sólo archivo pero podrías intentarlo usando ClientDataSets. Guardas los memos como si fuera una base de datos pero todo te queda en un sólo archivo.

// Saludos
Responder Con Cita
  #14  
Antiguo 23-03-2004
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
Cita:
Empezado por roman
Realmente no entiendo esto de querer guardar todo en un sólo archivo pero podrías intentarlo usando ClientDataSets. Guardas los memos como si fuera una base de datos pero todo te queda en un sólo archivo.

// Saludos
Hola Roman. Lo que intento hacer es una aplicación que imita a tantas otras que se encuentran por la Web. Se trata de un editor para escritores o para escribir un diario. Consta de un PageControl y cinco TabSheet con un Memo cada uno. Existe la posibilidad de que el usuario cree nuevos Tabshett en tiempo de ejecución.
Lo que se intenta es que el usuario al cerrar el programa deje todo lo escrito en cada uno de los memos guardado en un solo archivo [las aplicaciones de referencia así lo hacen] y que permita luego rescatar los textos en cada memo de donde fueron escritos. Por ej. En cada memo podría ir un capítulo de un libro a algo por el estilo.
Esto lo hago para estudiar Delphi. Imito otras aplicaciones para resolver problemas. Pero esta vez estoy detenido.
Se me ocurre que el asunto pasa por una base de datos; pero no sé cómo es esto de guardar en tablas y mandarlas a los memos por ej.
Espero haber sido claro en lo que me propongo.
Intentaré algo con tu sugerencia.
Un saludo y gracias

Última edición por esocrates fecha: 23-03-2004 a las 00:36:25.
Responder Con Cita
  #15  
Antiguo 23-03-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Intento con una variable TStrings a la que asigno el memo y me da un error de acceso y si lo intento con una variable String me devuelve el error de incompatibilidad entre tipos String y TStrings.
No he entendido a que te refieres

Para guardar los memos tendrías que hacer algo así:
Código:
// Si el usuario decide guardar todo y salir de la aplicación

const MaxMemos = 5 ; // tendrás alguna forma de saber cuantos hay.
// lo más lógico sería guardarlo en un archivo ini
// Busca en el foro por "TiniFile"

var i,j,k:Integer;
    v : TLMDListItem;
begin
for k := 0 to MaxMemos do   // para cada memo
begin
  j:=  LMDStringList1.Add(v);  // vamos a guardarlo en este TString
    LMDStringList1.Items[j].Items.Assign(Memos[i].lines);
    LMDStringList1.SaveToFile('c:\mismemos.txt'); 
end;

end;
Memos[i]
========
De alguna forma tienes que saber cuantos memos hay creados, para poder acceder a ellos en tiempo de ejecución. Lo que se me ocurre de momento, es tener un array de TMemos, y hacer que apunte a los memos del PageControl.

Desde mi punto de vista, si optas por usar un LMDSTRINGLIST, ya tienes resulto el problema de guardar 4 o 40 memos. Ahora el problema sería mantener una lista de los TabSheet que hay abiertos.

Código:
var  Memos : array of TMemo; // creamos un array de memos
procedure CargarDesdeArchivo;
begin
  setlength(Memos, MaxMemos); // un array de 5 Memos

//   cuando creas un memo en tiempo de ejecución  tendrías que hacer algo parecido a esto:

  LMDStringlist1.loadfromfile('c:\Mismemos.txt');
  for i:=0 to MaxMemos do
  begin
    MisMemos[i]:= MemoCreadoEnEjecucion; // mismemos[i] apuntará al memo creado
    MisMemos[i].Lines.Assign(LMDstringList1.items[i].items);
  end;
end;
Que conste que lo he escrito de memoria... y tiene inconvenientes, ya que de momento el array contiene tantos memos como se cargan al inicio del programa; cuando se crea un nuevo memo, habría que crear espacio en el array MisMemos y añadirlo. Igualmente cuando se elimina uno... o sea, DEMASIADO trabajo de "mantenimiento". Mas facil puede resultar un TObjectList, (busca por el foro, hay algunos temas). Igual me estoy yendo por los cerros de Úbeda, (como decimos por mi tierra).

Lo que comenta Roman del ClientDataset, no lo he mirado, pero desde luego, puede ser la solución a implementar el programa con componentes nativos de delphi, en lugar de recurrir a componentes de terceros (LMDStringList)

Saludos
Responder Con Cita
  #16  
Antiguo 24-03-2004
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
Hola Lepe:
He estado probando tu solución que me parece más que interesante. Lo hago con una aplicación sencilla. Un simple formulario con tres Memos y dos botones (Uno para guardar y otro para cargar el archivo guardado) [Lo de crear otros en tiempo de ejecución lo dejo para otro momento hasta que aprenda esto].
El compilador protesta, porque la variable "v" no está asignada, con el mensaje "Access Violation". Pruebo de distintas maneras y no consigo solucionarlo.
Si se te ocurre algo que me ayude te lo agradeceré mucho.
Aclaro que no es urgente. Sólo estoy experimentando en el tema para ver si puedo avanzar un poquito más en Delphi.
Un saludo y gracias
Responder Con Cita
  #17  
Antiguo 25-03-2004
Avatar de Magician^
Magician^ Magician^ is offline
Miembro
 
Registrado: mar 2004
Ubicación: Lima - Perú
Posts: 74
Poder: 21
Magician^ Va por buen camino
Bueno, parece que me estoy volviendo adicto al FORO

Yo haría lo siguiente, definiría mi propio tipo de archivo de datos, y usaría algo así como los tags de html para identificar que texto debe ir a que Memo, la ventaja de tu aplicación es que el texto debe de ser leido cuando la aplicación inicia y guardado cuando se cierra, lo que facilita nuestra tarea pues no tenemos que escribir en el archivo las modificaciones que se van realizando durante la escritura.
Ahora para evitar que un usuario escribiera determinado "TAG" en el texto y este se malinterpretara usaría caracteres especiales, de control o códigos de escape por ejemplo podriamos tener un archivo así:
:<nmemos=5>
:<memo 1>
Aqui va el texto para el
primer Memo, podemos colocar
todo lo que querramos
:<end>
:<memo 2>
Esto sería para el segundo memo
bla bla bla bla bla bla bla bla
:<end>
...
:<memo 5>
sdfpojawn awpdfiojn apifnpaowuf apwouif
awlfijnaw fkjn awñofun ñawjklfn
awfñkjn wfñlkjawfn awñofjna wf
:<end>

Como puedes ver el primer tag le indica al programa cuantos memos existen entonces cuantos tabsheet debes de crear, luego seguimos leyendo el archivo y encontramos el tag <memo 1> que indica que el texto que leamos a continuacion va a ir en el primer memo hasta que encontremos el tag <end> y asi para los demás memos.
ojo que nuestra convención es que si la línea comienza con los caracteres ":<" se trata de un "tag" también podemos sustituirlos por caracteres de control o de escape: #27 etc.

La rutina de lectura de este tipo de archivo sería sumamente sencilla además de rápida y llenar los memos también.

Salu2

MAGICIAN^
Responder Con Cita
  #18  
Antiguo 25-03-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Bueno, a mi me aparece un Warning, diciendo que v puede no estar inicializado, mirando un poco mas el método Add del TLMDStringList, puedes tambien escribir esto:

Código:
   j:= TlmdStringList.Add();
   if j = -1 then 
       showMessage('No se ha podido crear el elemento.
                    Reinicie windows que ya le va haciendo falta :-P   ');
Al escribir el código no me fijé que el parámetro que espera Add es OPCIONAL, por eso puse una variable de tipo TLMDListitem.

El Hecho de que a mi me deje compilar y funcione, supongo que será por las opciones que tengo activadas en el compilador.... pero eso es otra historia.

Un detalle, yo no miro posibles errores, según la documentacion del TLMD.STringlist.Add, devuelve -1 si no ha podido crear el nuevo item, no estaría mal hacer la comprobación de error correspondiente.


Saludos.
Responder Con Cita
  #19  
Antiguo 25-04-2004
esocrates esocrates is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 210
Poder: 21
esocrates Va por buen camino
A propósito de la respuesta de Magician^

De las diversas respuestas que me han dado la de Magicinan^ es la que no puedo instrumentar. Voy probando todas porque estoy estudiando el tema.
Lo que Magician^ propone es lo siguiente:

Cita:
Yo haría lo siguiente, definiría mi propio tipo de archivo de datos, y usaría algo así como los tags de html para identificar que texto debe ir a que Memo, la ventaja de tu aplicación es que el texto debe de ser leido cuando la aplicación inicia y guardado cuando se cierra, lo que facilita nuestra tarea pues no tenemos que escribir en el archivo las modificaciones que se van realizando durante la escritura.
Ahora para evitar que un usuario escribiera determinado "TAG" en el texto y este se malinterpretara usaría caracteres especiales, de control o códigos de escape por ejemplo podriamos tener un archivo así:
:<nmemos=5>
:<memo 1>
Aqui va el texto para el
primer Memo, podemos colocar
todo lo que querramos
:<end>
:<memo 2>
Esto sería para el segundo memo
bla bla bla bla bla bla bla bla
:<end>
...
:<memo 5>
sdfpojawn awpdfiojn apifnpaowuf apwouif
awlfijnaw fkjn awñofun ñawjklfn
awfñkjn wfñlkjawfn awñofjna wf
:<end>

Como puedes ver el primer tag le indica al programa cuantos memos existen entonces cuantos tabsheet debes de crear, luego seguimos leyendo el archivo y encontramos el tag <memo 1> que indica que el texto que leamos a continuacion va a ir en el primer memo hasta que encontremos el tag <end> y asi para los demás memos.
ojo que nuestra convención es que si la línea comienza con los caracteres ":<" se trata de un "tag" también podemos sustituirlos por caracteres de control o de escape: #27 etc.

La rutina de lectura de este tipo de archivo sería sumamente sencilla además de rápida y llenar los memos tambié
Le agradería mucho a Magician^ u otro miembro del Foro me dé algún ejemplo que ilustre la propuesta. Me parece interesante y muy útil.
Un saludo a todos y muchas gracias
Responder Con Cita
  #20  
Antiguo 27-04-2004
Avatar de Magician^
Magician^ Magician^ is offline
Miembro
 
Registrado: mar 2004
Ubicación: Lima - Perú
Posts: 74
Poder: 21
Magician^ Va por buen camino
Pues si me indicas en que parte tienes dificultades te podre ayudar mejor, básicamente se trata de leer un archivo de texto, linea a linea, verificar si la linea leida es uno de nuestros "tag" y procesar la información que continúa segun indique el "tag" hasta encontrar la señalización de fin (":<end>" en el ejemplo).
al leer la primera línea ya sabrias cuantos memos tienes que crear en forma dinámica, para saber si una linea es un "tag" puedes usar la siguiente comparación, asumiento q en la variable S esta la linea de texto leida del archivo:
if RightStr(S,2)=':<' then // aquí ya sabes q es un tag.
Para saber si se trata de un tag en particular examina el texto antes del signo '=' y para el valor (como por ejemplo el numero de memos) convierte con un strtoint el valor comprendido entre el = y el final de la cadena menos 1 (para quitar el '>'):
tag=copy(S,3,Pos('=',S)-1); Con esto obtienes el tag en una cadena.
tagvalue=strtoint(copy(S,Post('=',S)+1,Length(S)-1)); y con esto el valor si es necesario.

Para crear el archivo, usa el rewrite, grabas primero el tag con el numero de memos y luego la información segun el formato del ejemplo.

En realidad la lógica es sencilla, cuando tengas listo el programa te va a sorprender lo pequeño y simple q resultó.

Nuevamente mi consejo es que en vez de usar ':<' uses algun tipo de secuencia de códigos de escape no vaya a ser q tu usuario justo se le ocurra escribir al comienzo de una linea ":<end" y el programa lo interprete como un tag. Aunque esto es algo exagerado, pero hay usuarios y usuarios!!

Saludos.
__________________
MAGICIAN^
Lima - Perú
=======
MagicTech.blogspot.com
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


La franja horaria es GMT +2. Ahora son las 15:27:24.


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