Ver Mensaje Individual
  #13  
Antiguo 16-07-2018
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Reputación: 21
gatosoft Va camino a la fama
Cita:
Empezado por bucanero Ver Mensaje
En cuanto a tu sugerencia de usar la RTTI es por donde en un principio pensé que podría ir la solución a este problema, aunque en estos temas de la RTTI me pierdo...
Viendo tu código me encuentro que en la linea donde debe de buscar y localizar la classe devuelve NIL y no la encuentra.
El problema imagino que viene de que para que la pueda localizar hay que registrar previamente la clase.
Yo también me encontré con ese problema del Nil, y por eso linkeaba la solución en ésta linea de código.

Código Delphi [-]
Initialization
  TMyIniFile.mydummy; //Me encontré con este error


en el hilo se dice:
Cita:

Probably the class has not included by the delphi linker in the final executable. A fast try can be the following:

1.Declare a static method on your class. This method should be an empty method, a simple begin end.
2.Call this static method in the initialization section of this unit.
3. Ensure that the unit is referenced in your project somewhere.
4.Now you should see the class with TRttiContext.FindType

Cita:
Empezado por bucanero Ver Mensaje
En cuanto a esta propuesta... sinceramente, no veo como aplicar una solución...

Porque mi idea final a parte de lo ya explicado es sobre-escribir los métodos de lectura/escritura de mi clase descendiente de TINIFile, para que en vez de guardar los datos en un fichero los guarde directamente en la BBDD, manteniendo la máxima compatibilidad con el componente original para que en determinados casos que no quiera utilizar mi componente propio y/o guardar en la BBDD puede usar directamente un TINIFile.
Bueno, eso es nuevo, creí que querías extender la funcionalidad, y no sobre escribirla.

Existe una técnica que te puede servir y es la de interceptores, pero como todo, no es para abusar de ella.

y funciona mas o menos asi:

En la clausula Uses defines la unidad Inifiles, que contiene la implementación nativa del componente.

Después, defines la clase "interceptora" TIniFile (Tiene el mismo nombre de la nativa) la cual hereda de System.IniFiles.TIniFile (debes especificar la unidad).

Y en esta nueva clase, puedes definir nueva funcionalidad y sobreescribir la existente.


Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IniFiles, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


  TIniFile = Class(System.IniFiles.TIniFile)
  Private
  Public
    procedure WriteString(const Section, Ident, Value: String); reintroduce;
  End;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var vIniFile: TIniFile;
begin
  Try
    vIniFile:= TIniFile.Create('C:\MyFile.ini');
    vIniFile.WriteInteger('prueba','numero',5); //este lo escribe
    vIniFile.WriteString('prueba','texto','helou'); //ese lo muestra en un showmessage
  Finally
    vIniFile.Free;
  End;
end;

{ TIniFile }

procedure TIniFile.WriteString(const Section, Ident, Value: String);
begin
  showMessage('Sobre-escribí el metodo '+Value);
end;

end.


en tu caso, modificarias tu codigo aqsí..

Código Delphi [-]
unit MyIniFiles;

interface

uses IniFiles;

type
  TIniFile = class(System.IniFiles.TIniFile)
  private
  public
    class procedure mydummy; static;
    constructor Create(const FileName: string);
  end;

implementation



revisa
Responder Con Cita