Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-09-2011
Avatar de Cañones
Cañones Cañones is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Paz Entre Ríos
Posts: 354
Poder: 18
Cañones Va por buen camino
Nueva instancia del datamodule

Hola a todos.
Tengo un formulario que al crearlo este crea su propio datamodule. Hastá acá funciona, desde siempre que lo vengo usando así.

Así creo el formulario
Código Delphi [-]
begin   
FHorarios:=TfrmHorariosDelPersonal.Create(self);
Fhorarios.ShowModal;
Fhorarios.Free;
end;

Así crea el datamodule el formulario
Código Delphi [-]
begin   inherited;   
// creo el módulo de datos   
dm:=TdmHorarios.Create(self);   
dm.cargarPuestos; 
end;

Dentro del formulario necesito crear otro formulario que use algunos procedimientos del dm creado anteriormente, pero desde ese formulario no puedo acceder a los procedimientos porque el dm está creado en el formulario anterior.
Probé creando un dm2 igual el primer dm pero no funciona.

Así creo el segundo formulario
Código Delphi [-]
begin
  inherited;
  //  edición de HORARIOS
  FHorarioDetalle:=TfrmHorarioPersonalDetalle.Create(self);
  if FHorarioDetalle.ShowModal = mrOK then
    dm.grabarHorario;
 dm.cancelar;
end;

Espero ser claro, cualquier sugerencia o corrección en mi teoría será bienvenida.
Gracias por el tiempo.

Última edición por Cañones fecha: 02-09-2011 a las 20:21:55.
Responder Con Cita
  #2  
Antiguo 02-09-2011
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Tal como lo planteas... igual es menester que "publiques" el "DM". Es decir, que prepares una variable global, o una referencia pública en algún formulario, de manera que puedas acceder al mismo. Por supuesto, tendrás que añadir la unidad donde quieres usar el "DM". No sé si te servirá de ayuda o no, pero, como los milagros no existen, si quieres acceder a algo "que no puedes", tendrás que "hacer que se pueda", y, hasta donde yo llego, así a bote pronto, la cosa pasa por "publicar" aquello a lo que quieres acceder, tal como he dihco. No sé si me explico.
Responder Con Cita
  #3  
Antiguo 02-09-2011
Avatar de Cañones
Cañones Cañones is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Paz Entre Ríos
Posts: 354
Poder: 18
Cañones Va por buen camino
Dec, gracias por tu respuesta, pero no entendí que me quisiste decir.
Saludos.
Responder Con Cita
  #4  
Antiguo 02-09-2011
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. No te preocupes, hay veces que no me entiendo ni yo. Pero a ver cómo te explico, no ya la solución a tu problema, pero, lo que yo quería decir antes.

Supongamos que tenemos varias unidades,... por ejemplo:

Código Delphi [-]
// Nuestro formulario principal

unit UMainForm;

interface

uses
  Forms;

type
  TMainForm = class(TForm)
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

end.

Código Delphi [-]
// Nuestro formulario secundario

unit USecondaryForm;

interface

uses
  Forms;

type
  TSecondaryForm = class(TForm)
  end;

var
  SecondaryForm: TSecondaryForm;

implementation

{$R *.dfm}

end.

Código Delphi [-]
// Nuestro módulo de datos

unit UMyDataModule;

interface

uses
  SysUtils, Classes;

type
  TMyDataModule = class(TDataModule)
  end;

var
  MyDataModule: TMyDataModule;

implementation

{$R *.dfm}

end.

Ahora vamos a utilizar el módulo de datos desde el formulario principal, tal como yo he entendido que tú lo haces:

Código Delphi [-]
// Nuestro formulario principal

unit UMainForm;

interface

uses
  Forms;

type
  TMainForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

uses
  UMyDataModule;

procedure TMainForm.FormCreate(Sender: TObject);
var
  module : TMyDataModule;
begin
  module := TMyDataModule.Create( nil );
  try
    // Aquí trabajamos con el módulo de datos
  finally
    module.Free();
  end;
end;

end.

Estamos usando el módulo de datos en nuestro formulario principal. Lo estamos haciendo "de forma privada", incluso utilizamos una variable local al método "FormCreate". Si desde el formulario secundario quisiéramos acceder al módulo de datos, podríamos hacer lo mismo, empero, igual no es lo que queremos, puesto que accederíamos a una instancia distinta del módulo de datos. Tal vez esto sea lo que queramos, pero, me parece que no es el caso.

Así pues, ¿qué podemos hacer? Podemos, simplemente, utilizar la variable global "MyDataModule". De esta manera podríamos trabajar tal que así en ambos formularios:

