Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-09-2008
rauros rauros is offline
Miembro
 
Registrado: feb 2008
Ubicación: Alicante - Sax / Sax - Alicante
Posts: 235
Poder: 17
rauros Va por buen camino
Como refrescar el form

Saludos. Tengo el siguiente problema. Quiero refrescar el form mientras activo el windows.beep (por ejemplo) para ver cuanto queda para que acabe el sonido. Pero solo se ve la barra de progreso en 0 cuando empieza y en 100 cuando acaba. Gracias a todos.
Responder Con Cita
  #2  
Antiguo 21-09-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Lo que puede estar ocurriendo es que una determinada tarea de tu aplicación está ocupando toda la cuota del procesador, si se puede decir así, de modo que la interfaz de tu aplicación "no responde", o se queda medio "congelada". Ante esto (hasta donde yo llego) se pueden tratar de hacer al menos dos cosas.

La primera es separar aquella tarea que está ocasionando que nuestra aplicación se "congele", separarla, digo, en un hilo diferente. Pero esto implica trabajar con hilos, precisamente, y me temo que no soy yo el más adecuado para decir nada más, sino que es menester tener ciertas cuestiones en mente cuando se trabaja así.

La segunda, que puede utilizarse en según qué casos (un buen número de ellos) es utilizar la popular instrucción "Application.ProcessMessages()"; De este modo nuestra aplicación se tomará un respiro, procesará los mensajes que tenga pendientes (también para su interfaz de usuario) y acaso solucione sin más el problema.

Ahora bien, esto último suele usarse en "bucles", por ejemplo, tal que así:

Código Delphi [-]
for i := 0 to j-1 do begin
  // Tarea más o menos "pesada" aquí

  Application.ProcessMessages();
end;

No sé si podrías tú utilizar algo así en tu aplicación o qué te vendría mejor. A lo mejor a algún otro compañero se le ocurre otra cosa que decirte.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 21-09-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Solo para ejemplificar lo ya dicho por Dec;

Código Delphi [-]
function Thread(dwValue: Cardinal): Cardinal; stdcall;
begin
 Windows.Beep(Word(dwValue), dwValue shr 16);
end;
 
function Beep(wFreq, wDuration: Word): Cardinal;
begin
 Result := CreateThread(nil, 0, @Thread, Ptr(wFreq or (wDuration shl 16)), 0, PDWORD(0)^);
end;

Si el caso es usar Beep, desarrollo la idea;

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
 Beep(100, 1000); // La aplicacion no espera la conclusión de la API
end;
 
procedure TForm1.Button2Click(Sender: TObject); // Una posible solución
var hBeep: Cardinal;
begin
 Timer1.Enabled := True;
 hBeep := Beep(1000, 3000);
 while LongBool(WaitForSingleObject(hBeep, 10)) do
  Application.ProcessMessages;
 Timer1.Enabled := False;
end;
 
procedure TForm1.Button3Click(Sender: TObject); // falla en ~10% de tiempo
begin
 ProgressBar1.Max := 40;
 ProgressBar1.Position := 0;
 Beep(500, ProgressBar1.Max * 100);
 while ProgressBar1.Position < ProgressBar1.Max do
  begin
   ProgressBar1.Position := ProgressBar1.Position + 1;
   Application.ProcessMessages;
   Sleep(100);
  end;
end;

El anterior "Beep" modificado solo produce sonidos con duración máxima de 65.5 segundos y una milesima de exactitud, la siguiente dura hasta 10.9 minutos con una centesima de exactitud;

Código Delphi [-]
function Thread(dwValue: Cardinal): Cardinal; stdcall;
begin
 Windows.Beep(Word(dwValue), (dwValue shr 16) * 10);
end;
 
function Beep(wFreq: Word; wDuration: Cardinal): Cardinal;
begin
 Result := CreateThread(nil, 0, @Thread, Ptr(wFreq or ((wDuration div 10) shl 16)), 0, PDWORD(0)^);
end;

Saludos
__________________
RTFM > STFW > Foro > Truco > Post > cHackAll > KeBugCheckEx
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
Como Refrescar un Dbgrid darioivan Varios 4 19-03-2008 22:24:57
Como llamar form desde otros form y regresar a la linea que se estaba ejecutando Willy Rodrigo C++ Builder 1 03-08-2007 19:36:23
refrescar como en paradox por red noe Firebird e Interbase 1 01-10-2004 09:38:48
Como refrescar un ClientDataSet Oxa78 Providers 8 25-08-2004 00:52:39
Como Refrescar un Query sitrico SQL 6 02-07-2004 21:40:35


La franja horaria es GMT +2. Ahora son las 09:32:53.


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