Обсуждение статьи "Графические интерфейсы X: Сортировка, реконструкция таблицы и элементы управления в ячейках (build 11)" - страница 9

 
Anatoli Kazharski:
Выравнивание чего?

что бы картинка отображалась, нужно выровнять текст в ячейке таблицы после вызова метода AddRow, вы сами же мне об этом написали и перед этим я так же догадался о чем выше написал
 
Konstantin:

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

Текст выравнивается по умолчанию для всего столбца. При добавлении строк (AddRow) значение по умолчанию остаётся тем же.

Есть ещё такой метод:

CCanvasTable::TextAlign(const ENUM_ALIGN_MODE &array[])
 
Anatoli Kazharski:
Текст выравнивается по умолчанию для всего столбца. При добавлении строк (AddRow) значение по умолчанию остаётся тем же.


тогда не понятно почему не отображается в добавленной строке картинка:

      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         //--- массив картинок
         string _image[3]= { "::Images\\EasyAndFastGUI\\Icons\\bmp16\\circle_gray.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_up.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_down.bmp" };
         a_table.SetImages(1, r, _image);
      }
 
Konstantin:

Кстати если заранее не известно число строк в таблице, то при последующем их добавлении, информация в ячейки добавляется, а вот изменить выравнивание на колонке с картинкой не получается:

может есть какой другой механизм, подскажите.

Сделал функцию добавления строк в таблицу: читает данные из файла о символах, отмеченных галочками в таблице со списком рабочих символов (которые нужно вывести в основную таблицу) и добавляет их в таблицу:

//+------------------------------------------------------------------+
//| Добавляет строку в таблицу с данными                             |
//+------------------------------------------------------------------+
void CProgram::AddSymbolToTableMain(void){
   string img_butt0[1];    img_butt0[0]=m_img_graphic;
   string img_butt8[1];    img_butt8[0]=m_img_buy;
   string img_butt9[1];    img_butt9[0]=m_img_sell;
   string img_butt10[1];   img_butt10[0]=m_img_close;
   //---
   uint sz_used=FillingListUsedSymbols();       // Заполняем файл символов, отмеченных галочками
   uint row=m_table_main.RowsTotal();
   string sy=m_symbol;
   for(ushort i=0; i<sz_used; i++) {
      sy=m_array_data_symbols[i].symbol_name;
      short index=IndexSymbolInTableMain(sy);   // Индекс символа в основной таблице
      //--- если символа в таблице ещё нету
      if(index==WRONG_VALUE) {               
         m_table_main.AddRow(i);                // Добавляем строку в таблицу
         }
      //--- Устанавливаем параметры столбцов таблицы
      m_table_main.CellType(0,i,CELL_BUTTON);
      m_table_main.SetImages(0,i,img_butt0);
      m_table_main.CellType(8,i,CELL_BUTTON);
      m_table_main.SetImages(8,i,img_butt8);
      m_table_main.CellType(9,i,CELL_BUTTON);
      m_table_main.SetImages(9,i,img_butt9);
      m_table_main.CellType(10,i,CELL_BUTTON);
      m_table_main.SetImages(10,i,img_butt10);
      //---
      m_table_main.SetValue(0,i,sy,0);
      m_table_main.TextColor(0,i,(SymbolInfoInteger(sy,SYMBOL_TRADE_MODE)==SYMBOL_TRADE_MODE_DISABLED ? NewColor(clrRed,100,100,100) : 
                                  SymbolInfoInteger(sy,SYMBOL_TRADE_MODE)==SYMBOL_TRADE_MODE_FULL ?     NewColor(clrDimGray,0,50,0) : clrLightGray));
      for(uchar c=2; c<m_table_main.ColumnsTotal(); c++) m_table_main.TextColor(c,i,clrDimGray);
      }
   m_table_main.UpdateTable(true);
   CreateClasses();
}
//+------------------------------------------------------------------+


 
Artyom Trishkin:

Сделал функцию добавления строк в таблицу: читает данные из файла о символах, отмеченных галочками в таблице со списком рабочих символов (которые нужно вывести в основную таблицу) и добавляет их в таблицу:

Хороший пример. А то помочь хочется, а времени нет. )

По нашим предыдущим обсуждениям добавлю более простые методы для изменения параметров таблицы. В ближайшие обновления будут доступны.

 
Artyom Trishkin:

Сделал функцию добавления строк в таблицу: читает данные из файла о символах, отмеченных галочками в таблице со списком рабочих символов (которые нужно вывести в основную таблицу) и добавляет их в таблицу:


ни чего не понимаю, делаю примерно так же, но картинка не появляется, хотя все данные добавляются и обновляются:

