PDA

Ver la Versión Completa : Tweak modificar un programa desde otro.


turminator
20-06-2006, 15:42:50
Hola, hace tiempo que uso una aplicación ajena y que mediante un fichero de opciones de configuración se pueden añadir y modificar centenas de detalles del programa (tipo colores, letras...). Lo que ocurre es que los usuarios a menudo no saben como y qué modificar, así que tenia pensado hacer un pequeño programa que escogiendo lo que desee, me modifique el archivo de texto. Que función (si es posible) me permitira hacer esto?

Gracias anticipadas.

maeyanes
20-06-2006, 15:49:41
Si el archivo de opciones de configuración es un .ini, puedes usar la clase TIniFile, la cual está incluida en la unidad IniFiles.

Checa la ayuda de Delphi para más información.


Saludos...

turminator
21-06-2006, 17:44:33
Hola, gracias...ya lo hice y encontré un manual bastante bueno http://www.monografias.com/trabajos28/archivos/archivos.shtml

Estaba haciendo el ejemplo primero para crear un archivo ini. Pero me da un error en la linea 33:

Archivo := ExtracFileDir (Paramstr (0) + ‘\Fichero.Ini’; (Undeclaired idetifier Archivo) (Undeclaired idetifier ExtracFileDir) Que he echo mal?

PD: El codigo de mi programa es:

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IniFiles, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
MiFicheroIni : TIniFile;


implementation
{$R *.dfm}
procedure TForm1.FormClick(Sender: TObject);
begin
Archivo := ExtracFileDir (Paramstr (0) + ‘\Fichero.Ini’;
MiFicheroIni := TIniFile, Create (Archivo);
Form1.Left := MiFicheroIni.ReadInteger (‘Form’, ‘Left’, 0);
Form1.Top := MiFicheroIni.ReadInteger (‘Form’, ‘Top’, 0);
Form1.Caption := MiFicheroIni.ReadStribg (‘Form’, ‘Caption’, ‘Sin Título’);
MiFicheroIni.Free;
end;
end.

Gracias de antemano!

maeyanes
21-06-2006, 17:55:24
La función ExtracFileDir no existe, la correcta es ExtractFilePath. No necesitas usar \ en la cadena, ya que la función devuelve la ruta con un \ final.


Archivo := ExtractFilePath(Application.ExeName) + 'Fichero.ini';



Saludos...

turminator
21-06-2006, 17:57:20
Pues poniendo ExtractFilePath continua dandamoe este mismo error. Que mas puede ser?

maeyanes
21-06-2006, 18:04:20
En ningún lugar veo que declares la variable Archivo.

turminator
21-06-2006, 20:06:59
Pero no entiendo porque tengo que declarar la variable archivo, el ejemplo no usa solo la variable MiFicheroIni? Y en caso de tener que declararla que formato tengo que darle?

Muchas gracias.

maeyanes
21-06-2006, 20:21:09
La variable Archivo tendría que ser de tipo string:


procedure TForm1.FormClick(Sender: TObject);
var
Archivo: string;

begin
Archivo := ExtracFilePath(Application.ExeName) + 'Fichero.Ini';
MiFicheroIni := TIniFile.Create(Archivo);
try
Form1.Left := MiFicheroIni.ReadInteger('Form', 'Left', 0);
Form1.Top := MiFicheroIni.ReadInteger('Form', 'Top', 0);
Form1.Caption := MiFicheroIni.ReadStribg('Form', 'Caption', 'Sin Título')
finally
MiFicheroIni.Free
end
end;


Saludos...

turminator
21-06-2006, 21:04:30
procedure TForm1.FormClick(Sender: TObject);
var
Archivo: string;

begin
Archivo := ExtractFilePath(Application.ExeName) + 'Fichero.Ini';
MiFicheroIni := TIniFile.Create(Archivo);
try
Form1.Left := MiFicheroIni.ReadInteger('Form', 'Left', 0);
Form1.Top := MiFicheroIni.ReadInteger('Form', 'Top', 0);
Form1.Caption := MiFicheroIni.ReadString('Form', 'Caption', 'Sin Título')
finally
MiFicheroIni.Free
end
end;


He arreglado un par d errores (n y t) y creo que ahora ya funciona, mañana lo probaré que ahora no puedo. Muchas gracias por adentrarme en el manejo de Inis.:D

turminator
22-06-2006, 21:25:06
OK. Ahora ye empiezo a "dominar" el tema de INIs. Mi siguiente pregunta es como debo para que los usuarios de la aplicación rellenen dos edits que tengo creados y automaticamente se me escriban en una determinada sección del archivo INI base.

La aplicación trataria de rellenar unas simples campos edit, y que automaticamente se escribiera en las sections de INI.

Muchas gracias.

dec
22-06-2006, 21:43:48
Hola,


La función ExtracFileDir no existe, la correcta es ExtractFilePath.


Bueno. La función "ExtracFileDir" no existe... pero sí existe la función "ExtractFileDir", falta la "t" en la primera. Sin embargo, efectivamente, "ExtractFilePath" devuelve lo mismo pero con el separador de directorios correspondiente.


La aplicación trataria de rellenar unas simples campos edit, y que automaticamente se escribiera en las sections de INI.


Siempre podrías utilizar los eventos "OnChange" de los "TEdits", por poner un caso, pero, me da la sensación de que lo idóneo sería añadir un botón a la aplicación, de manera que en el evento "OnClick" de este se llevara a cabo la actualización del archivo "INI" o lo que fuera necesario.

En definitiva y en general, no creo que sea una buena idea almacenar el contenido de los "TEdits" en el archivo INI según se vaya escribiendo en los mismos... si no es absolutamente necesario, mejor que se escriba lo que sea menester, luego se proceda a la validación de los datos y por último se escriban en el archivo INI si es oportuno.

turminator
23-06-2006, 13:30:00
Totalmente de acuerdo con lo de primero rellenar el formulario y luego validarlo. Lo que no acabo de entender es como llamo al procedimiento para que me coja todos los caracteres ue haya rellenado y los guarde en un INI, respetando las secciones.

Lo que yo me parece que he entendido es que:

1· primero de todo debo crear un archivo INI mediante: ini := TIniFile.Create('c:\MyIni.ini');

Aunque aquí ya tengo dos problemas porque por un lado me crea el INI a un directorio que el usuario no podrá escoger y me crea el INI con un nombre que tampoco podrá escoger.

2· Y para escribir en las secciones se debe usar // Write a string value to the INI file.
ini.WriteString('Datos', 'Nombre', 'String Value');
// Write a integer value to the INI file.
ini.WriteInteger('Datos', 'Nombre', 2002);
// Write a boolean value to the INI file.
ini.WriteBool('Datos', 'Nombre', True);
finally
ini.Free;
De esta estrucutra lo que he entendido es que estas tres funciones se usan para escribir al ini un tipo de dato string, integer o boolean. Mi pregunta es como podria hacer para implementar en esta función algun sistema que me leyera, el texto contenido en un tedit que pueda seleccionar el usuario y no lo que yo escriba en el codigo?

Muchas gracias anticipadas (una vez más)

dec
23-06-2006, 13:57:21
Hola,

A ver si el siguiente código fuente puede echarte una mano o te da al menos alguna idea:


unit UfrmPrincipal;

interface

uses
Forms, StdCtrls,
Classes, Controls;

type
TfrmPrincipal = class(TForm)
edNombre: TEdit;
lbNombre: TLabel;
edApellidos: TEdit;
lbApellidos: TLabel;
btnGuardar: TButton;
btnRecuperar: TButton;
procedure btnGuardarClick(Sender: TObject);
procedure btnRecuperarClick(Sender: TObject);
end;

var
frmPrincipal: TfrmPrincipal;

implementation

{$R *.dfm}

uses
IniFiles, Dialogs, SysUtils;

procedure TfrmPrincipal.btnGuardarClick(Sender: TObject);
var
ini: TIniFile;
dlg: TSaveDialog;
begin
dlg := TSaveDialog.Create(Self);
dlg.DefaultExt := 'ini';
dlg.FileName := 'archivo.ini';
dlg.Filter := 'Archivos INI (.ini)|*.ini';
dlg.Options := [ofOverwritePrompt];
try
if dlg.Execute then
begin
ini := TIniFile.Create(dlg.FileName);
try
ini.WriteString('Usuario', 'Nombre', edNombre.Text);
ini.WriteString('Usuario', 'Apellidos', edApellidos.Text);
finally
ini.Free;
end;
end;
finally
dlg.Free;
end;
end;

procedure TfrmPrincipal.btnRecuperarClick(Sender: TObject);
var
ini: TIniFile;
dlg: TOpenDialog;
begin
dlg := TOpenDialog.Create(Self);
dlg.DefaultExt := 'ini';
dlg.FileName := 'archivo.ini';
dlg.Filter := 'Archivos INI (.ini)|*.ini';
dlg.Options := [ofFileMustExist];
try
if dlg.Execute then
begin
ini := TIniFile.Create(dlg.FileName);
try
edNombre.Text := ini.ReadString('Usuario', 'Nombre', '');
edApellidos.Text := ini.ReadString('Usuario', 'Apellidos', '');
finally
ini.Free;
end;
end;
finally
dlg.Free;
end;
end;

end.


Adjunto el ejemplo de manera que puedas probarlo tú mismo.

turminator
23-06-2006, 15:02:47
Buahhhhhhhh!

Como te lo has currado dec, de verás. de exo se tratará de esto la aplicación. Ahora solo me falta ampliarla a mi manera.

No dudes que pondré tu nombre en los creditos! Y si alguna vez pides algo que pueda ayudar no dudes que lo haré encantado, lo que no sé, es si en este foro...te podré ayudar yo a ti;)

Muchas gracias!

En cuanto termine la aplicación ya la colgaré, haber que te parece.

Saludos!