Page 1 of 1

Como puedo hacer esto :

Posted: Thu Nov 19, 2009 5:51 pm
by JoseGS
Hola amigos

Necesito hacer un dialogo que cuando se abra empiece a emitir sonidos que se van incrementando hasta que se presione un boton del dialogo y el usuario pueda ver hasta donde escucho...

Lo que no se es como capturar la instruccion de parada mientras el ciclo de sonidos se esta ejecutando...

Alguna idea, debe ser algo muy facil, pero hoy amaneci con la mente dormida... :lol:

Gracias por su ayuda...

Adjunto el codigo que llevo hasta ahora.

Code: Select all

FUNC AUDIOMETRO()
LOCAL oDlg,oSAY,oFontBIG,oBtn,lStop:=.F.
LOCAL T:=0
LOCAL cSAY
DEFINE FONT oFontBIG  NAME "Arial" SIZE 0,-50
DEFINE DIALOG oDlg RESOURCE "AUDIOMETRO"
REDEFINE SBUTTON oBtn  ID 110 OF oDlg  RESOURCE "X_ALTO"    ACTION lStop:=.T. XP PROMPT "Alto"  TEXT 4
REDEFINE SAY oSAY VAR cSAY ID 104 OF oDlg UPDATE COLOR CLR_HRED,CLR_BLACK FONT oFontBIG
DO WHILE T<1500 .AND. !lStop
   T+=20
   BEEP(T,1)
   cSAY:=ALLTRIM(STR(T))+' Hz';oSAY:REFRESH();SYSREFRESH()
ENDDO
ACTIVATE DIALOG oDlg CENTER 
RETU[]

Re: Como puedo hacer esto :

Posted: Thu Nov 19, 2009 7:48 pm
by Lautaro
Jose,


Modifica asi tu codigo


FUNC AUDIOMETRO()
LOCAL oDlg,oSAY,oFontBIG,oBtn,lStop:=.F.
LOCAL T:=0
LOCAL cSAY
DEFINE FONT oFontBIG NAME "Arial" SIZE 0,-50
DEFINE DIALOG oDlg RESOURCE "AUDIOMETRO"
REDEFINE SBUTTON oBtn ID 110 OF oDlg RESOURCE "X_ALTO" ACTION lStop:=.T. XP PROMPT "Alto" TEXT 4
REDEFINE SAY oSAY VAR cSAY ID 104 OF oDlg UPDATE COLOR CLR_HRED,CLR_BLACK FONT oFontBIG
ACTIVATE DIALOG oDlg CENTER NOWAIT

DO WHILE T<1500 .AND. !lStop
T+=20
BEEP(T,1)
cSAY:=ALLTRIM(STR(T))+' Hz';oSAY:REFRESH();SYSREFRESH()
ENDDO

do while .not. lstop
...
...
sysrefresh()
enddo

odlg:end()

RETU[]


Atte.,

Lautaro Moreira

Re: Como puedo hacer esto :

Posted: Thu Nov 19, 2009 9:01 pm
by JoseGS
Gracias Lautaro por contestar.

Efectivamente, ya lo habia hecho asi, pero el boton no agarra el clic... y por ende, el ciclo...

Alguna otra idea.

En clipper, lo hacia mediante INKEY(0) dentro del DO WHILE , que devolvia la ultima tecla pulsada, de esa forma detectaba la pulsacion de ESC y terminaba el ciclo...

Re: Como puedo hacer esto :

Posted: Thu Nov 19, 2009 10:01 pm
by Lautaro
Jose,

Agregale una pausa y un sysrefresh() antes del enddo del ciclo que controla el beep.


Atte..,

Lautaro Moreira

Re: Como puedo hacer esto :

Posted: Thu Nov 19, 2009 10:35 pm
by JoseGS
Como se agrega una pausa en un programa FWH

Re: Como puedo hacer esto :

Posted: Thu Nov 19, 2009 10:36 pm
by Lautaro
for nnn = 1 to yy
next nnn

donde yy es el tiempo de pausa.

la que no deberia ser muy grande.

Tambien puedes probar usando esta funcion

Code: Select all

function WaitSeconds( nSecs )

   local nStart := GetTickCount()

   DEFAULT nSecs := 1

   while GetTickCount() - nStart < ( 1000 * nSecs )
   end

return nil

 
Atte.,

Lautaro

Re: Como puedo hacer esto :

Posted: Thu Nov 19, 2009 11:13 pm
by JoseGS
Gracias Lautaro

La pausa funciono perfecto... aprendi algo nuevo, pero lamentablemente el boton sigue sin funcionar.

No puedo hacer que se detenga y es algo que necesito.

Se trata de una funcion que va emitiendo un sonido en asenso. Cuando el usuario ya no puede escuchar el sonido (mas o menos a los 14000 Hz), debe detener el proceso.

Es una forma curiosa de medir la capacidad auditiva...


Alguna idea ?

Re: Como puedo hacer esto :

Posted: Tue Nov 24, 2009 4:08 pm
by Ruben Fernandez
Jose: Intenta esto:

Declara Static lStop, coloca otro boton prompt "comenzar", que lanzara la funcion del sonido.
La funcion que emite el sonido tendra que estar aparte y sera ejecutada con el boton comenzar.
Luego me cuentas.


Saludos

Ruben Fernandez