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 01-11-2005
DANY DANY is offline
Miembro
 
Registrado: nov 2003
Posts: 145
Poder: 21
DANY Va por buen camino
Problema al momento de crear objetos

Bueno, mas que una duda necesito que me tiren ideas para la solucion optima de un problema. El tema es el siguiente. En mi proyecto manejo una clase por tabla de BD por correspondencia de operaciones con los de la BD.Los metodos son por lo gral. "overright" heredados de una clase base para aprovecharlos en la herencia visual.
Supongamos el metodo InsertarRegistro override ;
La idea es aprovechar al maximo el polimorfismo de las clases en la herencia visual, para ello hago lo siguiente: (a modo de ej. resumido)

Formulario Base :
Código Delphi [-]
 procedure TfNuevoGenerico.btnGrabarClick(Sender: TObject);
 Begin
   try
     ComenzarTransaccion;
     Registrio.InsertarRegistro; //Registro es un objeto de la clase base.
     CerrarTransaccion;
 
   except
     Rollback
   End;
 
 End;
 
 FORMULARIOS DESCENDIENTES
 procedure TfNuevoHijo.btnGrabarClick(Sender: TObject);
 Begin
  //Validaciones puntuales etc. 
  THijo (Registro).GetDatos ( chkActivo.Checked, edDescripcion.Text , etc.) ;
 
   inherited;//ACA GRABA EN LA TABLA CORRECTA DE ACUERDO AL POLIMORFISMO
 
 End;
 Hasta ahi todo magnifico, pero que hago cuando por ej tengo que 
 recorrer una grilla e ir insertando registros. Por ej.
 
 procedure TfNuevoGenerico.btnGrabarClick(Sender: TObject);
 var N: Integer ;
 Begin
   try
     ComenzarTransaccion;
     
     For N:= 1 to Grilla.RowCount -1 do
     Begin
  //      THijo (Registro).GetDatos (...)
 //este es el problema
 //como hago referencia a la clase hija correcta?
        Registro.InsertarRegistro ;
     End;
     CerrarTransaccion;
 
   except
     Rollback;
   End;
 
 End;
GetDatos es puntual para cada clase y no lo puedo meter
adentro del For generico.

El problema es que recien hay es donde se los valores que le tengo que pasar a la funcion GetDatos dado que depende de lo cargado por el usuario en la grilla. Como solucion estoy desaprovechando la potencia del polimorfismo y estoy replicado codigo cada vez que me encuentro con una grilla. Espero no haber sido demasiado confuso en mi explicacion, pero es un problema muy puntual.
Ustedes como resolverian esto??

Muchas gracias por su tiempo.

Última edición por Neftali [Germán.Estévez] fecha: 02-11-2005 a las 09:59:50. Razón: Eliminar líneas largas, para mejorar la lectura...
Responder Con Cita
  #2  
Antiguo 02-11-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por DANY
...La idea es aprovechar al maximo el polimorfismo de las clases en la herencia visual, para ello hago lo siguiente...
Me da la impresión de que el polimorfismo es otra cosa, pero bueno, creo que te he entendido.

Cita:
Empezado por DANY
... Hasta ahi todo magnifico, pero que hago cuando por ej tengo que recorrer una grilla e ir insertando registros...

Código Delphi [-]
      THijo (Registro).GetDatos (...)
     //este es el problema como hago referencia a la clase hija correcta?
   ...

El problema es que recien hay es donde se los valores que le tengo que pasar a la funcion GetDatos dado que depende de lo cargado por el usuario en la grilla. Como solucion estoy desaprovechando la potencia del polimorfismo y estoy replicado codigo cada vez que me encuentro con una grilla.
Yo lo resuelvo utilizando un apuntador a la clase y métodos de clase; Ese apuntador debes pasarlo al formulario de Grid genérico, de esa forma puedes acceder al método de cada clase sin definirla en ese punto. Creo que mejor con un ejemplo:

Código Delphi [-]
   
   TBase = class(TObject)
     public
       class function GetDatos():String; virtual; abstract;
     end;
   
     THijo1 = class(TBase)
     public
       class function GetDatos():String; override;
     end;
   
     THijo2 = class(TBase)
     public
       class function GetDatos():String; override;
     end;
   
     TBaseClass = class of TBase;
   
   ... (implementación)
   
   { THijo1 }
   Class function THijo1.GetDatos: String;
   begin
     (NOTA1)
     Result := 'Hijo1';  // tu función GetDatos
   end;
   
   { THijo2 }
   Class function THijo2.GetDatos: String;
   begin
     (NOTA2)
     Result := 'Hijo2';
   end;

