Говорилка (эксперимент) - страница 4

 
FAQ:
32 символа


благодарю
 

Исправил кодировщика, разбивает строки на части не более 32 символов, пока не отлаживал

//+-------
//+------------------------------------------------------------------+
//|   valenok2003@mail.ru                                2012.11.16
//+------------------------------------------------------------------+
//| speech_creater() создаёт из текстовой строки имя GV переменной
//| в качестве значения переменной записывается очерёдность произнесения текста
//+------------------------------------------------------------------+
void speech_creater(string _Output_Speech){
   string _Function = "speech_creater():";
//-----------------
   //если модуль воспроизведения не установлен, память не засирается
   if(GlobalVariableGet("Allow_Speak")!= 1.0) return;
//-----------------
   double _Num_Massage = 0;
   string _GV_Name = "";
   string _Signature = "_spk_";
   bool _Flag_OK = false;
   // всего GV-переменных
   int _Cnt_GV = GlobalVariablesTotal();
   // выделяем наибольшее значение среди переменных с сигнатурой 
   for(int _i = 0; _i < _Cnt_GV; _i++){
      if(StringFind(GlobalVariableName(_i),_Signature,0)==-1) continue;
      else if(GlobalVariableGet(GlobalVariableName(_i)) > _Num_Massage) 
         _Num_Massage = GlobalVariableGet(GlobalVariableName(_i));
   }
   // заменяем пробелы на подчеркивания
   int _Cnt_Char = StringLen(_Output_Speech);
   for(_i = 0; _i < _Cnt_Char; _i++){
      if(StringGetChar(_Output_Speech, _i) == ' ') _Output_Speech = StringSetChar(_Output_Speech, _i, '_');
   }   
   //разбиваем строку на части по 32 символа
   while(_Output_Speech != "") {
      _Flag_OK = false;
      for(_i = 31; _i >= 0; _i--) {
         if(StringGetChar(_Output_Speech, _i) == '_'){
            _Flag_OK = true;
            _Num_Massage++;
            // формируем имя переменной... вроде как MQL4 понимает русские буквы
            _GV_Name = _Signature + StringSubstr(_Output_Speech, 0, _i-1);
            GlobalVariableSet(_GV_Name, _Num_Massage); 
            _Output_Speech = StringSubstr(_Output_Speech, _i, StringLen(_Output_Speech)-1);
            break;
         } 
      }
      if(_Flag_OK == false){
         Alert(_Function + "Попытка вывести непрерывный текст более 31 символа!");
         break;
      }
   }
//-----------------
   return;
}
//+-------------------------------------------------------------------
//+-------
 

Вот наваял, выкладываю код, жду замечаний, отлаживать пока некогда.

Дмитрий, пожалуйста, глянь на предмет вывода в винду, а то я в этом не силён, просто сделал по образцу твоего скрипта.

//+------------------------------------------------------------------+
//|                                                           eSpeaker
//+------------------------------------------------------------------+
//| модуль BlueDream V4 для вопроизведения речевых сигналов
//| может использоваться как НЕЗАВИСИМЫЙ модуль для
//| голосового воспроизводения текстов, как альтернатива алерту. И бип-оповещений.
//| Текст для воспроизведения создаётся в обычном строковом формате
//| и передаётся в функцию speech_creater() - кодировщик речевых сообщений.
//| Исполнение говорилки не в потоке даёт возможность произносить тексты 
//| не зависимо от тиков, что позволяет конструировать сложные фразы с указанием цен 
//| и уровней не вызывая торможения озвучиваемых индикаторов или советников.
//| 
//| Порядок установки:
//| 1. Распоковать Govorilka_cp.zip, файл Govorilka_cp.exe скопировать на диск С.
//| 2. Установить lhttsrur.exe.
//| 3. Советник eSpeaker.mq4 скопировать в каталог experts терминала, попробовать запустить скрипт.
//| 4. В вашей программе вывод сообщений должен осуществляться через функцию speech_creater().
//| 5. В терминале должны быть разрешены DLL.
//| 
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#property copyright "© valenok2003@mail.ru"
#import "kernel32.dll"
   int WinExec(string,int);
