Ir al contenido


Foto

[RESUELTO] Actualizar fichero .INI


  • Por favor identifícate para responder
35 respuestas en este tema

#1 fleming

fleming

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 11 septiembre 2010 - 09:21

Hola, estube buscando pero no encontre lo que necesitaba hay manera en delphi de hacer un formulario donde se pueda actualizar 2 archivos distintos con las mismas variables pero.. dichos dos archivos se repiten en distintas carpetas?.

La variable a actualizar es.:

[Version]
Ver =1.0.0.0 <----------- Los numeros.


y los .ini van dentro de Carpeta1/settings/archivo1.ini , y archivo2.ini los dos tienen la misma variables pero la idea es actualizarlos todos desde ese formulario, ya que son + de 30!
  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 12 septiembre 2010 - 02:02

Buenas,

Para el manejo de ficheros ini tienes la clase TIniFile declarada en la unit IniFiles. Dale un vistazo a la ayuda, verás que es sencilla de hacer funcionar :)

Un pequeño ejemplo:



delphi
  1. function TFicherosIni.GetStrValue(const Section, key: string): String;
  2. var
  3.   Ini: TIniFile;
  4. begin
  5.   Result := 'ERROR';
  6.  
  7.   if NameIni = '' then
  8.   begin
  9.     TDialogos.MsjErr(errIniNotDef, []);
  10.     Exit;
  11.   end;
  12.  
  13.   Ini := TIniFile.Create(NameIni);
  14.   try
  15.     Result := Ini.ReadString(Section, key, 'ERROR');
  16.   finally
  17.     FreeAndNil(Ini);
  18.   end;
  19. end;



Nos leemos

  • 0

#3 Khronos

Khronos

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 56 mensajes

Escrito 12 septiembre 2010 - 05:16

La clase TIniFile en ocasiones funciona mal, emplea la API de Windows para trabajar con ficheros .ini.

Mejor usa la clase TCustomIniFile que emplea la VCL de Delphi para trabajar con ellos.

Saludos.
  • 0

#4 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 12 septiembre 2010 - 07:57

Buenas,

Qué tipo de problemas has tenido con la clase TIniFile? Llevo ya muchos años usándola y nunca he tenido problemas. Es más, dices que use TCustomIniFile y TIniFile deriva directamente de ésta. Además, TCustomIniFile no puedes usarla directamente dado que tiene métodos abstractos (que es precisamente lo único que hace TIniFile, reescribir esos métodos abstractos).

Nos leemos

  • 0

#5 Khronos

Khronos

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 56 mensajes

Escrito 12 septiembre 2010 - 08:04

Con la clase TIniFile, en ocasiones, cuando guardaba un valor en un fichero .ini, no se guardaban los datos. También, si modificabas a mano el fichero .ini me tiene dado problemas.

En Delphi 2007, esta es la definición de la clase TIniFile:



delphi
  1. {$IFDEF MSWINDOWS}
  2.   { TIniFile - Encapsulates the Windows INI file interface
  3.     (Get/SetPrivateProfileXXX functions) }
  4.  
  5.   TIniFile = class(TCustomIniFile)
  6.   public
  7.     destructor Destroy; override;
  8.     function ReadString(const Section, Ident, Default: string): string; override;
  9.     procedure WriteString(const Section, Ident, Value: String); override;
  10.     procedure ReadSection(const Section: string; Strings: TStrings); override;
  11.     procedure ReadSections(Strings: TStrings); override;
  12.     procedure ReadSectionValues(const Section: string; Strings: TStrings); override;
  13.     procedure EraseSection(const Section: string); override;
  14.     procedure DeleteKey(const Section, Ident: String); override;
  15.     procedure UpdateFile; override;
  16.   end;
  17. {$ELSE}
  18.     TIniFile = class(TMemIniFile)
  19.     public
  20.       destructor Destroy; override;
  21.     end;
  22. {$ENDIF}



Con la etiqueta {$IFDEF MSWINDOWS} deja claro que usa la API de Windows, mientras que la clase TCustomIniFile emplea la VCL de Delphi. Personalmente, la clase TIniFile, me dio bastantes dolores de cabeza, por eso siempre uso la clase TCustomIniFile.

Saludos.
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 12 septiembre 2010 - 10:49

Ah vaya, hoy apredí algo nuevo, no conocia esa función.

Aunque al igual que cadetill nunca he experimentado problemas con la clase TIniFile.

Salud OS
  • 0

#7 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 12 septiembre 2010 - 12:21

Buenas,

Khronos, yo lo que creo es que (dejando de banda que usen o no la API de Windows) un fichero ini como tal sólo tiene sentido en Windows.

No obstante, no puedes usar la clase TCustomIniFile de forma directa, tiene métodos abstractos que no podrías usar. Si quieres usar esa clase deberías de crearte una que herede de ella he implementar esos métodos para que fuera correcto. Fíjate es su implementación



delphi
  1.   TCustomIniFile = class(TObject)
  2.   ...
  3.   public
  4.     function ReadString(const Section, Ident, Default: string): string; virtual; abstract;
  5.     procedure WriteString(const Section, Ident, Value: String); virtual; abstract;
  6.     procedure ReadSection(const Section: string; Strings: TStrings); virtual; abstract;
  7.     procedure ReadSections(Strings: TStrings); overload; virtual; abstract;
  8.     procedure ReadSectionValues(const Section: string; Strings: TStrings); virtual; abstract;
  9.     procedure EraseSection(const Section: string); virtual; abstract;
  10.     procedure DeleteKey(const Section, Ident: String); virtual; abstract;
  11.     procedure UpdateFile; virtual; abstract;
  12.     ......
  13.   end;



Los métodos que he dejado son los que tienes que implementar en la nueva clase que definas.

De todas maneras creo que la clase está "mal definida". Personalmente nunca definiría una clase que tuviera "públicos" métodos abstractos, siempre los definiría "protegidos", de esta manera se "evita" su uso de forma accidental si se declara un objeto de dicha clase.

Nos leemos

  • 0

#8 fleming

fleming

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 12 septiembre 2010 - 01:51

A la final ni supe en cual tengo que poner la ruta del .ini y en donde pongo lo que va a cambiar <.<
  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 12 septiembre 2010 - 01:57

En una simple búsqueda en el foro encontré esto: http://www.delphiacc...hp?topic=3793.0

Ahi puedes ver lo que necesitas.

Salud OS
  • 0

#10 fleming

fleming

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 12 septiembre 2010 - 01:59

Gracias egostar voy a chekear
  • 0

#11 fleming

fleming

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 12 septiembre 2010 - 02:21

Imagen Enviada ve lo que quiero hacer alli colocar la variable y al darle click en cambiar que cambie en los 2 archivos mismos de las 30 carpetas.
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 12 septiembre 2010 - 03:25

Veamos

Se desea cambiar

1 variable en 2 archivos INI que se encuentran en 30 carpetas diferentes

1. Se necesita una lista con el nombre de las 30 carpetas
2. Se necesita el nombre de cada uno de los archivos
3. Se necesita el nombre de la SECCION y IDENTIFICADOR que se va a cambiar

Con estas premisas ya podemos comenzar a diseñar algo para solucionar el problema.

Preparamos lo que vamos a necesitar en el programa.

1 TMemo
1 TLabel
1 TEdit
2 Botones

Imagen Enviada

Creamos las constantes en el programa (suponiendo que no van a ser dinamicas)



delphi
  1. const
  2.   SECCION = &#39;VERSION&#39;;
  3.   IDENTIFICADOR = &#39;VER&#39;;
  4.   FILE1 = &#39;\Archivo1.INI&#39;;
  5.   FILE2 = &#39;\Archivo2.INI&#39;;



Creamos un prodcedimiento que haga el cambio a los dos archivos a través de dos parámetros, Ruta y Valor



delphi
  1. procedure ModificaINI(const Ruta: string; const Valor: string);
  2. var
  3.   IniFile: TiniFile;
  4. begin
  5.   IniFile := TiniFile.Create(Ruta+FILE1);
  6.   IniFile.WriteString(SECCION,IDENTIFICADOR,Valor);
  7.   IniFile.Free;
  8.   IniFile := TiniFile.Create(Ruta+FILE2);
  9.   IniFile.WriteString(SECCION,IDENTIFICADOR,Valor);
  10.   IniFile.Free;
  11. end;



