Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ¿Como asignar action:=caFree por defecto para todo formulario? (https://www.clubdelphi.com/foros/showthread.php?t=43542)

Cheerpipe 14-05-2007 19:22:32

¿Como asignar action:=caFree por defecto para todo formulario?
 
Hola a todos.

Mi problema es el siguiente, tengo un formulario MDI con muchos formularios hijos, el formulario padre y los hijos son derivaciones del tipo TForm, por lo que tienen cierto comportamiento especifico. Lo que e estado intentando hacer es que al llamar a form.close, los formularios se liberen sin necesidad de agregar la linea action:=caFree al evento onclose de cada formulario MDI hijo, (estoy haciendo una especie de base que usare en varios proyectos futuros) pero que a la vez me permita seguir usando ese evento en los formularios hijos.

Mi pregunta en concreto es.

¿Hay alguna forma de asignar por default el valor caFree? o
¿Hay algun evento que pueda interceptar para asignar ese valor? o
¿Simplemente una forma de ke un formulario hijo se libere automaticamente al hacerleo un form.close?


De antemano gracias

roman 14-05-2007 19:25:55

Lo más adecuado sería- sobre todo si vas a usar esto como base para otros proyectos -partir de un formulario base del cual heredas todos los demás. El formulario base es el que tendría el Action := caFree en su evento OnClose, y todos los demás heredarán este comportamiento.

// Saludos

Cheerpipe 14-05-2007 19:33:54

lamento hacer preguntas como esto :( pero como hago eso :S?

roman 14-05-2007 19:45:44

No lo lamentes, para eso están los foros.

Crea un formulario base, digamos TBaseChildForm, ponle las propiedades y eventos que desees. Guardas el formulario y lo agregas al repositorio: menú contextual del formulario|Add to repository. Llenas los campos que te pide: título, descripción y página. El último es el importante, pues conviene que pongas un nuevo nombre para guardar tus formularios y que no se mezclen con otros.

Para crear un formulario que herede de éste, vas al menú File|New|Other, y buscas la ficha que tenga el nombre que pusiste. Seleccionas el formulario asegurándote de activa la opción que dice Inherit (parte inferior del cuadro de diálogo).

Esos es todo. El nuevo formulario hereda del formulario base, con todo y controles y eventos.

// Saludos

Cheerpipe 14-05-2007 19:52:13

emmm el problema ke tengo es ke no cree un formulario, solo tengo un .pas con codigo :(. Tonces cuando creo un formulario hijo (con File->Nen->Form) lo que hago es cambiar, en su pas, TNOMBRE_DEL FORM = class(TForm) por TNOMBRE_DEL FORM = class(TMDIForm), pues mi idea era hacer algo portable, por eso lo hice todo por codigo, pero :(.

He intentado modificanto los procedimientos close, closemodal y doclose pero (disculpen mi ignorancia) no funciona :(.

En la clase TMDIForm agregue


Código Delphi [-]
public
  procedure TCustomForm.Close;

a la definicion del typo y



y cambie el procedimiento por:

Código Delphi [-]
procedure TCustomForm.Close;
var
  CloseAction: TCloseAction;
begin
 release;
end;

pero es como si ese procedimiento no se pudiese modificar :(

elopezf 14-05-2007 19:57:34

Lo que tienes que hacer es:

Crear un Formulario lo llamas frmAncestro y guardas la Unidada UfrmAncestro
luego te pide guardar el nombre del proyecto ok MiAplicacion.

En el Formulario frmAncestro en el evento OnClose le escribes:

procedure TFrmAncestro.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
action:= cafree;
end;

Despues seleccionas:
File --> New ---> Other

y te aparece un cuadro de dialogo en el cual debes de buscar en las pestañas el nombre de tu aplicacion ejemplo MiAplicacion y ahi dentro encontraras el nombre de la forma Ancestro ejemplo: frmAncestro.

Espero que con esto ya puedas comensar hacer tu trabajo o puedas continuarlo, haa tambien te recomiendo leas un poco de programacion orientada ha objetos algo llamado herencia.

Estamos en contacto.

Cheerpipe 14-05-2007 20:08:08

pero, es posible hacerlo modificando el procedimiento Tcustomform.close??
bueno si se podria, el problema que tengo es ke, cuando intento modificar se procedimiento de la clase Tform, simplemente no funciona, es decir, no me toma ese codigo......Se puede modificar ese procedimiento??


EDIT:

Ya solucione mi problema, encontre la directiva ke estaba buscando :)

el codigo me quedo como sigue:

Código Delphi [-]
public
  procedure Close; reIntroduce;

Código Delphi [-]
procedure TMDIForm.Close;
var
  CloseAction: TCloseAction;
begin
  release;
  if fsModal in FFormState then
    ModalResult := mrCancel
  else
    if CloseQuery then
    begin
      if FormStyle = fsMDIChild then
        if biMinimize in BorderIcons then
          CloseAction := caMinimize else
          CloseAction := caNone
      else
        CloseAction := caHide;
      DoClose(CloseAction);
      release;
      exit;
     // Con las 2 lineas anteriores, el form siempre se destruira
      if CloseAction <> caNone then
        if Application.MainForm = Self then Application.Terminate
        else if CloseAction = caHide then Hide
        else if CloseAction = caMinimize then WindowState := wsMinimized
        else Release;
    end;
end;

roman 14-05-2007 20:25:40

Te estás complicando más de la cuenta. Si te fijas, tu método TMDIForm.Close, no está sino copiando el método base de TCustomForm. Ese método base llama a DoClose. Es éste el que tienes que redefinir:

Código Delphi [-]
protected
  procedure DoClose(var Action: TCloseAction); override;

Código Delphi [-]
procedure TForm2.DoClose(var Action: TCloseAction);
begin
  inherited;
  Action := caFree;
end;

// Saludos

Cheerpipe 14-05-2007 20:34:13

jejeje tienes toda la razon.

Tu ejemplo es justo lo que necesitaba, muchas gracias :).


La franja horaria es GMT +2. Ahora son las 07:18:41.

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