Club Delphi  
    FTP   CCD   Wiki   Enlaces   Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Desplegado
  #1  
Antiguo 18-09-2007
pvizcay pvizcay is offline
Registrado
 
Registrado: jun 2006
Posts: 147
Question diseño centralizado de datasets, aplicación BD grande, crear componentes dinámicos..

hola amigos del foro,

supongamos que tengamos una aplicación de base de datos (grande, firebird + mdo), con varios forms (que se crean dinámicamente, incluso duplicados) y que casi todos utilizan además varios datasets de "soporte" (para lookups, realizar tareas comunes, etc.).. lo que estoy intentando lograr es centralizar estos datasets lo más posible, cosa que si tengo q modificar algo lo tenga en un solo lugar.. además de tener un diseño más limpio..

entonces empezamos creando un DataModule y tirando los 20-25 datasets en el mismo, completando el sqltext, los fields, etc..

el primer punto es que si bien varios forms utilizan los mismo datasets, tienen que ser distintos en tiempo de ejecución (osea cada Form dinámico tiene que tener su propia copia del dataset), por lo tanto con crear un solo DataModule y linkear todos los forms dinámicos al mismo no estamos..

una posibilidad sería crear un DataModule para cada nuevo Form, lo cúal a mi entender sería un desperdicio de recursos (y ni hablar si abrimos todos los datasets..).. otra opción sería crear un DataModule por cada dataset.. ni hablar..

la solución a este problema sería crear un componente en tiempo de ejecución y luego asignarle las propiedades guardadas en el stream de datos del dataset en cuestión (almacenado en el DataModule "padre", que le setié las propiedades en tiempo de diseño)

lo que traté fue algo como:
Código Delphi [-]
var
  ds: TMdoDataset;
begin
  ds := TMdoDataset.Create(Self);
  ds.Assign(DataModulePadre.dsXXXXX); << error
end

pero me da un error y obviamente porque la clase persistent define el método Assign con una llamada a un método q lanza una excepción solamente (osea está el método para que se complete en las clases derivadas).. en pocas palabras si queres copiar, tenes que hacer el override manual..

la pregunta es.. ¿alguien sabe como se logra lo que busco? o ¿un diseño que cumpla con lo q plantea el problema?

pd: tb se podría crear una función que te cree un dataset seteando todas las propiedades por código y te lo devuelva y usarlo por cada form dinámico que lo necesite, pero la gracia es aprovechar los diseñadores visuales de delphi me parece a mi..

pd2: cuando hablo de datasets puede entender, llamada un TMdoStoredProcedure o cualquier otro componente de datos que quiera reutilizar..

desde ya gracias!
Responder Con Cita
  #2  
Antiguo 18-09-2007
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: Málaga (España)
Posts: 6.785
Hola, creo que nadie ha respondido todavía porque no se entiende bien cuál es el problema al que quieres dar solución, ¿podrías explicarlo de otra forma?, gracias.
__________________

Saluditos


La 'otra' guía de estilo