Estamos listos para comenzar a plasmar nuestra lógica.

Cargamos el TMemo con la lista de los directorios que queremos modificar, lo más simple y sencillo es cargar el contenido del Memo desde un archivo de texto que contenga los directorios.



delphi
  1. procedure TForm1.FormShow(Sender: TObject);
  2. begin
  3.   Memo1.lines.LoadFromFile(&#39;D:\Archivos INI\directorios.txt&#39;);
  4. end;



Creamos el código que va a ejecutar la modificación de los archivos INI, recorriendo las lineas del memo



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   I: Integer;
  4. begin
  5.   for I := 0 to Memo1.Lines.Count - 1 do
  6.       ModificaINI(memo1.Lines[i],Edit1.Text);
  7. end;



Eso es todo, ya tenemos un programa que va a modificar todos los archivos que queremos.

Salud OS

Archivos adjuntos


  • 0

#13 fleming

fleming

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 12 septiembre 2010 - 03:35

eres una maravilla egostar muchisimas gracias te iba a poner lo que tenia ya hecho, pero deja reviso lo tuyo primero
  • 0

#14 fleming

fleming

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 12 septiembre 2010 - 03:37

¿puedes adjuntar el source para entenderlo de pies a cabeza?
  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 12 septiembre 2010 - 03:46

¿puedes adjuntar el source para entenderlo de pies a cabeza?


Bueno, la idea es que aprendas en base a lo que he expuesto, por eso no he colocado el código, con lo que te he puesto fácilmente lo haces. ;)

Salud OS
  • 0

#16 fleming

fleming

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 12 septiembre 2010 - 03:50

sí pero no se hacer los procesos, de que cuando haces click, haga tal cosa por eso queria espiar jeje para intentar hacerlo fijandome porque ahorita hice un formulario, hice doble click en el boton "cambiar" puse la funcion de escribir, pero escribe lo que ya defini en el codigo,  + no lo que puse en el Tedit, entiendo que tu pusiste Edit1.Text, pero lo hice y me daba error por eso queria ver en donde tengo el fallo
  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 12 septiembre 2010 - 04:12

sí pero no se hacer los procesos, de que cuando haces click, haga tal cosa por eso queria espiar jeje para intentar hacerlo fijandome porque ahorita hice un formulario, hice doble click en el boton "cambiar" puse la funcion de escribir, pero escribe lo que ya defini en el codigo,  + no lo que puse en el Tedit, entiendo que tu pusiste Edit1.Text, pero lo hice y me daba error por eso queria ver en donde tengo el fallo


No desesperes, intenta una y otra vez, verás que además de la satisfacción de hacer algo por ti mismo vas a a aprender algo nuevo hoy. ;)

Salud OS

PD, te voy a dar un tip, hace falta pone la unidad IniFiles en la sección Uses.
  • 0

#18 fleming

fleming

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 12 septiembre 2010 - 04:15

:D ya lo hiceeeeeeeeee ea ea era porque lo estaba poniendo entre '' parentecis. ahora adaptare tu funcion de leer el archivo de texto eso si me gusto, hay manera de no mostrar ese tmemo? en el formulario? osea para que quede bonito :D jejeje por mas que lo vaya a usar yo solamente, me gustaria ponerlo lindo y bello jajajajaja
  • 0

#19 fleming

fleming

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 12 septiembre 2010 - 04:47

Plop me volvi loco de nuevo intentando hacer las operaciones que me dices, hago un Tmemo, pero al hacer click y poner el codigo :

  Memo1.lines.LoadFromFile('D:\Archivos INI\directorios.txt');

me sigue mostrando Memo1 al compilar.. y... en ningun procedure me sale el  FormShow ¿de donde sale este FormShow?
  • 0

#20 fleming

fleming

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 12 septiembre 2010 - 05:07

Resolvi eso, pero sigue saliendome "memo1" y no lo que tiene la lista en el archivo de texto de paso al hacer click en Modificar, me sale esto:

Unable to write to Memo1\Archivo1.INI

  • 0




IP.Board spam blocked by CleanTalk.