Llevo varios días con este problema y por más que le doy vueltas no logro conseguir una solución viable.
Como sabrán Delphi cuenta con este feature, creo que desde D2005, Class Property que nos permite acceder a la propiedad sin necesidad de instanciar la clase a quien pertenece.
Esto en si, lo que hace uso de los Class Methods.
Después de ese pequeño review, les explico mi problema. Tengo una clase llamada TDmData que desciende de TDataModule con sus métodos y propiedades, hasta aquí todo bien.
Ahora bien, tengo un formulario llamado TFrmCustomViewMDIData donde reside la Class Property con sus métodos y demás, este a su vez lo heredan los Mantenimientos.
Aquí parte de la declaración de TFrmCustomViewMDIData:
TFrmCustomViewMDIData = class(TFrmCustomViewMDI) private class function GetMyDmDataList(Indice: String): TDmData; static; class procedure SetMyDmDataList(Indice: String; const Value: TDmData); static; protected class var FDmDataStringList : TStringList; class procedure CheckStateStringList; public //Propiedad para listar los DataModule que necesita adicionales class property MyDmDataList[Indice : String] : TDmData read GetMyDmDataList write SetMyDmDataList;
La implementación de los métodos:
class procedure TFrmCustomViewMDIData.CheckStateStringList; begin if not Assigned(FDmDataStringList) then FDmDataStringList := TStringList.Create; end; //Ojo con este metodo procedure TFrmCustomViewMDIData.FormDestroy(Sender: TObject); begin inherited; FDmDataStringList.Free; FDmDataStringList := Nil; end; class function TFrmCustomViewMDIData.GetMyDmDataList(Indice: String): TDmData; begin CheckStateStringList; Result := Nil; if (not (Trim(Indice) = NullAsStringValue)) and (FDmDataStringList.IndexOf(Indice) >= 0) then Result := FDmDataStringList.Objects[FDmDataStringList.IndexOf(Indice)] as TDmData;; end; class procedure TFrmCustomViewMDIData.SetMyDmDataList(Indice: String; const Value: TDmData); begin CheckStateStringList; if FDmDataStringList.IndexOf(Indice) < 0 then FDmDataStringList.AddObject(Indice, Value) Else if TDmData(FDmDataStringList.Objects[FDmDataStringList.IndexOf(Indice)]) <> Value then FDmDataStringList.AddObject(Indice, Value); end;
Como habrán notado utilizo un TStringList para almacenar los DataModules y luego poder buscarlo por su nombre de clase.
¿Donde esta el problema? En que "al parecer" la instancia del TStringList es global para todos, porque cuando abro dos formularios hijos de TFrmCustomViewMDIData al cerrar uno cualquiera destruye la instancia del TStringList como esta en el FormDestroy. Provocando un error de memoria cuando utilizo el formulario que quedo abierto de los dos cuando este accede a la propiedad que contiene el TStringList .
Espero haberme explicado correctamente. echenme una mano.