Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-06-2004
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Evento de formulario posterior a onshow

No se si habrá algun evento en un formulario que se lance despues del onshow y que permita cerrar el formulario. El Objetivo es poder cerrarlo o no en función de lo que haya pasado durante el evetno onshow.

Última edición por apicito fecha: 11-06-2004 a las 14:52:00.
Responder Con Cita
  #2  
Antiguo 11-06-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Quizás podría servirte el Loaded, protegido en el padre.

Código Delphi [-]
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure Loaded; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Loaded;
begin
  inherited;

end;

O si nos explicas las condiciones quizás alguna otra manera (incluso no llegar a crear el formulario haciendo las comprovaciones antes)
Responder Con Cita
  #3  
Antiguo 11-06-2004
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
En el form padre creo el formulario, después le asigno valores a una variables públicas y con esas variables publicas, en el onshow hago comprobaciones en la base de datos. El problema es que algunas veces, como consecuencia de esas comprobaciones, me interesa hacer un showmessage y cerrar el formulario, pero no lo consigo ya que en el onshow no funciona el close.
Responder Con Cita
  #4  
Antiguo 11-06-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Vale, bien..... y no te sería más sencillo hacer las comprovaciones antes de mostrar el formulario (antes del Show)??

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Application);
  try
    // Como el formulario lo tengo creado, puedo acceder a sus variables
    //  públicas y hacer las comprovaciones necesarias en este punto
    //  y si las comprovaciones no me interesan, sencillamente no hago
    // el Show (o ShowModal) de la ventana y me limito a liberarla
    if Comprovaciones then
      Form2.Show;
  finally
    FreeAndNil(Form2);
  end;
end;
Espero te sirva
Responder Con Cita
  #5  
Antiguo 11-06-2004
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
En la creación del formulario la hago por referencia, ya que se llama muchos formularios distintos y con distintas comprobaciones, entonces las comprobaciones las tengo que hacer en el formulario hijo.
Responder Con Cita
  #6  
Antiguo 11-06-2004
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
mira el procedimiento de llamada:
Código:
  if Sender.ClassType = TToolButton then
    FormaClase:=TExpFormClass(GetClass('TExp'+inttostr((Sender as TToolButton).Tag)))
  else if Sender.ClassType = TMenuItem then
    FormaClase:=TExpFormClass(GetClass('TExp'+inttostr((Sender as TMenuItem).Tag)))
  else
    Exit;
  if FormaClase<>nil then
    begin
      Forma:=FormaClase.Create(Self);
      Forma.codigo:=0;
      Forma.Expte:=QueryDia.fieldbyName('EXPDIA_CODIGO').AsInt64;
      Forma.Modo:='A';
      Forma.Part:=Part;
      Forma.Tipo:='EXP'+Part+QueryDia.fieldbyName('EXPDIA_TIPO').AsString;
      Forma.ExpAno:=EAno.Text;
      Forma.ExpNum:=ENumero.Text;
      Forma.Idioma:=Idioma;
      Forma.Dni:=EDni.Text;
      Forma.DniDup:=EDniDup.Text;
      Forma.ShowModal;
Responder Con Cita
  #7  
Antiguo 11-06-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Bien, si es así, podrías mirar de usar un truquillo con el evento OnActivate

Código Delphi [-]
procedure TForm1.FormActivate(Sender: TObject);
begin
  // Si las comprovaciones me hacen cerrar el formulario, pos se cierro
  if comprovaciones then
    Close;

  // Sólo quiero que se lance una vez este evento, así que quito el OnActivate
  OnActivate := nil;
end;

A ver ahora que tal
Responder Con Cita
  #8  
Antiguo 11-06-2004
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Gracias 1000.
Responder Con Cita
  #9  
Antiguo 11-06-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 21
marto Va por buen camino
Lo mismo pero con interfaces

Wop!

Aunque el truco que te comenta Cadetill funciona a las 100 maravillas, aquí te dejo otra manera de hacerlo. Para mi es mejor, porque se usa un método explícito de la clase en lugar del evento OnActivate. Cuando busques en el proyecto tras dos años, te será mucho más fácil de seguir.
La ides es definir una interfaz que contenga un solo método:
Código Delphi [-]
type IValidaForm = interface
  function Valida: Boolean;
end;

El form que queremos que pueda "autovalidarse" antes de mostrarse, lo declaramos implementando la interfaz:

Código Delphi [-]
type TForm1 = class(TForm, IValidaForm)
...
  public Valida: Boolean;
..
end;

implementation

public TForm1.Valida: Boolean;
begin
  Result := MisCondiciones;
end;

Ahora solo nos queda controlar la validación desde el form "padre":

Código Delphi [-]
procedure TFormPadre.MuestraHijo;
begin
  with TForm1.Create(Self) do
  begin
    try
      if Valida then
        ShowModal;
    finally
      Free;
    end;
  end;
end;

Esto mismo lo podrías hacer sin interfaz, simplemente creando el método Valida en el form. La potencia que te da este mecanismo aparece cuando necesitas que varios forms tengan este comportamiento y no necesariamente tenga que derivar de una misma clase. Puedes crear un procedimiento para crear los forms:
Código Delphi [-]
function CreateValidaForm(FormClass: TFormClass): TForm;
var
  IForm: IValidaForm;
begin
  Result := FormClass.Create(Self);
  if Succeded(Result.QueryInterface(IValidaForm, IForm) and 
   IForm.Valida then
     Result.ShowModal
  else
    FreeAndNil(Result);   
end;
__________________
E pur si muove
Responder Con Cita
  #10  
Antiguo 11-06-2004
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
Cita:
Empezado por apicito
No se si habrá algun evento en un formulario que se lance despues del onshow y que permita cerrar el formulario.
El evento en sí no existe pero lo puedes crear tú mismo como muestro en el mensaje http://www.clubdelphi.com/foros/show...59&postcount=6

// Saludos
Responder Con Cita
  #11  
Antiguo 17-06-2004
Avatar de ruina
ruina ruina is offline
Miembro
 
Registrado: jun 2004
Posts: 196
Poder: 20
ruina Va por buen camino
Aunque no os lo creais no me vale ninguno de los trucos ateriores en este caso particular, os explico:

Bien, estamos en una aplicacion CLX (delphi 7.0 - kylix 3), y quiero (lease me obligan) una pantalla de selección Pre-formulario principal, el caso es que si pulsan cerrar en ese pre-form no debo sacar el formulario principal, cerrando la aplicación.

¿por qué no puedo hacer que la pantalla "pre" sea la principal y esconderla?
porque no se que pasa pero el comportamiento de las ventanas en clx es ligeramente diferente y en cuanto la aplicación pierde el foco al volver sale siempre la pantalla "pre". Y si hago un hide desaparece de la barra de tareas.

El truco del Activate me da siempre una excepcion.



El truco de los mensages ya lo habia usado antes y funciona muy bien pero... estamos en una aplicación CLX y aqui son QMessages y yo no he conseguido poner un mensage a la cola, siempre me saltan de inmediato.

Ahora voy a intentar
plan a) enredar en dpr (Application.Initialize...) a ver si consigo mostrar la pre y cerrar la aplicación si le dan a salir.

plan b) poner un timer, activarlo en el OnShow y cerrar el form (¡¡peazo de plan b!!)

ya os contaré
Responder Con Cita
  #12  
Antiguo 17-06-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 21
marto Va por buen camino
mmmm opción a:
Código Delphi [-]
program Project2;

uses
  QForms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Form1 := TForm1.Create(Application);
  if (Form1.ShowModal = 1) then
  begin
    Form1.Free;
    Form2 := TForm2.Create(Application);
    Form2.ShowModal;
  end;
  Application.Run;
end.

probado y chuta
__________________
E pur si muove
Responder Con Cita
  #13  
Antiguo 18-06-2004
Avatar de ruina
ruina ruina is offline
Miembro
 
Registrado: jun 2004
Posts: 196
Poder: 20
ruina Va por buen camino
Perfecto!

justo ayer por la tarde me salio lo mismo ^_^ para mi que me mandaste la solusión telepaticamente.

Muchas Gracias a todos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 19:17:20.


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