Código Delphi [-]
// Nuestro formulario principal

unit UMainForm;

interface

uses
  Forms;

type
  TMainForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

uses
  UMyDataModule;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  if not Assigned( MyDataModule ) then
    MyDataModule := TMyDataModule.Create( nil );

  // Aquí trabajamos con el módulo de datos
  
end;

end.

De este modo estaríamos trabajando en ambos formularios con la misma instancia del módulo de datos. Da igual quien cree la instancia antes, puesto que no la crearemos dos veces. Y yo creo que con esto podría terminarse el asunto, según lo he entendido yo, vaya. Sin embargo, todavía le podemos dar una vuelta de tuerca más, aunque no sé si ganaríamos algo o no.

Lo que puede verse a continuación es que hemos añadido el módulo de datos como un miembro de nuestro formulario principal. Además, para dar acceso al módulo de datos desde otros sitios, como nuestro formulario secundario, hemos declarado una propiedad que permite el acceso a nuestro módulo de datos. Vamos, tal que así:

Código Delphi [-]
// Nuestro formulario principal

unit UMainForm;

interface

uses
  Forms, UMyDataModule;

type
  TMainForm = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FMyDataModule : TMyDataModule;
  public
    property MyDataModule : TMyDataModule read FMyDataModule;
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FMyDataModule := TMyDataModule.Create( nil );
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FMyDataModule.Free();
end;

end.

Código Delphi [-]
// Nuestro formulario secundario

unit USecondaryForm;

interface

uses
  Forms;

type
  TSecondaryForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  SecondaryForm: TSecondaryForm;

implementation

{$R *.dfm}

uses
  UMainForm;

procedure TSecondaryForm.FormCreate(Sender: TObject);
begin

  // Aquí trabajamos con el módulo de datos
  MainForm.MyDataModule...
end;

end.

En conclusión. Como digo una posible solución (si entendí bien la cuestión) pasa por hacer público, por hacer visible de alguna manera el módulo de datos que queremos compartir entre diferentes formularios, unidades, etc. No sé si ahora ha quedado un poco más claro, no ya la solución a tu problema, pero al menos lo que yo trataba de decir en mi primer mensaje.
Responder Con Cita
  #5  
Antiguo 02-09-2011
Avatar de Cañones
Cañones Cañones is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Paz Entre Ríos
Posts: 354
Poder: 18
Cañones Va por buen camino
Muschisimas gracias Dec. Ahora si entendí.
En el formulario que crea el DM al DM lo declaro como variable global.
Código Delphi [-]
implementation

uses udmHorarios, untAMhorariosPersonalDetalle;

var
  dm:TdmHorarios;

{$R *.dfm}

Pero en el segundo formulario que creo necesito crear otra variable del tipo TdmHorarios igual a la que ya está creada. No necesito acceder a un dataset que ya está cargados, quiero una nueva instancia y cargar nuevamente los dataset y ejecutar procedimientos de TdmHorarios.
Gracias por las respuesta con completa.
Saludos.
Responder Con Cita
  #6  
Antiguo 02-09-2011
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. Si ya sabes cómo usar el módulo de datos desde el formulario que crea el DM, no tienes sino hacer lo mismo en el formulario secundario. Ahora bien, fíjate que la variable que muestras no es del todo global, es decir, es global al formulario en que se encuentra, pero, para que otros formularios puedan acceder a la misma debes declarar la variable en la cláusula "interfaz", no en la cláusula "implementation" como haces.

Pero, parece ser que esto no es lo que quieres hacer tú. Sino que quieres utilizar una **nueva** instancia del módulo de datos en tu formulario secundario. Pues bien, ¡crea la nueva instancia en dicho formulario, de la misma forma en que lo haces en el primero! por eso comprendo que algo se me está escapando, puesto que, no puedo creer que no sepas crear la nueva instancia en el segundo formulario, cuando lo estás haciendo en el primero la mar de bien.

¿Qué me dices?
Responder Con Cita
Respuesta



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
una sola instancia de la aplicacion morfeo21 Varios 6 24-10-2014 03:40:50
Instancia de un objeto dao_ar OOP 1 25-06-2011 09:53:04
Problema con Instancia de SQL jdattoli SQL 0 30-03-2009 20:46:06
instancia de sql 2000 richy08 MySQL 4 17-12-2007 23:04:46
Buscar instancia de una clase nikotina JAVA 6 25-09-2007 18:35:25


La franja horaria es GMT +2. Ahora son las 13:25:31.


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