Ver Mensaje Individual
  #6  
Antiguo 03-07-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Reputación: 22
andres1569 Va por buen camino
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.
__________________
Guía de Estilo
Responder Con Cita