Muchas gracias gatosoft por toda la información aportada
Cita:
Empezado por gatosoft
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 así:
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.
|
Si esta técnica es muy interesante y algunas veces la he utilizado para otros temas un poco mas simples, pero en este caso y como bien dices en el siguiente mensaje, a veces lo mas simple es lo mas eficaz, y he optado por realizar directamente mi clase con herencia tradicional.
Cita:
Empezado por gatosoft
igual, no está de mas pensar en la solución tradicional: Definir una clase derivada de TIniFile, con la funcionalidad que requieres y a partir de ella definir los descendientes de los que hablas.
Cuando tienes una clase padre y muchos posibles descendientes que desconoces, es cuando comienzas a pensar en clases abstractas o en interfaces.
|
Todo mi problema se lío, por no poder hacer en un principio override del constructor y a la hora de crear mi clase como no se hacia directamente desde la propia clase, si no desde una instancia genérica derivada de TINIFile, pues no llegaba a ejecutarse el método constructor propio de mi clase.
Cita:
Empezado por gatosoft
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 cuanto a crear a través de RTTI, vi el procedimiento y la explicación que habías comentado y si lo utilice, pero al principio no llego a funcionarme, creo que porque en tu código, tu guardabas la unidad y el nombre de la clase en una nueva variable para después hacer la búsqueda, y yo en su lugar use la propiedad ClassName de mi variable con la clase, omitiendo el de la unidad.
Después he realizado una pequeña modificación a tu código, para que no sea necesario hacer la búsqueda de la clase por su nombre, ya que a priori se tiene ya la clase y así se pueda utilizar directamente sin necesidad de hacer su búsqueda.
Y así, si ha funcionado también:
Código Delphi
[-]function config: TIniFile;
var
RttiContext: TRttiContext;
RttiType: TRttiInstanceType;
Begin
if not Assigned(IniFile) then begin
if Assigned(ClassIniFile) then begin
RttiContext := TRttiContext.Create;
try
RttiType := RttiContext.GetType(ClassIniFile) as TRttiInstanceType;
if Assigned(RttiType) then
IniFile := RttiType.GetMethod('Create').Invoke(RttiType.MetaclassType, [IniFileName]).AsObject as TIniFile;
finally
RttiContext.free;
end;
end;
if not Assigned(IniFile) then
IniFile := TIniFile.Create(IniFileName);
end;
Result := IniFile;
end;
Gracias nuevamente a todos los que han dedicado parte de su tiempo a este hilo
Un saludo