Cita:
Empezado por bucanero
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;
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
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
public
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); vIniFile.WriteString('prueba','texto','helou'); Finally
vIniFile.Free;
End;
end;
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