Ver Mensaje Individual
  #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
Reputación: 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