#import
//-----------------
#define  NAME_EXPERT "eSpeaker"
#define  VER "V4"                                     
#define  RELIZE "20121119"      
#define  ADVERT "eSpeaker (модуль BlueDream V4)"                  
//-----------------
string   
   ex_Name = NAME_EXPERT,
   Name_Obj1;
//-----------------
extern int Voice = 0; //возможны значения 0;1;2
string   Signature = "_spk_";
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init(){
//----
   // переменная сообщает прочим модулям о том, что можно выставлять GV-переменные оповещения.
   GlobalVariableSet("Allow_Speak",1.0);
   Name_Obj1 = ex_Name + "_Obj1";
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit(){
//----
   // запрет оповещений (для исключения переполнения)
   GlobalVariableDel("Allow_Speak");
   ObjectDelete(Name_Obj1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start(){
//-----------------
//---- создаём объект Advert -----------------------------------------
   ObjectsDeleteAll();
   ObjectCreate (Name_Obj1, OBJ_LABEL, 0, 0, 0);
   ObjectSet    (Name_Obj1, OBJPROP_CORNER, 2);
   ObjectSet    (Name_Obj1, OBJPROP_XDISTANCE, 5);
   ObjectSet    (Name_Obj1, OBJPROP_YDISTANCE, 5);
   ObjectSetText(Name_Obj1, ADVERT, 10, "Arial", LimeGreen);
//--------------------------------------------------------------------
   // всего GV-переменных
   string Output_Speech = "";
   while(true){
      // ищем хотя бы одну строку с сигнатурой
      bool FLAG_SPEECH = false;
      for(int i = 0; i < GlobalVariablesTotal(); i++){
         if(StringFind(GlobalVariableName(i),Signature,0)==-1) continue;
         else {
            // есть такая - выходим из цикла for
            FLAG_SPEECH = true;
            break;
         }
      }
      // если строка не обнаружена выходим из цикла while
      if(FLAG_SPEECH == false)break;
      else{
         // выделяем первую в очереди на произнесение
         int Num_Massage = GlobalVariablesTotal();
         for(i = 0; i < GlobalVariablesTotal(); i++){
            if(StringFind(GlobalVariableName(i),Signature,0)==-1) continue;
            else if(GlobalVariableGet(GlobalVariableName(i)) < Num_Massage) {
               Num_Massage = GlobalVariableGet(GlobalVariableName(i));
               //сохраняем её текст
               string Txt = GlobalVariableName(i);
               //удаляем саму строку
               GlobalVariableDel(GlobalVariableName(i));
            }
         }
         //восстанавливаем полную строку
         Output_Speech = Output_Speech + Txt;
      }
   }
   //заменяем подчеркивания на пробелы
   int Cnt_Char = StringLen(Output_Speech);
   for(i = 0; i < Cnt_Char; i++){
      if(StringGetChar(Output_Speech, i) == '_') Output_Speech = StringSetChar(Output_Speech, i, ' ');
   }   
   fSay(Output_Speech,Voice);
//----
   return(0);
}
void fSay(string aText,int aVoice){
   string tVoce="";
      switch (aVoice){
         case 0:
            tVoce="Adult Male #1 Russian (L&H)";
         break;      
         case 1:
            tVoce="Adult Female #1 Russian (L&H)";      
         break;
         case 2:
            tVoce="Digalo Russian Nicolai";      
         break;         
      }   
   WinExec("c:/Govorilka_cp.exe -E \""+tVoce+"\" \""+aText+"\"",1);
   Print("голосовое оповещение:" + aText);
}
 
Да что его проверять? Здесь все просто, говорит, значит работает. 
Причина обращения: