PDA

Ver la Versión Completa : Hacer sonar el Speaker del Ordenador


mrmanuel
30-04-2004, 17:51:22
Hola a todos.

Este golpe una facil. :p

¿Cómo puedo hacer sonar el Speaker del Ordenador durante 'X' segundos?

Un saludo. ;)

delphi.com.ar
30-04-2004, 17:52:51
Beep(Frecuencia, Duracion);

DarkByte
30-04-2004, 18:09:38
A mi en delphi 7 me dice:

[Error] Unit1.pas(28): Too many actual parameters

Y si pruebo quitándo los parámetros, me salta el "¡¡PONG!!" del windows por el altavoz externo

jachguate
30-04-2004, 18:12:48
He de aclarar que hay dos versiones de beep.

unit sysutils:
En mi versión de delphi (la 4), beep es un beep del sistema (que efectivamente hace sonar el altavoz), pero no se pueden especificar ni la frecuencia, ni la duración.

unit windows:
Pero esto todavia existe en Delphi??? me ha hecho recordar los viejos tiempos de turbo pascal, con el procedure sound :eek:

Es la descrita por delphi.com.ar; la fecuencia está dada en Hertz (hz) y la duración en milisegundos.

Para diferenciar cual de las dos queres usar, es mejor calificar completamente la función... es decir, en lugar de usar beep, usar sysutils.beep o windows.beep.

Hasta luego.

;)

roman
30-04-2004, 18:16:37
unit windows:
Pero esto todavia existe en Delphi???

Hombre, ¿a tal grado alucinas a Windows???

:D :D

// Saludos

delphi.com.ar
30-04-2004, 18:39:57
Si me refería al Beep de la unit Windows (falto la aclaración), el tema es que con el SysUtils.Beep no puede definir el tiempo como pedía.
Obviamente si queremos desarrollar algo que se abtraiga de la plataforma, nos convendrá utilizar el Beep de SysUtils

Saludos!

Jure
30-04-2004, 18:51:11
Hay una funcion de la API que llama MessageBeep (mira la ayuda de DELPHI si deseas mas info. de ella) si le das un como parametro el valor -1 puedes usar el speaker del PC. la puedes usar asi:


MessageBeep(word(-1));


No le puedes dar la duración pero si lo manejas con Sleep en un ciclo tal vez puedas hacer lo que quieres.

Si miras este link tienes un ejemplo mas o menos como te digo que te puede ayudar:

http://community.borland.com/article/0,1410,16838,00.html (http://community.borland.com/article/0,1410,16838,00.html)

Espero que te sirva.

Jure.

jachguate
01-05-2004, 00:12:49
pero que word(-1) no es igual a 65535???

Este tipo de "constantes" me parece un exceso... en serio!

roman
01-05-2004, 00:43:45
Este tipo de "constantes" me parece un exceso... en serio!


Puede ser. Lo que pasa es que la documentación especifica que el valor debe ser -1. Claro que la documentación también especifica que el parámetro es un entero sin signo pero bueno...

:D

// Saludos

jachguate
01-05-2004, 01:04:09
No me digas que esa documentación es de Microchof, que no te lo creo!!!

:D :D :D

roman
01-05-2004, 01:06:49
No te lo digo

;)

Jure
01-05-2004, 02:40:00
pero que word(-1) no es igual a 65535???
Hola jachguate no me habia fijado, lo habia usado tal como consegui el codigo sin prestarle atención.
...Lo que pasa es que la documentación especifica que el valor debe ser -1. ...
roman tiene razón, en la documentación de la API indica que el valor debe ser -1 (0xFFFFFFFF) para usar el PC Speaker pero revisando la unit Windows me encontre con esto:

Function MessageBeep(uType: UINT): BOOL; // Windows Unit

el tipo UINT es un entero sin signo, realmente no se si sera un bug o la declaración de esta función de la API debe hacerse asi en Pascal. Pero explica porque esa conversión.

Gracias por las acotaciones.

Jure.

jachguate
01-05-2004, 03:00:04
La interpretación del valor 0xFFFFFFFF (o $FFFFFFFF para los fanáticos de pascal) depende precisamente de si se trata de un entero con signo, o de un entero sin signo. Pero el valor máximo de un tipo word (2 bytes), en todo caso, es 0xFFFF ($FFFF) que es equivalente a 65,535. Por el contrario, si se trata de un SmallInt (también 2 bytes) el valor 0xFFFF ($FFFF) significa -1 (debido a que el bit del signo está encendido!).

Si Uint es de 32 bits... sin signo, el valor 0xFFFFFFFF, es equivalente a 4,294,967,295. Al haber tremenda revolución de tipos... seria interesante ver lo que el compilador de delphi hace... como traslada word(0xFFFF) a Uint... lo lógico para mi, es que lo haga como 0x0000FFFF... pero no se.. alguien tiene tiempo de hacer una prueba??

Hasta luego.

;)

roman
01-05-2004, 03:03:31
no se si sera un bug o la declaración de esta función de la API debe hacerse asi en Pascal[/color]


Ni es bug ni es que así tenga que declararse en Pascal. Cuando dije:


la documentación también especifica que el parámetro es un entero sin signo


me refería a la documentación del sdk de Windows, o sea que así es la declaración en C.

Pero vamos, no seamos tan duros con MS :D . La función requiere un parámetro distinto de los otros (cualquier cosa que esto signifique) y por legibilidad consideraron mejor -1 que 0xFFFFFFFF.

// Saludos

jachguate
01-05-2004, 03:04:45
Pero explica porque esa conversión

Creo que está lejos de explicarlo... como lo ves en mi post anterior.. yo realmente estoy mas confundido!!!

Si delphi lo declara asi en la unit Windows, es porque el api de windows espera un entero sin signo de 32 bits... pero que tiene que ver el Word(-1) en todo esto???

Hasta luego.

;)

Jure
01-05-2004, 03:31:58
...Si delphi lo declara asi en la unit Windows, es porque el api de windows espera un entero sin signo de 32 bits... pero que tiene que ver el Word(-1) en todo esto...

La funcion MessageBeep de la API espera valor -1 para activar el PC Speaker pero la declaración de la función en Delphi pide que sea un valor entero (UINT).

Pero mira que uso MessageBeep($ffffffff ) y bingo: funciona.

Ahora ya me estoy confundiendo tambien.

....:confused: :confused: :confused:

mrmanuel
03-05-2004, 09:25:55
Hola y muchas gracias a todos.

1º: No sabia iba a liar lo que he liado con el puñetero Beep del speaker, jejeje.


2º: Muchas gracias a todos, probaré lo que habéis dicho y os comento el resultado, de momento no se si funciona porque el Pc desde donde estoy programándolo no tiene el dichoso altavoz, he de hacerme con uno y probarlo.


Nuevamente gracias a todos