Discussão do artigo "Interfaces gráficas X: Ordenação, reconstrução da tabela e controles nas células (build 11)" - página 9

 
Anatoli Kazharski:
Alinhamento de quê?

Para exibir a imagem, você precisa alinhar o texto na célula da tabela depois de chamar o método AddRow. Você mesmo me escreveu sobre isso e, antes disso, eu também adivinhei o que escrevi acima.
 
Konstantin:

Para exibir a imagem, você precisa alinhar o texto na célula da tabela depois de chamar o método AddRow. Você mesmo escreveu sobre isso e, antes disso, eu também adivinhei o que escrevi acima

O texto é alinhado por padrão para toda a coluna. Ao adicionar linhas(AddRow), o valor padrão permanece o mesmo.

Também existe esse método:

CCanvasTable::TextAlign(const ENUM_ALIGN_MODE &array[])
 
Anatoli Kazharski:
O texto é alinhado por padrão para toda a coluna. Ao adicionar linhas(AddRow), o valor padrão permanece o mesmo.


Então, não fica claro por que a imagem não é exibida na linha adicionada:

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

         //--- matriz de imagens
         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:

A propósito, se o número de linhas da tabela não for conhecido antecipadamente, quando você as adicionar posteriormente, as informações serão adicionadas às células, mas não será possível alterar o alinhamento da coluna com a imagem:

talvez haja algum outro mecanismo, diga-me.

Criei uma função para adicionar linhas à tabela: ela lê os dados do arquivo sobre os símbolos marcados na tabela com a lista de símbolos de trabalho (que devem ser exibidos na tabela principal) e os adiciona à tabela:

//+------------------------------------------------------------------+
//| Adiciona uma linha à tabela de dados
//+------------------------------------------------------------------+
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();       // Preencher o arquivo com caracteres marcados
   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);   // Índice do símbolo na tabela principal
      //--- se o símbolo ainda não existir na tabela
      if(index==WRONG_VALUE) {               
         m_table_main.AddRow(i);                // Adicionar uma linha à tabela
         }
      //--- Definir os parâmetros da coluna da tabela
      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:

Criei uma função para adicionar linhas à tabela: ela lê os dados do arquivo sobre os caracteres marcados na tabela com a lista de caracteres de trabalho (que deve ser enviada para a tabela principal) e os adiciona à tabela:

Bom exemplo. Porque eu quero ajudar, mas não tenho tempo. )

Com base em nossas discussões anteriores, adicionarei métodos mais simples para alterar os parâmetros da tabela. As próximas atualizações estarão disponíveis.

 
Artyom Trishkin:

Criei uma função para adicionar linhas à tabela: ela lê os dados do arquivo sobre os símbolos marcados na tabela com a lista de símbolos de trabalho (que deve ser exibida na tabela principal) e os adiciona à tabela:


Não estou entendendo nada, faço a mesma coisa, mas a imagem não aparece, embora todos os dados tenham sido adicionados e atualizados:

/*!
 \brief Update table values
 \param CWrapTradePair &a_pair - ponteiro para a matriz com dados de sinal
 \param CCanvasTable &a_table - objeto de tabela
*/
void CTblSignal::UpdateTable(CWrapTradePair &a_pair,CCanvasTable &a_table) {
   MqlDateTime _date;
   ::TimeToStruct(::TimeTradeServer(), _date);

   //--- verificação de fim de semana
   if(_date.day_of_week == 0 || _date.day_of_week == 6)
      return;

   //--- decompor os dados em uma tabela
   uint _count = 0;
   for(uint r = 0, _size = a_pair.Size(); r < _size; ++r) {
      if(!a_pair[r].coint)
         continue;

      _count++;
      //--- se não houver linhas suficientes, adicione e atualize a estrutura da tabela
      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         a_table.CellType(1, r, CELL_BUTTON);

         //--- matriz de imagens
         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);
         //--- "Sinal"
         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);
         //--- "Sinal"
         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);
         //--- "Sinal"
         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);
      }
   }

//--- verifique se há linhas extras na tabela
   for(uint r = _count, _size = a_table.RowsTotal(); r < _size; ++r)
      a_table.DeleteRow(r, true);

//--- Atualizar a tabela
   a_table.UpdateTable();
}


Qual pode ser o erro, por favor, me diga, pois todo o trabalho continua parado))

 
Konstantin:

Não estou entendendo nada, estou fazendo a mesma coisa, mas a imagem não aparece, embora todos os dados tenham sido adicionados e atualizados:


qual pode ser o erro, por favor, e depois todo o trabalho fica parado))

E onde você define o alinhamento das colunas com imagens?

Deve haver uma matriz em que cada coluna tem seu alinhamento definido.

 
Fiz testes e percebi que tudo depende do número de linhas definido antecipadamente pelo método TableSize. Preciso examinar o código-fonte, mas por algum motivo ele afeta exatamente as imagens.
 
Artyom Trishkin:
Onde você define o alinhamento das colunas com imagens?


Eu faço isso no método de criação da tabela, mas se eu adicionar assim:

/*!
 \brief Update table values
 \param CWrapTradePair &a_pair - ponteiro para a matriz com dados de sinal
 \param CCanvasTable &a_table - objeto de tabela
*/
void CTblSignal::UpdateTable(CWrapTradePair &a_pair,CCanvasTable &a_table) {
   //--- decompor os dados em uma tabela
   uint _count = 0;
   for(uint r = 0, _size = a_pair.Size(); r < _size; ++r) {
      if(!a_pair[r].coint)
         continue;

      _count++;
      //--- se não houver linhas suficientes, adicione e atualize a estrutura da tabela
      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         //--- matriz de alinhamento de texto em colunas
         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);

         //--- matriz de imagens
         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);
         //--- "Sinal"
         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);
         //--- "Sinal"
         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);
         //--- "Sinal"
         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);
      }
   }

//--- verifique se há linhas extras na tabela
   for(uint r = _count, _size = a_table.RowsTotal(); r < _size; ++r)
      a_table.DeleteRow(r, true);

//--- Atualizar a tabela
   a_table.UpdateTable(true);
}

ele ainda não muda nada ((

 

o problema foi resolvido, cometi um erro na indexação:

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

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

         //--- matriz de imagens
         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);
      }