
[RESUELTO] Actualizar fichero .INI
#1
Posted 11 September 2010 - 09:21 PM
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!
#2
Posted 12 September 2010 - 02:02 AM
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:
function TFicherosIni.GetStrValue(const Section, key: string): String; var Ini: TIniFile; begin Result := 'ERROR'; if NameIni = '' then begin TDialogos.MsjErr(errIniNotDef, []); Exit; end; Ini := TIniFile.Create(NameIni); try Result := Ini.ReadString(Section, key, 'ERROR'); finally FreeAndNil(Ini); end; end;
Nos leemos
#3
Posted 12 September 2010 - 05:16 AM
Mejor usa la clase TCustomIniFile que emplea la VCL de Delphi para trabajar con ellos.
Saludos.
#4
Posted 12 September 2010 - 07:57 AM
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
#5
Posted 12 September 2010 - 08:04 AM
En Delphi 2007, esta es la definición de la clase TIniFile:
{$IFDEF MSWINDOWS} { TIniFile - Encapsulates the Windows INI file interface (Get/SetPrivateProfileXXX functions) } TIniFile = class(TCustomIniFile) public destructor Destroy; override; function ReadString(const Section, Ident, Default: string): string; override; procedure WriteString(const Section, Ident, Value: String); override; procedure ReadSection(const Section: string; Strings: TStrings); override; procedure ReadSections(Strings: TStrings); override; procedure ReadSectionValues(const Section: string; Strings: TStrings); override; procedure EraseSection(const Section: string); override; procedure DeleteKey(const Section, Ident: String); override; procedure UpdateFile; override; end; {$ELSE} TIniFile = class(TMemIniFile) public destructor Destroy; override; end; {$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.
#6
Posted 12 September 2010 - 10:49 AM
Aunque al igual que cadetill nunca he experimentado problemas con la clase TIniFile.
Salud OS
#7
Posted 12 September 2010 - 12:21 PM
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
TCustomIniFile = class(TObject) ... public function ReadString(const Section, Ident, Default: string): string; virtual; abstract; procedure WriteString(const Section, Ident, Value: String); virtual; abstract; procedure ReadSection(const Section: string; Strings: TStrings); virtual; abstract; procedure ReadSections(Strings: TStrings); overload; virtual; abstract; procedure ReadSectionValues(const Section: string; Strings: TStrings); virtual; abstract; procedure EraseSection(const Section: string); virtual; abstract; procedure DeleteKey(const Section, Ident: String); virtual; abstract; procedure UpdateFile; virtual; abstract; ...... 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
#8
Posted 12 September 2010 - 01:51 PM
#9
Posted 12 September 2010 - 01:57 PM
Ahi puedes ver lo que necesitas.
Salud OS
#10
Posted 12 September 2010 - 01:59 PM
#12
Posted 12 September 2010 - 03:25 PM
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

Creamos las constantes en el programa (suponiendo que no van a ser dinamicas)
const SECCION = 'VERSION'; IDENTIFICADOR = 'VER'; FILE1 = '\Archivo1.INI'; FILE2 = '\Archivo2.INI';
Creamos un prodcedimiento que haga el cambio a los dos archivos a través de dos parámetros, Ruta y Valor
procedure ModificaINI(const Ruta: string; const Valor: string); var IniFile: TiniFile; begin IniFile := TiniFile.Create(Ruta+FILE1); IniFile.WriteString(SECCION,IDENTIFICADOR,Valor); IniFile.Free; IniFile := TiniFile.Create(Ruta+FILE2); IniFile.WriteString(SECCION,IDENTIFICADOR,Valor); IniFile.Free; 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.
procedure TForm1.FormShow(Sender: TObject); begin Memo1.lines.LoadFromFile('D:\Archivos INI\directorios.txt'); end;
Creamos el código que va a ejecutar la modificación de los archivos INI, recorriendo las lineas del memo
procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin for I := 0 to Memo1.Lines.Count - 1 do ModificaINI(memo1.Lines[i],Edit1.Text); end;
Eso es todo, ya tenemos un programa que va a modificar todos los archivos que queremos.
Salud OS
Attached Files
#13
Posted 12 September 2010 - 03:35 PM
#14
Posted 12 September 2010 - 03:37 PM
#15
Posted 12 September 2010 - 03:46 PM
¿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
#16
Posted 12 September 2010 - 03:50 PM
#17
Posted 12 September 2010 - 04:12 PM
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.
#18
Posted 12 September 2010 - 04:15 PM


#19
Posted 12 September 2010 - 04:47 PM
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?
#20
Posted 12 September 2010 - 05:07 PM
Unable to write to Memo1\Archivo1.INI