Tratamento de Sub-Menu
Início  Anterior  Próximo



O estado de SUBMENU é muito semelhante ao de BOAS VINDAS pois reproduz uma mensagem e espera opções. A única diferença é que no SUBMENU não existe a possibilidade de digitar o ramal diretamente.

Desta forma teremos que fazer tratamentos no evento OnPlayStop para quando a mensagem de sub-menu acabar e no evento OnDigitsReceived para tratar as opções digitadas durante ou após a mensagem de sub-menu.

No evento OnPlayStop, como foi dito, podemos ter a situação da mensagem de sub-menu ter sido reproduzida até o fim (StopStatus = ssNormal).

Neste caso, deveremos esperar até 5 segundos para digitação da opção.
 
procedure TForm1.voice1PlayStop(Sender: TObject; Port,  
  StopStatus: Smallint);  
begin  
 
  case StopStatus of  
 ssNormal:  //MENSAGEM FOI ATE O FIM  
 begin  
   case Estado[Port] of  
     (.......)  
         SUBMENU:  
         begin  
            //mensagem de sub menu terminou corretamente  
            //espera as opcoes  
            voice1.ClearDigits(Port);  
            InsereDado(Port,'Espera opcao de sub-menu');  
            Estado[Port] := ESPERA_SUBMENU;  
            voice1.GetDigits(Port,1,'',5000,5000);  
            //para esperar o ocupado  
            voice1.EnableCallProgress(Port);  
          end;   //fim estado submenu  
   end;  
 
 end;  
  end;   
 
Devemos fazer este tratamento dentro do bloco ssNormal pois a mensagem terminou sem interrupção e no case do Estado de SUBMENU. Primeiro apagamos os dígitos do buffer interno através do ClearDigits. Em seguida entramos na espera de um dígito por 5 segundos (GetDigits). Aqui, após chamar o GetDigits, habilitamos a deteção de tom com o método EnableCallProgress(Port) para que seja possível detectar o sinal de ocupado.

Com isso o programa poderá desligar caso o usuário desligue antes de completar a chamada.

Da mesma forma que na mensagem principal, aqui trataremos a situação de dígito sobre mensagem ou durante o silêncio após a mensagem no evento OnDigitsReceived.
 
procedure TForm1.voice1DigitsReceived(Sender: TObject; Port,  
  Status: Smallint);  
var  
  ret: integer;  
begin  
  case Status of  
     EdMaxDigits,  
     edDigitOverMessage:  //msg interrompida por digito  
     begin  
       case Estado[Port] of  
          ESPERA_DIGITOS_MENU,  
          BOASVINDAS:              
          begin                                                  
           (.....)  
          end;  
          ESPERA_SUBMENU,   //tratamento de submenu  
          SUBMENU:  
          begin  
            //recebeu um dos digitos esperados - disca para   
            //o ramal  
            voice1.DisablePulseDetection(Port);  
            //testa se eh digito valido entre 0 e 9  
            nOpSubMenu[Port] := StrToInt(Copy(   
                                voice1.ReadDigits(Port),1,1));  
 
            //insere ramais para transferencia     
            lstRamal[Port].Clear;  
 
            if sRamalSubMenu[nOpMenu[Port]]   
                                 [nOpSubMenu[Port]] <> '' then  
              lstRamal[Port].Add(sRamalSubMenu[nOpMenu[Port]]   
                                          [nOpSubMenu[Port]]);  
            //adiciona fuga  
            lstRamal[Port].Add(RAMAL_FUGA1);  
            lstRamal[Port].Add(RAMAL_FUGA2);  
            Estado[Port] := TRANSFERENCIA;  
            nEstadoRamal[Port] := LIVRE;  
            //aguarde um instante...  
            voice1.PlayFile(Port,'sisaguar.sig','',0);  
          end;                    
        end;  
     end;  
  end;  
 
end;  
 
Como as opções de sub-menu requerem somente um dígito, o tratamento de digito sobre mensagem recai no bloco de programa mostrado acima, onde o sistema pega a opção de sub-menu e disca para o ramal.

Aqui também utilizamos o recurso de criar uma lista para discar para os ramais em seqüência no caso de algum não atender ou estar ocupado. A variável Estado deve mudar para o estado de TRANSFERENCIA e pela primeira vez é utilizada a variável nEstadoRamal, que guardará se o ramal deu ocupado ou não atendeu. Isto é apenas necessário para o sistema falar "ramal ocupado" ou "ramal não atende".