Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-05-2007
Cheerpipe Cheerpipe is offline
Miembro
 
Registrado: oct 2006
Posts: 46
Poder: 0
Cheerpipe Va por buen camino
¿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
Responder Con Cita
  #2  
Antiguo 14-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 14-05-2007
Cheerpipe Cheerpipe is offline
Miembro
 
Registrado: oct 2006
Posts: 46
Poder: 0
Cheerpipe Va por buen camino
lamento hacer preguntas como esto pero como hago eso :S?
Responder Con Cita
  #4  
Antiguo 14-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 14-05-2007
Cheerpipe Cheerpipe is offline
Miembro
 
Registrado: oct 2006
Posts: 46
Poder: 0
Cheerpipe Va por buen camino
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

Última edición por Cheerpipe fecha: 14-05-2007 a las 19:57:14.
Responder Con Cita
  #6  
Antiguo 14-05-2007
elopezf elopezf is offline
Miembro
 
Registrado: mar 2007
Posts: 15
Poder: 0
elopezf Va por buen camino
Smile

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.
Responder Con Cita
  #7  
Antiguo 14-05-2007
Cheerpipe Cheerpipe is offline
Miembro
 
Registrado: oct 2006
Posts: 46
Poder: 0
Cheerpipe Va por buen camino
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;

Última edición por Cheerpipe fecha: 14-05-2007 a las 20:17:23.
Responder Con Cita
  #8  
Antiguo 14-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #9  
Antiguo 14-05-2007
Cheerpipe Cheerpipe is offline
Miembro
 
Registrado: oct 2006
Posts: 46
Poder: 0
Cheerpipe Va por buen camino
jejeje tienes toda la razon.

Tu ejemplo es justo lo que necesitaba, muchas gracias .
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Asignar NIL a un formulario Caro OOP 5 17-08-2006 19:55:00
con o sin cafree??? CarmaZone Varios 3 28-03-2005 21:28:00
Asignar valor a una prppiedad formulario hijo???? mguixot OOP 8 14-09-2004 12:09:14
Que es mejor CaFree, from1.free ó Release? ing_alsaac OOP 1 01-11-2003 21:02:33
Paradox e Interbase, como hago para transportar todo lo de paradox a Interbase Fatima Gonzalez Firebird e Interbase 2 05-05-2003 18:02:30


La franja horaria es GMT +2. Ahora son las 17:35:40.


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
Copyright 1996-2007 Club Delphi