Hola:
En primer lugar habría que crear una unit nueva y añadir este código:
Código:
unit DMBasic;
interface
uses
Classes, Forms, db, dbTables;
type
TBasicDataModule = class(TDataModule)
private
FDisconnectOnSave : Boolean;
protected
procedure WriteState(Writer: TWriter); override;
published
property DisconnectOnSave : Boolean read FDisconnectOnSave write FDisconnectOnSave;
end;
procedure Register;
implementation
uses dsgnintf;
procedure Register;
begin
RegisterCustomModule(TBasicDataModule, TCustomModule);
end;
{ TBasicDataModule }
procedure TBasicDataModule.WriteState(Writer: TWriter);
var
i : Integer;
begin
if FDisconnectOnSave then
begin
i := 0;
while i < ComponentCount do
begin
if Components[i] is TDataSet then
TDataSet(Components[i]).Active := FALSE
else if Components[i] is TCustomConnection then
TCustomConnection(Components[i]).Connected := FALSE
{ si usamos Delphi 4 o anterior, no hay TCustomConnection
else if Components[i] is TDatabase then
TDatabase(Components[i]).Connected := FALSE; }
// añadir aquí otros componentes desactivables
Inc(i);
end;
end;
inherited WriteState(Writer);
end;
end.
En esta unit declaramos la clase
TBasicDataModule que hará de padre de nuestros DataModules. La propiedad
DisconnectOnSave permite indicar si queremos que se guarden los componentes "conectables" con su propiedad Active / Connected a FALSE o si se dejan como están. El método
WriteState se encarga de desactivar esos componentes antes de que se graben al .DFM.
El IDE de Delphi se mueve sólo con paquetes, por lo que para que aparezca la propiedad DisconnectOnSave en el Object Inspector y para que se ejecute realmente el método WriteState, tendremos que meterlo en un paquete, que puede ser de diseño y de ejecución a la vez. Compilando la unit sola, todo esto no funciona. Creamos el package, añadimos esta unit, compilamos e instalamos. Lo ideal es que tanto la unit como el package los guardemos en la carpeta \Lib de Delphi, si vamos a utilizarla en varios proyectos.
Modo de empleo:
1.- Abrimos nuestro proyecto y abrimos cualquier DataModule.
2.- Añadimos la unit
DMBasic a la cláusula Uses.
3.- Cambiamos la declaración del DataModule:
Código:
TDataMain = class(TDataModule)
por
TDataMain = class(TBasicDataModule)
4.- Cerramos el DataModule, guardando los cambios.
5.- Aquí, en teoría bastaría con volverlo a abrir, pero, no sé porque, hay veces en que es necesario, o bien abrir el package que hemos creado antes y compilarlo de nuevo, o bien cerrar el project y volverlo a abrir. Hecho alguna de estas dos cosas, si todo ha ido bien, aparecerá la propiedad DisconnectOnSave en el Object Inspector. Si la ponemos a TRUE, y compilamos se encarga ya de cerrar todos los Datasets y Connections en el momento en que se escriba al .DFM.
Por cierto, parece excesivo dedicar todo un package a una sola unit, pero es posible que queramos añadir nuevas funcionalidades a este DataModule, con nuevas propiedades, eventos ... o incluso crear Forms a medida. Hasta hace bien poco no sabía que todo esto fuera posible aplicado a Forms y DataModules. La técnica está explicada en el siguiente truco de Ian Marteens:
http://www.marteens.com/trick16.htm
Bueno, no se si os gustará tener DataModules creados de esta forma, y dependientes de un package que debemos acompañar siempre, pero es una forma de solucionar esa pega que plantea Marc. Yo hasta el momento, lo que hago es desconectar el Database, y este a su vez cierra todos los Datasets que tenga enlazados, pero hay que acordarse de hacerlo.