PDA

Ver la Versión Completa : Redefinir procedure OnShow en form heredado.


Walterio
11-09-2012, 14:27:24
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 :


{ 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.


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:

{ 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:


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.