Ver Mensaje Individual
  #3  
Antiguo 21-09-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Reputación: 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