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 27-05-2004
Avatar de dchaparro
dchaparro dchaparro is offline
Registrado
 
Registrado: abr 2004
Ubicación: La Plata, Argentina
Posts: 9
Poder: 0
dchaparro Va por buen camino
Question Como reutilizar un Form

Hola. Despues de haber buscado en los fors anteriores, no encontre una explicacion clara del asunto, o sea "Como reutilizar un form" ya sea en un mismo proyecto o en otro.
En todos lados leo que se puede reutilizar codigo, etc.., el problema para un principiante en Delphi (y en POO) es "como" hacerlo.
En particular, quiero reutilizar forms de altas, bajas y modificaciones de una Tabla, por que en cada proyecto que hago tengo que escribir mil veces el Evento OnClick del boton "Save" o "Cancel", para cada Tabla que edito.
La pregunta sería:
-como puedo crear un form con 2 botones: Save y Cancel, y usarlo (o reusarlo) para distintas tablas, agregando a mano Dbedits a los campos que quiero modificar o editar, o esto tambien se puede automatizar?
-Como lo uso en otro proyecto?

Desde ya, muchas gracias a todos.
Responder Con Cita
  #2  
Antiguo 27-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Hola.

Tenes muchas formas de reutilizar el código. La que yo prefiero es la herencia visual. Esto significa que definis un formulario, que puede tener controles, métodos y eventos. Luego, heredas nuevos formularios de este, que por supuesto ya tendrán el código, pero también el aspecto visual del primero. A estos podes añadir mas controles, métodos y eventos.

El libro "la cara oculta de delphi 4" que podes descargar totalmente gratis de la página de su autor, Ian Marteens tiene una sección que te explica muy bien como explotar esta buena e ingeniosa implementación de OOP de borland.

Hay otras, como crear plantillas o utilizar el repositorio, pero como no las uso, pues no puedo hablar con propiedad de ellas.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 27-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por jachguate
Tenes muchas formas de reutilizar el código. La que yo prefiero es la herencia visual.

[...]

Hay otras, como crear plantillas o utilizar el repositorio
¿Pues que no la herencia visual se basa en el uso del repositorio?

// Saludos
Responder Con Cita
  #4  
Antiguo 27-05-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
No necesariamente... podes heredar de cualquier form incluido en tu aplicación, aunque no esté en el repositorio...

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 27-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Sí claro. Puedo heredar como con cualquier clase pero entonces ya no es visual a menos que manualmente cambie el ancestro y modifique el archivo dfm para cambiar object por inherited y esto es justamente lo que se hace automáticamente al usar el repositorio.
Responder Con Cita
  #6  
Antiguo 27-05-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por roman
Sí claro. Puedo heredar como con cualquier clase pero entonces ya no es visual a menos que manualmente cambie el ancestro y modifique el archivo dfm para cambiar object por inherited y esto es justamente lo que se hace automáticamente al usar el repositorio.
Mmmmm....
File \ New \ (Nombre Proyecto) \ (Forma Padre)
Es herencia visual sin el uso del repositorio (a la larga es un repositorio de todos modos )
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 27-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
Mmmmm....
File \ New \ (Nombre Proyecto) \ (Forma Padre)
Es herencia visual sin el uso del repositorio (a la larga es un repositorio de todos modos )
Pues sí, no es más que un repositorio, temporal si quieres, que se crea por proyecto abierto.

// Saludos
Responder Con Cita
  #8  
Antiguo 29-05-2004
Avatar de dchaparro
dchaparro dchaparro is offline
Registrado
 
Registrado: abr 2004
Ubicación: La Plata, Argentina
Posts: 9
Poder: 0
dchaparro Va por buen camino
Question Derivando forms

Para completar este hilo, tengo una pregunta mas que me surgio al heredar visualmente un form.
Primero cree dos forms: FormBase y FormEditBase, a estos le puse controles generales ya que de ellos voy a derivar los que realmente uso. El tema es que en FormBase quiero usar a FormEditBase, o sea hago lo siguiente:
Código:
procedure TFormBase.BtnNuevoClick(Sender: TObject);
begin
with TFormEditBase.Create(Application) do
  try
  ShowModal;
  finally
  Free; 
etc.....
Ahora creo los forms que voy a utilizar, derivados de estos, que son: FormBase1 y FormEditBase1, pero cuando ejecuta BtnNuevoClick, me crea el form FormEditBase, y no el FormEditBase1 que es el que quiero usar !
La pregunta: qué código debería ir en BtnNuevoClick, para que use FormEditBase1 que es derivado de FormEditBase.
Graficamente se podria ilustrar para que quede mas claro de la siguiente manera:

Form usa a Form
FormBase ---> FormEditBase

FormBase1 ---> FormEditBase1
.......
.......
FormBaseN ---> FormEditBaseN

No se si estoy hablando en chino o si me entendieron algo , de todas maneras espero alguna luz sobre el asunto. Desde ya muchas gracias.
Responder Con Cita
  #9  
Antiguo 29-05-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dchaparro
Código Delphi [-]
procedure TFormBase.BtnNuevoClick(Sender: TObject);
begin
  with TFormEditBase.Create(Application) do
    try
      ShowModal;
    finally
      Free; 
  
  { etc } 
end;
El problema aquí es que el formulario base no conoce cuáles serán los descendientes del formulario de edición.

Si te fijas, tu necesitarías poder tener

TFormEditBase1.Create(Application)
TFormEditBase2.Create(Application)
...
TFormEditBaseN.Create(Application)

según sea el caso. Pero la sentencia debe estar en el formulario base y no en cada descendiente. Entonces requerirías poner la clase del formulario de edición (TFormEdit1, TFormEdit2, etc.) en una variable que tomase uno de estos valores según corresponda. Pero si lees detenidamente verás que es un poco extraño: los valores de dicha variable serían tipos de datos de manera que, ¿cuál sería el tipo de datos de tal variable?

La respuesta es: referencias de clase. Las referencias de clase son tipos de datos cuyas variables (variables de este tipo) toman como valores otros tipos de datos.

Para usarla declara una para tu formulario base de edición:

Código Delphi [-]
type
  TFormEditBase = class(TForm)
    ...
  end;

  TFormEditBaseClass = class of TFormEditBase;

Así, una variable de tipo TFormEditBaseClass podrá tomar como valores cualquier clase descendiente de TFormEditBase.

En la práctica lo que podrías hacer es agregar una de estas variables al formulario base:

Código Delphi [-]
type
  TFormBase = class(TForm)
  protected
    FormEditClass: TFormEditBaseClass;
  end;

y cambiar la creación del formulario de edición así:

Código Delphi [-]
procedure TFormBase.BtnNuevoClick(Sender: TObject);
begin
  with FormEditClass.Create(Application) do
    try
      ShowModal;
    finally
      Free; 
  
  { etc }
end;

Entonces, lo único que debes hacer es asignar el tipo correcto en el momento adecuado, por ejemplo, en el constructor de cada descendiente de TFormBase:

Código Delphi [-]
constructor TFormBaseN.Create(AOwner: TComponent);
begin
  inherited;

  FormEditClass := TFormEditBaseN;
end;

Para más información busca "Class references" en la ayuda de Delphi.

// Saludos

Última edición por roman fecha: 29-05-2004 a las 17:14:52.
Responder Con Cita
  #10  
Antiguo 29-05-2004
Avatar de dchaparro
dchaparro dchaparro is offline
Registrado
 
Registrado: abr 2004
Ubicación: La Plata, Argentina
Posts: 9
Poder: 0
dchaparro Va por buen camino
Sencillamente espectacular! Funciona a la perfeccion, y creo que gracias a Roman me voy a ahorrar mucho codigo a partir de ahora.
Todavia me cuesta ver bien cual es el funcionamiento de "Referencia de Clases", pero el que logre entenderla creo que da un gran paso en lo que es OOP en Delphi.
Gracias!
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 16:52:20.


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