PDA

Ver la Versión Completa : ¿Como asignar action:=caFree por defecto para todo formulario?


Cheerpipe
14-05-2007, 19:22:32
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



public
procedure TCustomForm.Close;



a la definicion del typo y



y cambie el procedimiento por:


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:


public
procedure Close; reIntroduce;



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:


protected
procedure DoClose(var Action: TCloseAction); override;



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 :).