Ver Mensaje Individual
  #17  
Antiguo 17-07-2018
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Reputación: 11
bucanero Va camino a la fama
Muchas gracias gatosoft por toda la información aportada

Cita:
Empezado por gatosoft Ver Mensaje
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 Ver Mensaje
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 Ver Mensaje
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 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;
        // si se ha localizado la la clase se llama al metodo create
        if Assigned(RttiType) then
          IniFile := RttiType.GetMethod('Create').Invoke(RttiType.MetaclassType, [IniFileName]).AsObject as TIniFile;
      finally
        RttiContext.free;
      end;
    end;
    //si no hay assignada ninguna clase especifica de TINIFile o no se ha conseguido
    //localizar la clase especifica, entoces se utiliza la clase TINIFile
    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
Responder Con Cita