![]() |
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 |
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 |
Cita:
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 |
Otra idea es almacenarlos en tablas o bien, si no quieres motores de bases de datos, en ficheros XML
|
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.... |
Cita:
Un saludo |
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'); Despues, cargo en cada columna, los datos de cada TString. SAludos |
Cita:
Un saludo |
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 :p) - Un componente TlmdStringList en tu formulario. - Un Label. Código:
procedure TForm1.Button1Click(Sender: TObject); 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 |
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. |
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 |
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 |
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 |
Cita:
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 |
Cita:
Para guardar los memos tendrías que hacer algo así: Código:
======== 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 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 :) |
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 |
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^ |
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(); 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. |
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:
Un saludo a todos y muchas gracias |
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. |
La franja horaria es GMT +2. Ahora son las 06:22:09. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi