Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Tweak modificar un programa desde otro. (https://www.clubdelphi.com/foros/showthread.php?t=32892)

turminator 20-06-2006 15:42:50

Tweak modificar un programa desde otro.
 
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/trabajos2...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:

Código Delphi [-]
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.

Código Delphi [-]
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:

Código Delphi [-]
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

Código Delphi [-]
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,

Cita:

Empezado por maeyanes
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.

Cita:

Empezado por turminator
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:
Código Delphi [-]
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
Código Delphi [-]
 // 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

1 Archivos Adjunto(s)
Hola,

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

Código Delphi [-]
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!


La franja horaria es GMT +2. Ahora son las 00:45:05.

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