Cuando llames al formulario de Grid, como tú bien dices no puedes hacer referencia a las clases THijo1, THijo2,...
Lo que debes hacer es pasar la referencia a la Clase:

Código Delphi [-]
     // (LLAMADA1)
     Form2.AClass := THijo1;
     Form2.Show;
   ...
     // (LLAMADA2)
     Form2.AClass := THijo2;
     Form2.Show;
   
   y el el formulario habrás definido la propiedad como:
   
     public
       property AClass:TBaseClass read FAClass write FAClass;

De ésta forma en ese formulario puedes ejecutar la siguiente línea:

Código Delphi [-]
  
  El equivalente a la línea
  //      THijo (Registro).GetDatos (...)
  será ésta:
      Str := AClass.GetDatos;
   
     // en el caso de la LLAMADA1 obtendrás el string: Hijo1  por (NOTA1)
     // en el caso de la LLAMADA2 obtendrás el string: Hijo2  por (NOTA2)
   

Espero haberme explicado bien.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 30-05-2007 a las 14:17:44.
Responder Con Cita
  #3  
Antiguo 02-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
en LLAMADA2 tenías puesto THijo1, se deduce que es un error de copiar y pegar. Por supuesto DANY lo entenderá como está. Para futuros foristas, se aclara y listo.
Código Delphi [-]
  // (LLAMADA1)
    Form2.AClass := THijo1;
    Form2.Show;
  ...
    // (LLAMADA2)
    Form2.AClass := THijo2;
    Form2.Show;
  
  y el el formulario habrás definido la propiedad como:
  
    public
      property AClass:TBaseClass read FAClass write FAClass;

Por cierto, voy a patentar la frase "copy and paste" y sus traducciones, voy a hacerme rico sentado en mi sofá .

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 02-11-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Lepe
...se deduce que es un error de copiar y pegar
Efectivamente, bien deducido, un error de "Copy & Paste"(1)
NOTA: Lo edito en el mensaje inicial, por si alguien Copia el texto de ahí.

...Lepe, apuntalo(1) a mi lista, cuando llegue a 1.000.00 EUR te mando el cheque.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 26-11-2005
lucianojdg lucianojdg is offline
Miembro
 
Registrado: dic 2003
Posts: 42
Poder: 0
lucianojdg Va por buen camino
Dany:

A ese problema se me ocurre que lo podriamos resolver de la siguiente manera:

En la clase Hija definimos atributo por ejemplo DetalleHijo que es un array de objetos de tipo TDetalleHijo,
tambien podriamos definirlo de tipo TObjectList, pero para que el ejemplo sea mas claro lo vamos a hacer de la primera forma. Luego en el Formulario Descendiente hacemos lo sigueinte:

FORMULARIOS DESCENDIENTES
procedure TfNuevoHijo.btnGrabarClick(Sender: TObject);
var
RegistroHijo : THijo;
Begin
RegistroHijo := THijo (Registro);
//Validaciones puntuales etc.
RegistroHijo.GetDatos ( chkActivo.Checked, edDescripcion.Text , etc., Grilla.RowCount-1) ;

//Grilla.RowCount es la cantidad de Hijos a crear en RegistroHijo.DetalleHijo

// Tomamos los Datos de DetalleHijo
for I := 0 to High(RegistroHijo.DetalleHijo) do
RegistroHijo.DetalleHijo[i].GetDatos(Grilla.Cells[0, I+1], Grilla.Cells[1, I+1], etc)

inherited;//ACA GRABA EN LA TABLA CORRECTA DE ACUERDO AL POLIMORFISMO, en este caso, el metodo InsertarRegistro de THijo se encarga de insertar los registros del array DetalleHijo

End;



Bueno, espero que al menos se aproxime en algo a lo que queres hacer.


Saludos y cariños a la Flia!
__________________
Luciano DG
Responder Con Cita
  #6  
Antiguo 28-11-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Revisa éste mensaje sobre la utilización de TAG's [ delphi ]...[ /delphi ]
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
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


La franja horaria es GMT +2. Ahora son las 15:09:56.


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