![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#6
|
|||
|
|||
|
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.
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) 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.
__________________
Guía de Estilo |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|