Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
en:atcl:ratestoexcel [2018/05/16 04:26]
nektomk
en:atcl:ratestoexcel [2018/05/16 18:09] (текущий)
nektomk
Строка 27: Строка 27:
 CopyRatesToExcel(const MqlRates &​rates[],​int pos=0,int count=WHOLE_ARRAY) CopyRatesToExcel(const MqlRates &​rates[],​int pos=0,int count=WHOLE_ARRAY)
 { {
-   // ​создаём интерпретатор+   // ​create new interp.
    ATcl *tcl=new ATcl;    ATcl *tcl=new ATcl;
    if (tcl==NULL) return -1;    if (tcl==NULL) return -1;
-   // ​объекты которыми будем оперировать +   // ​objects 
-   ​Tcl_Obj Excel=0; ​    // ​инстанс Cawt Excel +   ​Tcl_Obj Excel=0; ​    // Excel instance 
-   ​Tcl_Obj Workbook=0; ​ // книга +   ​Tcl_Obj Workbook=0; ​ // book 
-   ​Tcl_Obj Worksheet=0;​ // лист +   ​Tcl_Obj Worksheet=0;​ // spreadsheet 
-   ​Tcl_Obj Range=0; ​    // ​диапазон ячеек +   ​Tcl_Obj Range=0; ​    // ​cell range 
-   ​Tcl_Obj data=0; ​     // данные+   ​Tcl_Obj data=0; ​     // data to export
        
-   // ​последовательно исполняем команды +   // ​consistently execute commands 
-   // ​прим.: do {...} while(0); ​нужен чтобы не городить "​лесенку"​ из вложений ​{{{}}}+   // ​note: do {...} while(0); ​It is necessary not to make many nestings ​{{{}}}
    do {    do {
-      ​// если в вашем сист.дистрибутиве ​tcl есть пакет Cawt то закоментируйте +     // if there is a Cawt package in your tcl distribution system, then comment follows command 
-      // укажем путь к библиотекам включенным в ATcl  +     ​// specify the path to the libraries included in ATcl 
-      tcl.Eval("​lappend auto_path [ file join [pwd] MQL4 Libraries ATcl lib ]"); +     ​tcl.Eval("​lappend auto_path [ file join [pwd] MQL4 Libraries ATcl lib ]"); 
-      // нам нужен будет пакет ​Cawt+      // requires ​Cawt package
       if (tcl.Eval("​package require cawt"​)!=TCL_OK) {       if (tcl.Eval("​package require cawt"​)!=TCL_OK) {
-         // если произошла какая-то ошибка+  // if there was some error
-         // ​то её описания можно получить как ​Result() ​в виде объекта +         // ​then its descriptions can be obtained as Result () as an object 
-         // ​или ​StringResult() ​в виде строки+         // ​or StringResult () as a string
          ​PrintFormat("​package Cawt error %s",​tcl.StringResult());​          ​PrintFormat("​package Cawt error %s",​tcl.StringResult());​
          ​break;​          ​break;​
       }       }
-      // Открываем ​Excel +      // opening ​Excel 
-      // заодно создаём переменную ​Excel в интерпретаторе для подстановок как ​$Excel+      // At the same time we create an Excel variable in the interpreter for substitutions like $ Excel
       if (tcl.Eval("​set Excel [ Excel Open ]"​)!=TCL_OK) {       if (tcl.Eval("​set Excel [ Excel Open ]"​)!=TCL_OK) {
          ​PrintFormat("​[ Excel Open ] error %s",​tcl.StringResult());​          ​PrintFormat("​[ Excel Open ] error %s",​tcl.StringResult());​
          ​break;​          ​break;​
       }       }
-      Excel=tcl.Ref(tcl.Result()); ​ // сохраним результатчтобы потом вызвать корректный деструктор +      Excel=tcl.Ref(tcl.Result()); ​ // save the resultthen call the correct destructor 
-      // Открываем новую пустую книгу +      // open empty WorkBook 
-      // (она будет создана сразу с одним листом)+      // (it will be created immediately with one sheet)
       if (tcl.Eval("​set Workbook [ Excel AddWorkbook $Excel ]"​)!=TCL_OK) {       if (tcl.Eval("​set Workbook [ Excel AddWorkbook $Excel ]"​)!=TCL_OK) {
          ​PrintFormat("​[ Excel AddWorkbook ] error %s",​tcl.StringResult());​          ​PrintFormat("​[ Excel AddWorkbook ] error %s",​tcl.StringResult());​
          ​break;​          ​break;​
       }       }
-      Workbook=tcl.Ref(tcl.Result()); ​ // чтобы потом вызвать корректный деструктор +      Workbook=tcl.Ref(tcl.Result()); ​ // to then call the correct destructor 
-      // Выбираем лист+      // select Spreadsheet (tab)
       if (tcl.Eval("​set Worksheet [ Excel GetWorksheetIdByIndex $Workbook 1 ]"​)!=TCL_OK) {       if (tcl.Eval("​set Worksheet [ Excel GetWorksheetIdByIndex $Workbook 1 ]"​)!=TCL_OK) {
          ​PrintFormat("​[ Excel GetWorksheetById ] error %s",​tcl.StringResult());​          ​PrintFormat("​[ Excel GetWorksheetById ] error %s",​tcl.StringResult());​
          ​break;​          ​break;​
       }       }
-      Worksheet=tcl.Ref(tcl.Result()); ​ // чтобы потом вызвать корректный деструктор +      Worksheet=tcl.Ref(tcl.Result()); ​ // to then call the correct destructor 
-      // готовим данные +      // prepare data 
-      // можно было обойтись встроенной ​Obj(const MqlRates &​[],​..) ​но она не отформатирует время +      // it was possible to do with built-in ​Obj (const MqlRates & [], ..) but it will not format the time 
-      data=tcl.Ref(tcl.Obj());​ // будет список из строк +      data=tcl.Ref(tcl.Obj());​ // there will be a list of lines 
-      // первая строка ​заголовки колонок+      // first line column headers
       tcl.AppendObj(data,​tcl.List(       tcl.AppendObj(data,​tcl.List(
          ​tcl.Obj("​time"​),​          ​tcl.Obj("​time"​),​
Строка 85: Строка 85:
          ​tcl.Obj("​real_volume"​)          ​tcl.Obj("​real_volume"​)
       ));       ));
-      // заполняем данные+      // fill in the data
       int total=ArraySize(rates);​       int total=ArraySize(rates);​
       if (count==WHOLE_ARRAY) count=total;​       if (count==WHOLE_ARRAY) count=total;​
       for(int i=0;​i<​count && i+pos<​total;​i++) {       for(int i=0;​i<​count && i+pos<​total;​i++) {
-         // ​добавляем строки+         // ​add lines (rows)
          ​tcl.AppendObj(data,​tcl.List(          ​tcl.AppendObj(data,​tcl.List(
             tcl.Obj(TimeToString(rates[i+pos].time,​TIME_DATE|TIME_MINUTES|TIME_SECONDS)),​             tcl.Obj(TimeToString(rates[i+pos].time,​TIME_DATE|TIME_MINUTES|TIME_SECONDS)),​
Строка 101: Строка 101:
          ));          ));
       }       }
-      // выделяем ячейки ​+      // select cells 
       tcl.Set("​Row",​1);​       tcl.Set("​Row",​1);​
       tcl.Set("​Col",​1);​       tcl.Set("​Col",​1);​
Строка 110: Строка 110:
          ​break;​          ​break;​
       }       }
-      Range=tcl.Ref(tcl.Result()); ​ // чтобы потом вызвать корректный деструктор +      Range=tcl.Ref(tcl.Result()); ​ // to then call the correct destructor 
-      // копируем данные в ячейки+      // copy data to cells
       tcl.SetObj("​Data",​data);​       tcl.SetObj("​Data",​data);​
       if (tcl.Eval("​Excel SetRangeValues $Range $Data"​)!=TCL_OK) {       if (tcl.Eval("​Excel SetRangeValues $Range $Data"​)!=TCL_OK) {
Строка 118: Строка 118:
       }       }
    } while(0);    } while(0);
-   // ​удаляем все созданные объекты+   // ​delete all created objects
    if (Range!=0) {    if (Range!=0) {
       tcl.Eval("​Cawt Destroy $Range"​);​       tcl.Eval("​Cawt Destroy $Range"​);​