/*!
   \brief   Обновление значений таблицы
   \param   CWrapTradePair &a_pair - указатель на массив с данными сигналов
   \param   CCanvasTable &a_table - объект таблицы
*/
void CTblSignal::UpdateTable(CWrapTradePair &a_pair,CCanvasTable &a_table) {
   MqlDateTime _date;
   ::TimeToStruct(::TimeTradeServer(), _date);

   //--- проверка на выходные
   if(_date.day_of_week == 0 || _date.day_of_week == 6)
      return;

   //--- разложим данные по таблице
   uint _count = 0;
   for(uint r = 0, _size = a_pair.Size(); r < _size; ++r) {
      if(!a_pair[r].coint)
         continue;

      _count++;
      //--- если строк не достаточно то добавим и обновим структуру таблицы
      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         a_table.CellType(1, r, CELL_BUTTON);

         //--- массив картинок
         string _image[3]= { "::Images\\EasyAndFastGUI\\Icons\\bmp16\\circle_gray.bmp",
                             "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_up.bmp",
                             "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_down.bmp" };
         a_table.SetImages(1, r, _image);
      }

      if(a_pair[r].event == COINT_BS_NOISE || a_pair[r].event == COINT_SB_NOISE) {
         //--- "Ticker"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_NOISE, true);
         //--- "Signal"
         a_table.ChangeImage(1, _count - 1, 0, true);
         //--- "DF-test"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_NOISE, true);
         //--- "Delta%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_NOISE, true);
      } else if(a_pair[r].event == COINT_BS || a_pair[r].event == COINT_SB) {
         //--- "Ticker"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_BSSB, true);
         //--- "Signal"
         a_table.ChangeImage(1, _count - 1, 1, true);
         //--- "DF-test"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_BSSB, true);
         //--- "Delta%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_BSSB, true);
      } else {
         //--- "Ticker"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_NOT, true);
         //--- "Signal"
         a_table.ChangeImage(1, _count - 1, 2, true);
         //--- "DF-test"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_NOT, true);
         //--- "Delta%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_NOT, true);
      }
   }

//--- проверим таблицу на лишние строки
   for(uint r = _count, _size = a_table.RowsTotal(); r < _size; ++r)
      a_table.DeleteRow(r, true);

//--- Обновить таблицу
   a_table.UpdateTable();
}


в чем может быть ошибка, подскажите, а то вся работа дальше стоит на месте ))

 
Konstantin:

ни чего не понимаю, делаю примерно так же, но картинка не появляется, хотя все данные добавляются и обновляются:


в чем может быть ошибка, подскажите, а то вся работа дальше стоит на месте ))

А где вы задаёте выравнивание для столбцов с картинками?

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

 
провел тесты и понял, что все зависит от числа строк заданных заранее методом TableSize, нужно покопать в исходниках, почему то именно на картинки это влияет
 
Artyom Trishkin:
А где вы задаёте выравнивание для столбцов с картинками?


я это делаю в методе создания таблицы, но если добавить так:

/*!
   \brief   Обновление значений таблицы
   \param   CWrapTradePair &a_pair - указатель на массив с данными сигналов
   \param   CCanvasTable &a_table - объект таблицы
*/
void CTblSignal::UpdateTable(CWrapTradePair &a_pair,CCanvasTable &a_table) {
   //--- разложим данные по таблице
   uint _count = 0;
   for(uint r = 0, _size = a_pair.Size(); r < _size; ++r) {
      if(!a_pair[r].coint)
         continue;

      _count++;
      //--- если строк не достаточно то добавим и обновим структуру таблицы
      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         //--- массив выравнивания текста в столбцах
         ENUM_ALIGN_MODE _align[TBL_COLUMNS_TOTAL];
         ::ArrayInitialize(_align, ALIGN_RIGHT);
         _align[1] = ALIGN_LEFT;
         m_table.TextAlign(_align);

         a_table.CellType(1, r, CELL_BUTTON);

         //--- массив картинок
         string _image[3]= { "::Images\\EasyAndFastGUI\\Icons\\bmp16\\circle_gray.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_up.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_down.bmp" };
         a_table.SetImages(1, r, _image);
      }

      if(a_pair[r].event == COINT_BS_NOISE || a_pair[r].event == COINT_SB_NOISE) {
         //--- "Ticker"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_NOISE, true);
         //--- "Signal"
         a_table.ChangeImage(1, _count - 1, 0, true);
         //--- "DF-test"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_NOISE, true);
         //--- "Delta%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_NOISE, true);
      } else if(a_pair[r].event == COINT_BS || a_pair[r].event == COINT_SB) {
         //--- "Ticker"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_BSSB, true);
         //--- "Signal"
         a_table.ChangeImage(1, _count - 1, 1, true);
         //--- "DF-test"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_BSSB, true);
         //--- "Delta%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_BSSB, true);
      } else {
         //--- "Ticker"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_NOT, true);
         //--- "Signal"
         a_table.ChangeImage(1, _count - 1, 2, true);
         //--- "DF-test"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_NOT, true);
         //--- "Delta%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_NOT, true);
      }
   }

//--- проверим таблицу на лишние строки
   for(uint r = _count, _size = a_table.RowsTotal(); r < _size; ++r)
      a_table.DeleteRow(r, true);

//--- Обновить таблицу
   a_table.UpdateTable(true);
}

то все равно ни чего не изменится ((

 

вопрос снят, сам ступил в индексации:

      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);
         
         //--- делать дополнительно выравнивание не нужно, все сохраняется от первой строки

         a_table.CellType(1, _count - 1, CELL_BUTTON);

         //--- массив картинок
         string _image[3]= { "::Images\\EasyAndFastGUI\\Icons\\bmp16\\circle_gray.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_up.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_down.bmp" };
         a_table.SetImages(1, _count - 1, _image);
      }
Причина обращения: