Diskussion zum Artikel "Grafisches Interface X: Sortieren, Neuerstellen der Tabelle und Steuerelemente der Zellen (build 11)" - Seite 9

 
Anatoli Kazharski:
Ausrichtung von was?

um das Bild anzuzeigen, müssen Sie den Text in der Tabellenzelle ausrichten, nachdem Sie die AddRow-Methode aufgerufen haben. Sie selbst haben mir darüber geschrieben, und davor habe ich auch vermutet, was ich oben geschrieben habe.
 
Konstantin:

um das Bild anzuzeigen, müssen Sie den Text in der Tabellenzelle ausrichten, nachdem Sie die AddRow-Methode aufgerufen haben; Sie haben selbst darüber geschrieben, und vorher habe ich auch geraten, was ich oben geschrieben habe

Der Text wird standardmäßig für die gesamte Spalte ausgerichtet. Beim Hinzufügen von Zeilen(AddRow) bleibt der Standardwert gleich.

Es gibt auch eine solche Methode:

CCanvasTable::TextAlign(const ENUM_ALIGN_MODE &array[])
 
Anatoli Kazharski:
Der Text wird standardmäßig für die gesamte Spalte ausgerichtet. Beim Hinzufügen von Zeilen(AddRow) bleibt der Standardwert derselbe.


dann ist nicht klar, warum das Bild in der hinzugefügten Zeile nicht angezeigt wird:

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

         //--- Array von Bildern
         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:

Übrigens, wenn die Anzahl der Zeilen in der Tabelle nicht im Voraus bekannt ist, werden die Informationen in die Zellen eingefügt, wenn Sie sie später hinzufügen, aber Sie können die Ausrichtung der Spalte mit dem Bild nicht ändern:

Vielleicht gibt es einen anderen Mechanismus, sagen Sie es mir.

Ich habe eine Funktion zum Hinzufügen von Zeilen zur Tabelle erstellt: Sie liest Daten aus der Datei über die Symbole, die in der Tabelle mit der Liste der Arbeitssymbole (die in der Haupttabelle angezeigt werden sollte) angekreuzt sind, und fügt sie der Tabelle hinzu:

//+------------------------------------------------------------------+
//| Fügt der Datentabelle eine Zeile hinzu |
//+------------------------------------------------------------------+
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();       // Füllen Sie die Datei mit angekreuzten Zeichen
   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);   // Symbolindex in der Haupttabelle
      //--- wenn das Symbol noch nicht in der Tabelle vorhanden ist
      if(index==WRONG_VALUE) {               
         m_table_main.AddRow(i);                // Hinzufügen einer Zeile zur Tabelle
         }
      //--- Parameter für Tabellenspalten festlegen
      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:

Ich habe eine Funktion zum Hinzufügen von Zeilen zur Tabelle erstellt: Sie liest Daten aus der Datei über die in der Tabelle angekreuzten Zeichen mit der Liste der Arbeitszeichen (die in die Haupttabelle ausgegeben werden sollen) und fügt sie der Tabelle hinzu:

Gutes Beispiel. Denn ich möchte gerne helfen, habe aber keine Zeit. )

Basierend auf unseren früheren Diskussionen werde ich einfachere Methoden zum Ändern von Tabellenparametern hinzufügen. In den kommenden Updates werden diese verfügbar sein.

 
Artyom Trishkin:

Ich habe eine Funktion zum Hinzufügen von Zeilen zur Tabelle erstellt: Sie liest Daten aus der Datei über die in der Tabelle mit der Liste der Arbeitssymbole angekreuzten Symbole (die in der Haupttabelle angezeigt werden sollten) und fügt sie der Tabelle hinzu:


Ich verstehe nichts, ich mache das Gleiche, aber das Bild erscheint nicht, obwohl alle Daten hinzugefügt und aktualisiert werden:

/*!
 \brief Tabellenwerte aktualisieren
 \param CWrapTradePair &a_pair - Zeiger auf Array mit Signaldaten
 \param CCanvasTable &a_table - Tabellenobjekt
*/
void CTblSignal::UpdateTable(CWrapTradePair &a_pair,CCanvasTable &a_table) {
   MqlDateTime _date;
   ::TimeToStruct(::TimeTradeServer(), _date);

   //--- Wochenendprüfung
   if(_date.day_of_week == 0 || _date.day_of_week == 6)
      return;

   //--- Zerlegen der Daten in eine Tabelle
   uint _count = 0;
   for(uint r = 0, _size = a_pair.Size(); r < _size; ++r) {
      if(!a_pair[r].coint)
         continue;

      _count++;
      //--- wenn nicht genügend Zeilen vorhanden sind, die Tabellenstruktur hinzufügen und aktualisieren
      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         a_table.CellType(1, r, CELL_BUTTON);

         //--- Array von Bildern
         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-Prüfung"
         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-Prüfung"
         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-Prüfung"
         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);
      }
   }

//--- die Tabelle auf zusätzliche Zeilen prüfen
   for(uint r = _count, _size = a_table.RowsTotal(); r < _size; ++r)
      a_table.DeleteRow(r, true);

//--- Tabelle aktualisieren
   a_table.UpdateTable();
}


Was kann der Fehler sein, bitte sagen Sie es mir, denn die ganze Arbeit steht weiterhin still ))

 
Konstantin:

Ich verstehe nichts, ich mache das gleiche, aber das Bild erscheint nicht, obwohl alle Daten hinzugefügt und aktualisiert werden:


Was kann der Fehler sein, bitte, und dann steht alle Arbeit weiter still ))

Und wo stellt man die Ausrichtung für Spalten mit Bildern ein?

Es sollte ein Array geben, in dem für jede Spalte die Ausrichtung festgelegt ist.

 
Ich habe Tests durchgeführt und festgestellt, dass alles von der Anzahl der Zeilen abhängt, die im Voraus durch die TableSize-Methode festgelegt wurden. Ich muss im Quellcode graben, aus irgendeinem Grund wirkt sich das genau auf Bilder aus.
 
Artyom Trishkin:
Wo legen Sie die Ausrichtung für Spalten mit Bildern fest?


Ich mache es in der Methode zur Tabellenerstellung, aber wenn ich es so hinzufüge:

/*!
 \brief Tabellenwerte aktualisieren
 \param CWrapTradePair &a_pair - Zeiger auf Array mit Signaldaten
 \param CCanvasTable &a_table - Tabellenobjekt
*/
void CTblSignal::UpdateTable(CWrapTradePair &a_pair,CCanvasTable &a_table) {
   //--- Zerlegen der Daten in eine Tabelle
   uint _count = 0;
   for(uint r = 0, _size = a_pair.Size(); r < _size; ++r) {
      if(!a_pair[r].coint)
         continue;

      _count++;
      //--- wenn nicht genügend Zeilen vorhanden sind, die Tabellenstruktur hinzufügen und aktualisieren
      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         //--- Array der Textausrichtung in Spalten
         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 von Bildern
         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-Prüfung"
         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-Prüfung"
         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-Prüfung"
         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);
      }
   }

//--- die Tabelle auf zusätzliche Zeilen prüfen
   for(uint r = _count, _size = a_table.RowsTotal(); r < _size; ++r)
      a_table.DeleteRow(r, true);

//--- Tabelle aktualisieren
   a_table.UpdateTable(true);
}

ändert sich trotzdem nichts ((

 

das Problem ist gelöst, ich habe einen Fehler bei der Indizierung gemacht:

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

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

         //--- Array von Bildern
         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);
      }