Discusión sobre el artículo "Interfaces gráficas X: Ordenamiento, reconstrucción de la tabla y controles en las celdas (build 11)" - página 9

 
Anatoli Kazharski:
¿Alineación de qué?

para mostrar la imagen, es necesario alinear el texto en la celda de la tabla después de llamar al método AddRow, tu mismo me escribiste sobre ello y antes de eso también adiviné lo que escribí arriba.
 
Konstantin:

para mostrar la imagen, necesitas alinear el texto en la celda de la tabla después de llamar al método AddRow, tu mismo lo escribiste y antes de eso yo también adiviné lo que escribí arriba

El texto se alinea por defecto para toda la columna. Al añadir filas(AddRow) el valor por defecto sigue siendo el mismo.

También existe este método:

CCanvasTable::TextAlign(const ENUM_ALIGN_MODE &array[])
 
Anatoli Kazharski:
El texto se alinea por defecto para toda la columna. Al añadir filas(AddRow) el valor por defecto sigue siendo el mismo.


entonces no está claro por qué la imagen no se muestra en la fila añadida:

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

         //--- array de imágenes
         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:

Por cierto, si no se conoce de antemano el número de filas de la tabla, al añadirlas más tarde, la información se añade a las celdas, pero no se puede cambiar la alineación en la columna con la imagen:

tal vez hay algún otro mecanismo, dime.

Hice una función para añadir filas a la tabla: lee los datos del fichero sobre los símbolos marcados en la tabla con la lista de símbolos de trabajo (que deben aparecer en la tabla principal) y los añade a la tabla:

//+------------------------------------------------------------------+
//| Añade una fila a la tabla de datos ||
//+------------------------------------------------------------------+
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();       // Rellenar el fichero con 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 de símbolos en la tabla principal
      //--- si el símbolo aún no existe en la tabla
      if(index==WRONG_VALUE) {               
         m_table_main.AddRow(i);                // Añadir una fila a la tabla
         }
      //--- Establecer los parámetros de las columnas de la tabla
      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:

Hice una función para añadir filas a la tabla: lee los datos del archivo sobre los caracteres marcados en la tabla con la lista de caracteres de trabajo (que debe salir a la tabla principal) y los añade a la tabla:

Buen ejemplo. Porque quiero ayudar, pero no tengo tiempo. )

Sobre la base de nuestras discusiones anteriores, voy a añadir métodos más simples para cambiar los parámetros de la tabla. En las próximas actualizaciones estarán disponibles.

 
Artyom Trishkin:

Hice una función para añadir filas a la tabla: lee datos del fichero sobre los símbolos marcados en la tabla con la lista de símbolos de trabajo (que deberían aparecer en la tabla principal) y los añade a la tabla:


No entiendo nada, hago lo mismo, pero el cuadro no aparece, aunque todos los datos están añadidos y actualizados:

/*!
 \brief Actualizar valores de tabla
 \param CWrapTradePair &a_pair - puntero a matriz con datos de señal
 \param CCanvasTable &a_table - objeto de tabla
*/
void CTblSignal::UpdateTable(CWrapTradePair &a_pair,CCanvasTable &a_table) {
   MqlDateTime _date;
   ::TimeToStruct(::TimeTradeServer(), _date);

   //--- control de fin de semana
   if(_date.day_of_week == 0 || _date.day_of_week == 6)
      return;

   //--- descomponer los datos en una tabla
   uint _count = 0;
   for(uint r = 0, _size = a_pair.Size(); r < _size; ++r) {
      if(!a_pair[r].coint)
         continue;

      _count++;
      //--- si no hay suficientes filas, añade y actualiza la estructura de la tabla
      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         a_table.CellType(1, r, CELL_BUTTON);

         //--- array de imágenes
         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);
         //--- "Señal"
         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);
         //--- "Señal"
         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);
         //--- "Señal"
         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);
      }
   }

//--- comprueba si hay filas extra en la tabla
   for(uint r = _count, _size = a_table.RowsTotal(); r < _size; ++r)
      a_table.DeleteRow(r, true);

//--- Actualizar tabla
   a_table.UpdateTable();
}


cual puede ser el error, por favor díganmelo, porque todo el trabajo posterior se queda parado ))

 
Konstantin:

No entiendo nada, estoy haciendo lo mismo, pero la imagen no aparece, aunque todos los datos son añadidos y actualizados:


cual puede ser el error, por favor, y luego todo el trabajo sigue parado ))

¿Y dónde se establece la alineación de las columnas con imágenes?

Debería haber un array donde cada columna tenga su alineación establecida.

 
He hecho pruebas y me he dado cuenta de que todo depende del número de filas fijado de antemano por el método TableSize, tengo que indagar en el código fuente, por alguna razón afecta exactamente a las imágenes.
 
Artyom Trishkin:
¿Dónde se pone la alineación para las columnas con imágenes?


Yo lo hago en el método de creación de la tabla, pero si lo añado así

/*!
 \brief Actualizar valores de tabla
 \param CWrapTradePair &a_pair - puntero a matriz con datos de señal
 \param CCanvasTable &a_table - objeto de tabla
*/
void CTblSignal::UpdateTable(CWrapTradePair &a_pair,CCanvasTable &a_table) {
   //--- descomponer los datos en una tabla
   uint _count = 0;
   for(uint r = 0, _size = a_pair.Size(); r < _size; ++r) {
      if(!a_pair[r].coint)
         continue;

      _count++;
      //--- si no hay suficientes filas, añade y actualiza la estructura de la tabla
      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         //--- array de alineación de texto en columnas
         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);

         //--- array de imágenes
         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);
         //--- "Señal"
         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);
         //--- "Señal"
         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);
         //--- "Señal"
         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);
      }
   }

//--- comprueba si hay filas extra en la tabla
   for(uint r = _count, _size = a_table.RowsTotal(); r < _size; ++r)
      a_table.DeleteRow(r, true);

//--- Actualizar tabla
   a_table.UpdateTable(true);
}

sigue sin cambiar nada ((

 

el problema está resuelto, cometí un error en la indexación:

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

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

         //--- array de imágenes
         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);
      }