Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Redefinir procedure OnShow en form heredado. (https://www.clubdelphi.com/foros/showthread.php?t=80234)

Walterio 11-09-2012 14:27:24

Redefinir procedure OnShow en form heredado.
 
Hola a todos.

Ya se que mi consulta es de principiante, a pesar de estar programando hace ya varios años con Delphi 7, y ahora con Lazarus y Delphi 6, pero hasta ahora nunca me tocó hacer lo que necesito.
Paso a explicar :
Tengo un TForm (TFrmABMGeneric) donde lo construyo para utilizarlo como form padre.Este, en su evento OnSHow hace esto :

Código Delphi [-]
{ Conecto el dataset de la vista con el del form ABM o el Form ABM Master }
  if (IsABMDetail = false) and (IsABMLookup = false) and
     not (TfrmGenericGrid(MainForm.ActiveMDIChild).Entidad[6] = 'T') then
    dsChild.DataSet := TfrmGenericGrid(MainForm.ActiveMDIChild).cdsMaster;

  ActNuevo.Enabled := not (IsReadOnly);
  ActGuardar.Enabled := not (IsReadOnly);
  ActEditar.Enabled := not (IsReadOnly);
  ActDeshacer.Enabled := not (IsReadOnly);
  ActEliminar.Enabled := not (IsReadOnly);
 ...

Y justo necesito crear un form heredado de este último, pero que no tiene que ejecutar la linea "dsChild.DataSet := TfrmGenericGrid(MainForm.ActiveMDIChild).cdsMaster;" ya que yo le tengo que asignar otros valores y es lo único del form padre que tengo que modificar...al menos hasta ahoa, ja...!!!, y la pregunta del millón es ¿cómo...?.
Desde otro form lo creo y lo muestro, pero para que funcione correctamente, debo modificar los valores antes mencionados.
Del form padre, tengo muchísimos otros que se crean desde éste y funcionan correctamente, pero veo que tal vez esto último me pase a partir de ahora.

Código Delphi [-]
      with TCC824Detalles.Create(Application) do
      Begin
        sTDC  := cdsCCC.FieldByName('TDC009').AsString;
        sNDC  := cdsCCC.FieldByName('NDC009').AsString;
        sLDC  := cdsCCC.FieldByName('LDC009').AsString;
        ShowModal; // Aqui tengo mi problema....
      End;

Espero que se entienda el problema.

Desde ya, muchas gracias.

Saludos.

LoPiTaL 11-09-2012 16:20:12

Pues sería sencillo, añadiendo un método virtual, p. ej. DoOnShow (no sé si ya exista) que sea virtual.
Desde el padre, en el evento OnShow, llama a éste método, el cual se encarga de ejecutar lo del dataset que dices.
El formulario hijo sólo tendrá que sobreescribirlo y no llamar a inherited, por lo que dejaría de ejecutarse:

//El padre:
Código Delphi [-]
{ Conecto el dataset de la vista con el del form ABM o el Form ABM Master }
TFormPadre.OnShow(...)
begin
  DoOnShow;

  ActNuevo.Enabled := not (IsReadOnly);
  ActGuardar.Enabled := not (IsReadOnly);
  ActEditar.Enabled := not (IsReadOnly);
  ActDeshacer.Enabled := not (IsReadOnly);
  ActEliminar.Enabled := not (IsReadOnly);
end;

TFormPadre.DoOnShow;
begin
  if (IsABMDetail = false) and (IsABMLookup = false) and
     not (TfrmGenericGrid(MainForm.ActiveMDIChild).Entidad[6] = 'T') then
    dsChild.DataSet := TfrmGenericGrid(MainForm.ActiveMDIChild).cdsMaster;
end;

El hijo:

Código Delphi [-]
TFormHijo=class (TFormPadre)
protected
  procedure DoOnShow; override;
end;

procedure TFormHijo.DoOnShow;
begin
  //No quieres llamar a inherited para que no haga lo del dataset, por eso lo comento
  //inherited;

  //Cualquier otra cosa que el hijo tenga que hacer....
end;

Un saludo,
LoPiTaL

Walterio 11-09-2012 17:24:09

Uia...muy buena idea...a ponerlo en práctica y comentar que pasa...

Mil gracias...

Saludos.

Walterio 11-09-2012 17:46:25

Solo una duda...en el form padre, debería declarar el procedure DoOnShow como virtual ?
Es decir...

TFormPadre=class (TForm)
...
procedure DoOnShow; virtual;
...

Estoy revisando la ayuda de Delphi sobre la declaración virtual, pero no encuentro la info, además de ser un inútil con el idiona inglés...ja...

Gracias nuevamente.


La franja horaria es GMT +2. Ahora son las 08:50:18.

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