(o_
//\
V_/_

Un ángel estuvo en la Tierra... ahora está en el Cielo.
Responder Con Cita
  #3  
Antiguo 18-09-2007
pvizcay pvizcay is offline
Registrado
 
Registrado: jun 2006
Posts: 147
hola casimiro, grax por tu rpta.

me voy a explicar de otra forma..

básicamente quiero crear componentes en tiempo de ejecución pero con los valores de las propiedades de otros componentes que setié en tiempo de diseño..

ejemplifico, tengo un DataModule (DM1) y un Dataset (DS1) dentro (que sería mi template o base de donde quiero "clonar").. ahora tengo un Form que se crea dinámicamente que tiene que tener y usar una copia de ese DataSet (pero no la misma instancia):

Código Delphi [-]
FormCreate
var
  DSDinamic: TMdoDataset;
begin
  DSDinamic := TMdoDataset.Create(Self);

  DSDinamic.Assign(DM1.DS1)
// ahora DSDinamic tendría q ser una copia de DM1.DS1 //
// uso DSDinamic.. //
end

ahora se entiende mejor?

saludos
Responder Con Cita
  #4  
Antiguo 19-09-2007
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: Málaga (España)
Posts: 6.785
Sí, sería una copia del otro. Y no olvides liberarlo al final: DSDinamic.Free
__________________

Saluditos


La 'otra' guía de estilo


(o_
//\
V_/_

Un ángel estuvo en la Tierra... ahora está en el Cielo.
Responder Con Cita
  #5  
Antiguo 19-09-2007
pvizcay pvizcay is offline
Registrado
 
Registrado: jun 2006
Posts: 147
no se si no se entendió.. el código ese no funciona..
Responder Con Cita
  #6  
Antiguo 19-09-2007
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: Málaga (España)
Posts: 6.785
Pues asi no sabría qué decirte, ¿has probado con owner en lugar de self?:
Código:
DSDinamic := TMdoDataset.Create(owner);
__________________

Saluditos


La 'otra' guía de estilo


(o_
//\
V_/_

Un ángel estuvo en la Tierra... ahora está en el Cielo.
Responder Con Cita
  #7  
Antiguo 19-09-2007
pvizcay pvizcay is offline
Registrado
 
Registrado: jun 2006
Posts: 147
si.. el problema no pasa por ahi, el método Assign es de la clase TPersistent pero la misma no define como se realiza la operación (y con razón, no puede saber como copiar clases que van a descender de ella), simplemente lanza una excepción que es de la q hablo en el primer post

en pocas palabras la clase dataset mdo no lo define, eso lo puse más como ejemplo...

yo lo que quiero es usar la información que esta en el .DFM para crear componentes de forma dinámica, sin tener que duplicar todo el módulo completo (y sin tener que asignar las propiedades a manopla) ahora se entiende mejor?
Responder Con Cita
  #8  
Antiguo 19-09-2007
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: Málaga (España)
Posts: 6.785
Entonces creo que lo que quieres es algo así:
Código:
procedure TForm1.bt1Click(Sender: TObject);
var
      Q2 : TIBDataSet;
begin
    try
        Q2 := TIBDataSet.Create(Owner);
        Q2 := Q1 ; // .Assign(Q1);
        ShowMessage(Q2.SelectSQL.Text);
    finally
        FreeAndNil(Q2);
    end;
end;
Pruébalo, te lo digo de memoria, no tengo un delphi aquí.



Edito: Ahora que lo pienso, esa solución no sirve, fallaría la segunda vez que lo asignaras porque al igualar Q2 a Q1, al hacer el FreeAndNil(Q2) también se lo estaría haciendo a Q1.
Mejor déjame que saque un poquito de tiempo mañana en el trabajo y lo miro.
__________________

Saluditos


La 'otra' guía de estilo


(o_
//\
V_/_

Un ángel estuvo en la Tierra... ahora está en el Cielo.

Última edición por Casimiro Notevi fecha: 19-09-2007 a las 22:44:40.
Responder Con Cita
  #9  
Antiguo 19-09-2007
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 1.859
Contactar con maeyanes a través de ICQ Contactar con maeyanes a través de MSN
Podrías hacer uso de la RTTI...

Checa este artículo, ahí viene un projecto que tiene un procedimiento llamado CopyObject

http://www.blong.com/Conferences/Bor...RTTI/CB140.htm


Saludos...
Responder Con Cita
  #10  
Antiguo 20-09-2007
Avatar de axesys
axesys axesys is offline
Registrado
 
Registrado: ene 2007
Ubicación: Los Mochis Sinaloa
Posts: 197
Contactar con axesys a través de MSN Send a message via Skype™ to axesys
Yo tengo una forma base con una funcion que me crea los datamodulos

Código Delphi [-]
 
interface
type
  TDataModuleClass = class of TDataModule;
  TfrmBase = class(TForm)
  protected
    function CrearDataModulo(sNombre: string): TDataModule;
  end;

implementation
 
function TfrmBase.CrearDataModulo(sNombre: string): TDataModule;
begin
  sNombre:= StringReplace(sNombre, 'frm', 'dm', []);
  Result:= TDataModuleClass(GetClass(sNombre)).Create(Self)
end;

Luego en la forma que ocupa crear el datamodulo por ejemplo un catalogo base tengo

Código Delphi [-]
 
interface
type
  TfrmCatalogo = class (TfrmBase)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FCatalogo: TdmCatalogo;
  end;
 
implementation
 
procedure TfrmCatalogo.FormCreate(Sender: TObject);
begin
  inherited;
  FCatalogo:= CrearDataModulo(ClassName) as TdmCatalogo
end;
 
procedure TfrmCatalogo.FormDestroy(Sender: TObject);
begin
  inherited;
  FreeAndNil(FCatalogo)
end;

Ademas tengo un datamodulo base para los catalogos

Código Delphi [-]
 
type
  TdmCatalogo = class(TDataModule)
    dtsCatalogo: TIBDataSet;
    dsCatalogo: TDataSource;
  end;

Despues solo heredo un frmCatalogo y un dmCatalogo para cada catalogo que voy hacer y les pongo el mismo nombre por ejemplo frmCatalogoArticulos y dmCatalogoArticulos con eso ya se crean solos

Ademas pongo en initialization de cada uno que heredé que se registre su clase por ejemplo RegisterClass(TfrmCatalogoArticulos) y RegisterClass(TdmCatalogoArticulos)

Espero que te pueda servir saludos
__________________
Base - Base de Conocimiento en español sobre Enterprise Core Objects
Responder Con Cita
  #11  
Antiguo 20-09-2007
Avatar de Al González
[Al González] Al González is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Morelia, México.
Posts: 2.756
Contactar con Al González a través de MSN Contactar con Al González a través de Yahoo
Smile

¡Hola a todos!

Entiendo perfectamente tu planteamiento Pvizcay. Quizá esto no represente ninguna solución para ti, pero en este otro hilo hablo de cierta característica que le agregué a uno de mis componentes para lograr algo muy similar a lo que tú buscas y debido a la misma inquietud.

Para lograrlo hice uso de las funciones de RTTI que sugiere Maeyanes (las cuales se encuentran en la unidad TypInfo.pas). El resultado es que ahora puedo copiar las propiedades publicadas de cualquier objeto y eso me permite, por ejemplo, clonar el conjunto de datos (data set) que se le haya asignado en tiempo de diseño a un TDataSource. De tal manera que ahora defino en tiempo de diseño un sólo data set por entidad de datos, independientemente de las diferentes formas donde se utilice (y cómo se utilice) de manera simultánea.

Propiedad DataSetCloned:


En las funciones de TypInfo.pas está la solución, aunque requiere de una considerable cantidad de trabajo.

Un abrazo simplificado.

Al González.
Responder Con Cita
  #12  
Antiguo 22-09-2007
pvizcay pvizcay is offline
Registrado
 
Registrado: jun 2006
Posts: 147
bueno primero gracias a todos

con las cosas que leí aca y otras que encontré por mi cuenta ya "veo" por donde encarar la solución.. cuando lo tenga todo armadito lo posteo de vuelta para ver que les parece

saludos!
Responder Con Cita
  #13  
Antiguo 22-09-2007
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: Málaga (España)
Posts: 6.785
Pues sería muy interesante, no recordaba esa aportación de Al González, pero es muy, muy interesante.
__________________

Saluditos


La 'otra' guía de estilo


(o_
//\
V_/_

Un ángel estuvo en la Tierra... ahora está en el Cielo.
Responder Con Cita
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Componentes Dinamicos (contenedores) JULIOCTORRESG Varios 6 21-02-2007 15:45:03
como crear componentes dinamicos sErgis .NET 1 07-09-2006 20:51:39
Problemas con componentes dinámicos mamaro OOP 2 14-10-2004 18:14:06
Destrucción de componentes dinámicos rafita OOP 5 16-04-2004 19:06:17
Crear Forms Dinamicos diegofhernando Varios 1 25-01-2004 03:26:19


La franja horaria es GMT +2. Ahora son las 02:40:30.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi