Что за ерунда с символом табуляции "\t" ? - страница 5

 

Попробовал я сделать таблицу с помощью лэйблов в моношрифте как тут предлагали - зрелище малоприятное глазу. Особенно дробные числа размазываются по горизонтали так, что очень трудно для восприятия. Так что остаётся только вариант с лэйблами в нормальном шрифте, под каждую ячейку отдельный лэйбл. При этом задействовуется довольно большое количество объектов, как я и писал ранее.

Jartmailru, а не знаешь, реально создать окно для вывода прямо в коде советника, не прибегая к ДЛЛ? Вроде все функции WinApi доступны. Единственная загвоздка может быть только при передачи структуры, содержащей одновременно и переменные, и указатели.

 

лейбы в моноширинке

 
не морочьте мозги - используйте готовый компонент : https://www.mql5.com/ru/code/8724
 
xrust:

лейбы в моношинке


В моноширинке ты хотел сказать?

Так то оно конечно красиво, но у тя там нет таблиц с большим количеством длинных чисел в ряду, поэтому всё довольно легко читается.

 
Meat:


В моноширинке ты хотел сказать?

Так то оно конечно красиво, но у тя там нет таблиц с большим количеством длинных чисел в ряду, поэтому всё довольно легко читается.

Возможно, не знаю, никогда себе такой задачи не ставил. Имея терминал как довольно неплохой инструмент вывода различного рода графической информации в виде графиков и диаграмм, строить и анализировать в нем большое количество текстовой информации ? - зачем когда для этого есть Эксель ... Хотя конечно это лично мое скромное мнение :)
 
jartmailru:
С другой стороны, я удивлюсь, если вы еще не столкнулись с тем,
что в логе обычно нет первых 30% записей, а в последствии записи выборочно теряются.
В логах есть все строки, это терминал их отображает выборочно. Если открывать сами файлы, то в них всё есть.
 
MetaDriver:

// А може сделаешь для юникода вариант DLL ? Буду искренне признателен.

Держи. Добавил функции LogW, SelectW, но не тестировал- будут проблемы обращайся.
Если для 5-ого сделаешь обвязку- присылай :-).
.
Meat:

Jartmailru, а не знаешь, реально создать окно для вывода прямо в коде советника, не прибегая к ДЛЛ? Вроде все функции WinApi доступны. Единственная загвоздка может быть только при передачи структуры, содержащей одновременно и переменные, и указатели.

Если как-то извратиться-то может быть и можно. Не извращаюсь :-).
Окно рядом с МТ на С++ требует отдельный интерфейсный поток.
Если одно окно- это тривиально.
.
Кстати... а ведь не факт, что табуляциями... можно будет выровнять
содержимое колонок в нужной степени.
.
PapaYozh:
В логах есть все строки, это терминал их отображает выборочно. Если открывать сами файлы, то в них всё есть.
Не возражаю :-). Но: у меня отображается всё + у меня сделано сопоставление график-
лог (точка с графика ищется в логе- показывается нужное место).
.
Файлы:
out.zip  123 kb
 

Ну что ж, я сделал таки табуляцию для разноширинных шрифтов! :) Ура! :) Пришлось конечно поизвращаться с функциями WinAPI, но это того стоило. Это пригодится не только для Comment, но и для Label будет очень полезно. Суть в том, что мы получаем размер любого стринга в любом шрифте в пикселях. Ну и затем их уже можно табулировать как угодно, хоть влево, хоть вправо, хоть по центру. Для Comment табуляция естественно идёт с помощью пробелов, поэтому результат не идеальный, погрешность в пределах 1-2 пикселя, но это мелочь в принципе. Для лэйблов всё значительно проще.

Вот пример, демонстрирующий табуляцию в Comment. Тут задан шрифт Tahoma,8, т.к. комменты выводятся именно этим шрифтом.

#import "Gdi32.dll"
  int CreateFontA(int nHeight,int nWidth,int nEscapement,int nOrientation,int fnWeight,int fdwItalic,int fdwUnderline,
                  int fdwStrikeOut,int fdwCharSet,int fdwOutputPrecision,int fdwClipPrecision,int fdwQuality,
                  int fdwPitchAndFamily,string lpszFace);
  int SelectObject(int hdc,int hgdiobj);
  bool DeleteObject(int hObject);
  int GetDeviceCaps(int hdc,int nIndex);
  bool GetTextExtentPoint32A(int hdc,string lpString,int cbString,int lpSize[]);
  
#import "user32.dll"
  int GetDC(int hWnd); 
  int ReleaseDC(int hWnd,int hDC);
  
