Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-08-2008
Avatar de JoysticK
JoysticK JoysticK is offline
Miembro
 
Registrado: abr 2004
Posts: 68
Poder: 21
JoysticK Va por buen camino
Un Close pasota....

Pues tengo un problemita con un Close un tanto pasota, la cosa es que llamo a un formulario mediante Formulario.ShowModal; y en el OnActivate de este unas cuantas lineas de codigo y cuando termina esas lineas quiero que cierre ese formulario, intento meterle un Close; pero como que no me hace ni caso...

Si utilizo el OnShow, empieza a correr las lineas de codigo pero no da tiempo ni a dibujarse el formulario asi que no veo que es lo que esta haciendo hasta que ya ha terminado.... Alguna sugerencia ?
__________________
Borland Delphi XE2 // Interbase Server
Responder Con Cita
  #2  
Antiguo 28-08-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por JoysticK Ver Mensaje
Pues tengo un problemita con un Close un tanto pasota, la cosa es que llamo a un formulario mediante Formulario.ShowModal; y en el OnActivate de este unas cuantas lineas de codigo y cuando termina esas lineas quiero que cierre ese formulario, intento meterle un Close; pero como que no me hace ni caso...

Si utilizo el OnShow, empieza a correr las lineas de codigo pero no da tiempo ni a dibujarse el formulario asi que no veo que es lo que esta haciendo hasta que ya ha terminado.... Alguna sugerencia ?
Hola JoysticK,
Primeramente, el título no es muy adecuado. ¿Qué significa pasota?

Con respecto a tu duda ¿Porqué en el OnActivate? Me parece, por lo que describes, que sería apropiado el evento OnCreate talvez. Si nos pudieras comentar más al respecto podríamos asesorarte mejor. ¿que hacen esas dichosas lineas de código?

Por otro lado, un Form de forma modal no tiene demasiado sentido si va a cerrarse en forma automática. Por lo general se brinda esta opción para permitir al usuario la obligatoriedad de realizar alguna acción e impedirle realizar otras hasta que no "confirme" su pedido.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 28-08-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola JoysticK, puedes hacerlo de la forma que explica Neftali en este hilo http://www.clubdelphi.com/foros/showthread.php?t=58890 . Solo por curiosidad que significa pasota.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #4  
Antiguo 28-08-2008
Avatar de JoysticK
JoysticK JoysticK is offline
Miembro
 
Registrado: abr 2004
Posts: 68
Poder: 21
JoysticK Va por buen camino
Hola Delphius, lo siento jeje, pasota significa.... revelde podria ser.....

La cosa es la siguiente, mi aplicacion abre el formulario principal, mira si existen actualizaciones, si existen abre el formulario sincroniza mediante un showmodal para que no haga nada mas hasta que no se descargue todas las actualizaciones, el sincroniza se conecta a la base de datos y empieza a recorrer un loop hasta que todos los registros han sido descargados que es el momento de enviar un mensje y un close para que se cierre el sincronizay continue la aplicación normal...

Si pondo el codigo en el FormCreate, el codigo se ejecuta pero el formulario no se dibuja y no veo los mensajes que devuelve a un Memo que le he puesto, si lo pongo en el OnShow tampoco se llega a dibujar el formulario y estoy utilizando Application.precessmesage cada vez que recore el loop...


P.D. Aqui la definición de "pasota": 1. adj. col. [Persona] generalmente joven que rechaza las normas o principios de la sociedad establecida,adoptando una postura de total desinterés.
Se suele escuchar bastante por aqui por Andalucía jeje
__________________
Borland Delphi XE2 // Interbase Server

Última edición por JoysticK fecha: 28-08-2008 a las 18:44:07. Razón: Definicion de pasota...
Responder Con Cita
  #5  
Antiguo 28-08-2008
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
En mi opinión, el proceso de actualización debería hacerse desde el formulario principal, dejando el otro sólo para mostrar el grado de avance. Yo procedería mas o menos así (desde el formulario principal):

Código Delphi [-]
Self.Enabled := false;

frmAvanceActualizacion.ProgressBar.Max := NumeroDeRegistros;
frmAvanceActualizacion.Step := 1;
frmAvanceActualizacion.Show; // obsérvese que no es ShowModal
frmAvanceActualizacion.Refresh; // forzamos el pintado de la ventana antes del ciclo

while ... do
begin
  {
    código de actualización
  }

  frmAvanceActualizacion.ProgressBar.StepIt;
end;

frmAvanceActualizacion.Close;
frmAvanceActualizacion.Enabled := true;

Aquí, frmAvanceActualizacion sustituiría a Sincroniza y sólo tendría un ProgressBar y algún mensajito.

No podemos usar ShowModal porque entonces no se ejecutaría nada hasta no cerrar el formulario, pero impedimos la interacción con el formulario principal ponieno Enabled := false.

// Saludos
Responder Con Cita
  #6  
Antiguo 28-08-2008
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
Bueno... O yo estoy más inteligente de lo normal, o los demás están medio dormidos...

Pero, digo, se me ocurre. ¿Con un Form.Refresh? Ponerlo como primera línea del OnActivate, digo, antes de empezar a hacer cualquier cosa.

PD: Ésta es una de esas situaciones raras en las que uno piensa: "No puedo tener razón, algo tengo que haber entendido mal."
Responder Con Cita
  #7  
Antiguo 28-08-2008
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
¿Has probado lo que propones? Recuerda que el amigo necesita cerrar el formulario luego de terminado el proceso.

// Saludos
Responder Con Cita
  #8  
Antiguo 28-08-2008
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
Sí... Me parece que no entiendo bien lo que quiere hacer, entonces.

Lo que yo digo es que si va a mostrar el formulario, hacer una serie de cosas pesadas y después cerrarlo. Porqué no hacer un refresh o repait del formulario después de mostrarlo y antes de empezar a hacer las cosas pesadas.

Digo, eso es los que yo he hecho siempre.

Por eso aclaro, quizá yo esté entendiendo mal el asunto...
Responder Con Cita
  #9  
Antiguo 28-08-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Tuve que ausentarme unas horas.
Tras leer lo que se vino diciendo aqui, yo estoy con roman.
El form principal es que quien se encarga de hacer el trabajo duro. Hacer que el form modal haga ese trabajo rompe con el esquema para el cual fueron concebidos: pedir una "confirmación" rápida.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #10  
Antiguo 28-08-2008
Avatar de TOPX
TOPX TOPX is offline
Miembro
 
Registrado: may 2008
Ubicación: Bogotá
Posts: 527
Poder: 16
TOPX Va camino a la fama
Ahora yo.

El Close no tiene efecto en el onActivate, porque la forma modal no ha entrado en el ciclo que hace HandleMessage. Pues, como exponen los compañeros del foro, por definición las formas modales no están para comportarse así.

De todas maneras y según entiendo, hay dos opciones prácticas para "forzar" esto, que a la larga pueden ser similares, pero Ud. escoge:
  1. Crear un Hilo que esté modificando la propiedad ModalResult, para que apenas termine el onActivate, se cierre.
  2. Añadir un Timer que en su evento onTimer esté verificando que el proceso ya acabó, para que entonces modifique la propiedad ModalResult.
__________________
"constructive mind, destructive thoughts"
Responder Con Cita
  #11  
Antiguo 29-08-2008
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 TOPX Ver Mensaje
El Close no tiene efecto en el onActivate, porque la forma modal no ha entrado en el ciclo que hace HandleMessage.
¡Exacto! ShowModal implementa su propio ciclo de mensajes en lugar del de la aplicación:

Código Delphi [-]
function TCustomForm.ShowModal: Integer;
begin

  ...

    Show;
    try
      SendMessage(Handle, CM_ACTIVATE, 0, 0);
      ModalResult := 0;
      repeat
        Application.HandleMessage;
        if Application.FTerminate then ModalResult := mrCancel else
          if ModalResult <> 0 then CloseModal;
      until ModalResult <> 0;
      Result := ModalResult;
      SendMessage(Handle, CM_DEACTIVATE, 0, 0);
      if GetActiveWindow <> Handle then ActiveWindow := 0;
    finally
      Hide;
    end;

  ...
end;

La llamada a Show generará el evento OnShow mientras que el mensaje CM_ACTIVATE generará el evento OnActivate, antes de entrar al ciclo repeat-until, como bien señala nuestro amigo TOPX. Ese ciclo sólo termina cuando el valor de ModalResult es distinto de cero y aunque Close lo que hace es poner ModalResult en mrCancel (<> =0), lo hace antes de la inicialización a cero de la variable justo antes de comenzar el ciclo.

Ahora bien, si se insiste en dejar el proceso de descarga en el formulario modal, entonces pueden usar el método del AfterShow. Aquí un ejemplo:

Código Delphi [-]
const
  CM_AFTERSHOW = WM_USER + 1;

type
  TForm2 = class(TForm)
    ProgressBar1: TProgressBar;
    procedure FormShow(Sender: TObject);

  private
    procedure CMAfterShow(var Msg: TMessage); message CM_AFTERSHOW;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormShow(Sender: TObject);
begin
  PostMessage(Handle, CM_AFTERSHOW, 0, 0);
end;

procedure TForm2.CMAfterShow(var Msg: TMessage);
begin
  Refresh;

  { Código para descargar }

  Close;
end;

PostMessage coloca un mensaje en la cola de mensajes de la aplicación, que no se procesará sino hasta que -justamente- se entre al ciclo de mensajes y HandleMessage lo tome.

Trasladamos entonces, todo el proceso al manejador del mensaje que mandamos, en donde ya se puede usar Close sin ningún problema.

// Saludos
Responder Con Cita
  #12  
Antiguo 29-08-2008
Avatar de JoysticK
JoysticK JoysticK is offline
Miembro
 
Registrado: abr 2004
Posts: 68
Poder: 21
JoysticK Va por buen camino
Uff bastante información me habeis reportado, creo que voy a necesitar reflexionar un poco para comprender todo lo expuesto y actuar en consecuencia, aunque lo mas facil que veo es la primera opcion, dejar el trabajo duro al formulario princial como dice roman... es lo mas facil aunque me entran ganas de investigar todo lo que me habeis expuesto como el aftershow que no conocia hasta ahora...

Voy a investigar un poco y os cuento, muchas gracias por vuestra ayuda, ya he aprendido otra cosa más hoy
__________________
Borland Delphi XE2 // Interbase Server
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
TClientDataSet problemas open-close delphijm Conexión con bases de datos 2 26-05-2008 03:16:37
Close Querys Loviedo Firebird e Interbase 2 30-06-2005 23:39:33
Self Close Telmito Varios 3 06-01-2005 17:05:41
Application.Terminate Vs Close neon Varios 2 30-07-2004 00:11:55
Refresh contra close-open AbcXxx Firebird e Interbase 3 18-06-2003 17:45:20


La franja horaria es GMT +2. Ahora son las 14:00:17.


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