Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ventana con mensaje (No Responde) (https://www.clubdelphi.com/foros/showthread.php?t=95592)

Efren2006 01-03-2022 16:45:10

Ventana con mensaje (No Responde)
 
Buenos Días

Tengo un Proceso que debe Llamar muchos Registros de una Base de Datos Firebird y llenar una Tabla Temporal para que el usuario escoja los registro que desea procesar, como son muchos registros en la mayoría de las ocasiones la Ventana me dice (NO RESPONDE) y al finalizar el proceso me la desaparece, como si estuviera minimizada, entonces al darle clic a la aplicación en la barra de Windows aparece Todo Normal.

Que estará mal Programado ?? o que debo hacer en los casos que deba leer MUCHOS registros de la BD ?

Gracias de Antemano

Casimiro Notevi 01-03-2022 16:59:24

Estaría bien ver el código fuente para poder opinar.

Neftali [Germán.Estévez] 02-03-2022 09:18:12

Cita:

Empezado por Efren2006 (Mensaje 545729)
Tengo un Proceso que debe Llamar muchos Registros de una Base de Datos Firebird y llenar una Tabla Temporal para que el usuario escoja los registro que desea procesar, como son muchos registros en la mayoría de las ocasiones la Ventana me dice (NO RESPONDE)...

Normalmente esto ocurre cuando durante un tiempo largo la aplicación entra en un proceso en que la UI no responde.
Si estás ejecutando una consulta que tarda mucho es normal que suceda. Si estás ejecutando muchas consultas (por ejemplo en un FOR/WHILE) deberías utilizar un Application.ProcessMessages para dar tiempo a procesar otros mensajes.

Cita:

Empezado por Efren2006 (Mensaje 545729)
Que estará mal Programado ?? o que debo hacer en los casos que deba leer MUCHOS registros de la BD ?

Hay varias soluciones dependiendo de exactamente cual sea el problema.
Si es una consula muy pesada, tienes la opción de ejecutarla a un thread diferente (cosa que no es fácil si no has trabajado con threads).
Otra opción podría ser intentar dividir la consulta para obtener los registros por bloques (si eso es posible segun la lógica del programa).

cloayza 02-03-2022 20:34:45

Estimado Efren2006, lo que se requiere es...

Código, Código,Código,Código,Código,Código,Código,Código,Código..
:D

Saludos cordiales

Efren2006 09-03-2022 18:04:50

Buenas Tardes

Perdonen no haber respondido antes,,, el Codigo es asi;


Código Delphi [-]
     Try
       Screen.Cursor:=crHourGlass;
       LockWindowUpdate(Handle);
       DetDocumento.Tag:=99;
       Relacion.Close;
       Relacion.Open;
       Relacion.First;
       while Not Relacion.eof do
         Begin
         DetDocumento.Insert;
         DetDocumentoNUMLIQUIDA.Value:=RelacionNUMLIQUIDA.Value;
         DetDocumentoTOTLIQUIDA.Value:=RelacionTOTLIQUIDA.Value;
         DetDocumentoPAGODIV.Value:=RelacionPAGODIV.Value;
         DetDocumentoPAGOBOL.Value:=RelacionPAGOBOL.Value;
         DetDocumento.Post;
         Relacion.Next;
         End;
     Finally
       LockWindowUpdate(0);
       Screen.Cursor:=crArrow;
       DetDocumento.Tag:=0;
       DetDocumento.First;
       Relacion.Close;
     End;

Imaginense que la tabla "RELACION" tiene 1000 Registros o mas... Alli la Ventana cuando Termina el Proceso me la desaparece y debo Minimizar la aplicación y volverla a maximizar para que me aparezca...

Esa tabla la lleno temporal para que el usuario seleccione varios registros o todos,...

aledieb 09-03-2022 18:25:25

Agrega en el while Application.ProcessMessages;

Código Delphi [-]
       while Not Relacion.eof do
         Begin
         DetDocumento.Insert;
         DetDocumentoNUMLIQUIDA.Value:=RelacionNUMLIQUIDA.Value;
         DetDocumentoTOTLIQUIDA.Value:=RelacionTOTLIQUIDA.Value;
         DetDocumentoPAGODIV.Value:=RelacionPAGODIV.Value;
         DetDocumentoPAGOBOL.Value:=RelacionPAGOBOL.Value;
         DetDocumento.Post;
         Relacion.Next;
         Application.ProcessMessages;
         End;

Efren2006 10-03-2022 14:40:04

Cita:

Empezado por aledieb (Mensaje 545911)
Agrega en el while Application.ProcessMessages;

Código Delphi [-]
       while Not Relacion.eof do
         Begin
         DetDocumento.Insert;
         DetDocumentoNUMLIQUIDA.Value:=RelacionNUMLIQUIDA.Value;
         DetDocumentoTOTLIQUIDA.Value:=RelacionTOTLIQUIDA.Value;
         DetDocumentoPAGODIV.Value:=RelacionPAGODIV.Value;
         DetDocumentoPAGOBOL.Value:=RelacionPAGOBOL.Value;
         DetDocumento.Post;
         Relacion.Next;
         Application.ProcessMessages;
         End;

aledieb Buenos Dias

Gracias por el Aporte

Ya probé esta instrucción
Código Delphi [-]
 Application.ProcessMessages;
y sigo con el mismo Problema,,

Investigare mas con respecto a esa funcion..

Saludos

aledieb 10-03-2022 15:37:35

Hola, proba comentando la línea
Código Delphi [-]
LockWindowUpdate(Handle);

Neftali [Germán.Estévez] 10-03-2022 15:45:00

Cita:

Empezado por aledieb (Mensaje 545911)
Agrega en el while
Código Delphi [-]
 Application.ProcessMessages;

Cita:

Empezado por aledieb (Mensaje 545937)
Hola, proba comentando la línea
Código Delphi [-]
LockWindowUpdate(Handle);

Yo diría que hicieras ambas cosas.
Eliminar el bloqueo de la ventana y añadir un ProcessMessages para que se procesen los mensajes de la UI.

egostar 10-03-2022 16:31:19

Intenta esto:

Código Delphi [-]
try
  while Not Relacion.eof do
  begin
    DetDocumento.Insert;
    DetDocumentoNUMLIQUIDA.Value := RelacionNUMLIQUIDA.Value;
    DetDocumentoTOTLIQUIDA.Value := RelacionTOTLIQUIDA.Value;
    DetDocumentoPAGODIV.Value := RelacionPAGODIV.Value;
    DetDocumentoPAGOBOL.Value := RelacionPAGOBOL.Value;
    Relacion.Next;
  end;
finally
  DetDocumento.Post;
end;

Saludos


La franja horaria es GMT +2. Ahora son las 11:41:06.

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