//+------------------------------------------------------------------+
int start()
{
  #define DEFAULT_CHARSET 1
  #define OUT_DEFAULT_PRECIS 0
  #define CLIP_DEFAULT_PRECIS 0
  #define DEFAULT_QUALITY 0
  #define DEFAULT_PITCH 0
  #define FF_MODERN 48
  int hWnd=WindowHandle(Symbol(),Period());
  int DC=GetDC(hWnd);
  int dpi=GetDeviceCaps(DC,88);  //88=LOGPIXELSX
  string Font="Tahoma";
  int fontsize=8;
  int fontheight=MathRound(fontsize*dpi/72.0);
  int hFont=CreateFontA(fontheight,0,0,0,0,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_MODERN,Font); 
  SelectObject(DC,hFont);
  
  string StringArray[]={"Один","Два","Три","Четыре","Пять","Шесть","Семь","Восемь","Девять","Десять","Одиннадцать","Двенадцать"};
  int arraysize=ArraySize(StringArray);
  int tabpixels=100;  // размер табуляции в пикселях
  int size[2];
  GetTextExtentPoint32A(DC," ",1,size); // получаем размер пробела
  int spacesize=size[0];
  if (spacesize==0) { Alert("spacesize=0"); return(0); }
  string text="\n";
  int rowsize=0;
  int alignmode=0; // 0- по левому краю, 1- по правому краю
  
  for (int i=0; i<arraysize; i++)
  { 
    int column=i%4;
    string str=StringArray[i];
    GetTextExtentPoint32A(DC,str,StringLen(str),size);  // получаем размер строки
    int spacecount=MathRound((tabpixels*(column+1)-size[0]-rowsize)*1.0/spacesize);
    for (int s=0; s<spacecount; s++)
      if (alignmode==0)
        str=str+" ";
       else
        str=" "+str;
    rowsize+=size[0]+spacesize*spacecount;
    text=text+str;
    if (column==3 || i==arraysize-1)
    { 
      text=text+"\n";
      rowsize=0;
      if (i<arraysize-1) continue;
      if (alignmode==1) break;
      alignmode++;
      text=text+"\n\n";
      i=-1;
    }
  }   
  Comment(text);
  ReleaseDC(hWnd,DC);
  DeleteObject(hFont);
  return(0);
}

 
Охренеть вы неленивый :-)
 
Meat:

Вот пример, демонстрирующий табуляцию в Comment. Тут задан шрифт Tahoma,8, т.к. комменты выводятся именно этим шрифтом.


+ переделал вывод любого текста а не только массива строк

+ сделал в виде отдельной функции CommentTab

+ добавил массив значений TabStop и размер Tab по умолчанию (как в GDI функции)

пример текста и результата

//------------------------------------------------------------------    start
int start()
{
  string txt="\n";
  txt=txt+"Ticket\tOpen Time\tType\tSize\tItem\tPrice\tS / L\tT / P\tClose Time\tPrice\tCommission\tTaxes\tSwap\tProfit"+"\n";
  txt=txt+"524567\t28.06.2011 15:02\tbuy\t0.35\teurusd.vpe\t1.43380\t1.43390\t0.00000\t29.06.2011 2:39\t1.43383\t-3.50\t0.00\t0.56\t0.73"+"\n";
  txt=txt+"523492\t28.06.2011 15:02\tbuy\t0.70\teurusd.vpe\t1.43397\t1.43407\t1.47115\t28.06.2011 18:17\t1.43407\t-7.00\t0.00\t0.00\t4.88"+"\n";
  txt=txt+"523494\t28.06.2011 15:02\tbuy\t0.70\teurusd.vpe\t1.43397\t1.43407\t0.00000\t28.06.2011 18:17\t1.43407\t-7.00\t0.00\t0.00\t4.88"+"\n";
  txt=txt+"523498\t28.06.2011 15:02\tbuy\t0.35\teurusd.vpe\t1.43380\t1.43390\t0.00000\t28.06.2011 17:00\t1.43675\t-3.50\t0.00\t0.00\t71.86"+"\n";
  txt=txt+"522650\t27.06.2011 14:50\tbuy\t0.80\teurusd.vpe\t1.42240\t1.42371\t1.43687\t28.06.2011 15:19\t1.43693\t-8.00\t0.00\t1.28\t808.95"+"\n";
  
  int tab[]={10, 22, 10, 10, 15, 12, 12, 12, 22, 12, 20, 10, 10}; // размеры в пробелах
       
  CommentTab(txt, tab, 30); // вызвали преобразование и вывод по табуляции
}


Причина обращения: