Diskussion zum Artikel "Grafische Interfaces X: Erweitertes Management von Listen und Tabellen Code Optimierung (build 7)" - Seite 7

 
Anatoli Kazharski:
Nicht genug Daten, um es zu reproduzieren. Geben Sie mir ein vollständiges Beispiel, damit ich es selbst nachbauen kann.

In einer privaten Nachricht dann - Sie brauchen dort zusätzliche Klassen.

Ja, es passiert nach dem Neuaufbau der Tabelle.

 
Anatoli Kazharski:
Nicht genug Daten, um es zu reproduzieren. Bitte fügen Sie ein vollständiges Beispiel bei, damit ich es selbst wiederholen kann.

Tol, zur vorherigen Frage und zur privaten Nachricht mit einem Codebeispiel ohne Tamburine: Nimm dein Beispiel aus Experts\Article10\TestLibrary06.

In Program.mqh im Timer schreibst du einfach ein paar Zeilen, kompilierst und schaust.

//+------------------------------------------------------------------+
//| Timer|
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//--- Pause zwischen Elementaktualisierungen
   if(m_counter1.CheckTimeCounter())
     {
      //--- Aktualisieren des zweiten Elements der Statusleiste
      m_status_bar.ValueToItem(1,::TimeToString(::TimeLocal(),TIME_DATE|TIME_SECONDS));
      //--- Zeichnen Sie das Diagramm neu
      m_chart.Redraw();
     }
//--- Pause zwischen Elementaktualisierungen
   if(m_counter2.CheckTimeCounter())
     {
      //--- Geben Sie den Kurswert des aktuellen Symbols in das Feld Preis der ersten Zeile ein
      MqlTick tick;

      if(SymbolInfoTick(Symbol(),tick))
        {
         int dg=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);
         m_table.SetValue(1,1,DoubleToString(tick.bid,dg),dg);
         m_table.UpdateTable();
        }

      //--- Hinzufügen einer Zeile zur Tabelle, wenn die Gesamtzahl kleiner ist als die angegebene Zahl
      if(m_table.RowsTotal()<m_spin_edit1.GetValue())
         m_table.AddRow();
      //--- Hinzufügen einer Spalte zur Tabelle, wenn die Gesamtzahl der Spalten geringer ist als die angegebene Anzahl.
      if(m_table.ColumnsTotal()<m_spin_edit2.GetValue())
         m_table.AddColumn();
      //--- Fügen Sie der Liste ein Element hinzu, wenn die Gesamtzahl kleiner ist als die angegebene Zahl.
      if(m_listview.ItemsTotal()<m_spin_edit5.GetValue())
        {
         m_listview.AddItem("SYMBOL "+string(m_listview.ItemsTotal()));
         //--- Den Schieberegler der Bildlaufleiste an das Ende der Liste verschieben
         m_listview.Scrolling();
        }
      //--- Hinzufügen eines Eintrags aus den Kontrollkästchen zur Liste, wenn die Gesamtzahl kleiner ist als die angegebene Zahl
      if(m_checkbox_list.ItemsTotal()<m_spin_edit5.GetValue())
        {
         m_checkbox_list.AddItem("Checkbox "+string(m_checkbox_list.ItemsTotal()));
         //--- Den Schieberegler der Bildlaufleiste an das Ende der Liste verschieben
         m_checkbox_list.Scrolling();
        }
      //--- Zeichnen Sie das Diagramm neu
      m_chart.Redraw();
     }
  }
//+------------------------------------------------------------------+

Ohne eine Zeile mit Tabellenaktualisierung gibt es keinen Preis in der ersten Spalte der ersten Zeile. Wenn doch, wird der Preis eingegeben und geändert, aber die Tabelle wird ständig neu gezeichnet, und es ist nicht mehr möglich, mit ihr zu arbeiten.

Was muss ich tun, wenn ich viele Zeilen der Tabelle in Echtzeit aktualisieren muss? (viele Symbole, und für jedes muss der aktuelle Preis angezeigt werden)

 
Artyom Trishkin:

Tol, bezüglich der vorherigen Frage und der persönlichen Nachricht mit einem Codebeispiel ohne Tamburine: Nehmen Sie Ihr Beispiel aus Experts\Article10\TestLibrary06.

In Program.mqh im Timer einfach ein paar Zeilen schreiben, kompilieren und beobachten.

...

Ohne eine Zeile mit Tabellenaktualisierung gibt es keinen Preis in der ersten Spalte der ersten Zeile. Wenn doch, wird der Preis eingegeben und geändert, aber die Tabelle wird ständig neu gezeichnet, und es ist nicht mehr möglich, mit ihr zu arbeiten.

Was muss ich tun, wenn ich viele Zeilen der Tabelle in Echtzeit aktualisieren muss? (viele Symbole, und für jedes muss der aktuelle Preis angezeigt werden).

Vielleicht ist es (auf den ersten Blick) notwendig, die Methode CTable::SetValue() leicht zu ändern, so dass es möglich wäre, den Wert der angegebenen Zelle zu ändern, wobei nur diese Zelle aktualisiert wird (wenn sie sich im sichtbaren Bereich befindet), und nicht die gesamte Tabelle.

Ich werde einen Blick darauf werfen, wenn ich mit der Arbeit an dem aktuellen Artikel fertig bin.

P.S. Ich werde auch das Blinken der markierten Zeile beheben.

 
Anatoli Kazharski:

Vielleicht müssen Sie (auf den ersten Blick) die Methode CTable::SetValue() etwas abändern, damit Sie den Wert einer bestimmten Zelle ändern können und nur diese Zelle aktualisiert wird (wenn sie sich im sichtbaren Bereich befindet), nicht die gesamte Tabelle.

Ich werde es mir ansehen, wenn ich mit der Arbeit am aktuellen Artikel fertig bin.

P.S. Ich werde auch das Blinken der markierten Zeile beheben.

Gibt es eine "schnelle" Lösung, die "sofort" erledigt werden kann?
 
Artyom Trishkin:
Es gibt keine "schnelle" Lösung, was ist "jetzt"?

Um zu verhindern, dass die ausgewählte Tabellenzeile blinkt, fügen Sie diese Zeilen in die Methode CTable::UpdateTable() in der letzten Schleife ein:

//--- Spalten
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- Ermitteln der aktuellen Position des Schiebereglers für die vertikale Bildlaufleiste
      v=m_scrollv.CurrentPos()+t;
      //--- Zeilen
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- Daten der Offset-Tabelle
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- Anpassung für die hervorgehobene Zeile
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];

            //--- Anpassen von (1) Werten, (2) Hintergrundfarbe, (3) Textfarbe und (4) Textausrichtung in Zellen
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }

//---

Und für den Rest brauchen Sie mehr Details.

Artyom Trishkin:

Wenn Sie die Tabelle jedes Mal aktualisieren, wenn ein neuer Tick empfangen wird, wird es unmöglich, mit der Tabelle zu arbeiten - sie blinkt, die ausgewählte Zeile blinkt , usw. usw. ....

Was ist das? :

  1. pr.
  2. pr.
  3. pr...
 
Anatoli Kazharski:

Um zu verhindern, dass die hervorgehobene Zeile blinkt, fügen Sie diese Zeilen in die Methode CTable::UpdateTable() in der letzten Schleife ein:

//--- Spalten
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- Ermitteln der aktuellen Position des Schiebereglers für die vertikale Bildlaufleiste
      v=m_scrollv.CurrentPos()+t;
      //--- Zeilen
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- Daten der Offset-Tabelle
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- Anpassung für die hervorgehobene Zeile
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];

            //--- Anpassen von (1) Werten, (2) Hintergrundfarbe, (3) Textfarbe und (4) Textausrichtung in Zellen
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }

//---

Und für den Rest brauchen Sie mehr Details.

Was ist das? :

  1. Ave.
  2. pr.
  3. pr--
Danke für die Korrektur des Codes und für das "pr, pr, pr, pr". - vielleicht war ich in Eile, es so zu schreiben ;) Ich werde sehen, wie und was mit den Korrekturen wird, dann werde ich wieder berichten. Was ich aber schon sagen kann, ist, dass die ganze Tabelle aktualisiert wird, nicht nur eine Zeile, denke ich. Das führt manchmal zu auffälligem Blinken beim Aktualisieren der ganzen Tabelle - das ist einer der "pr."
 
Anatoli Kazharski:

Um zu verhindern, dass die hervorgehobene Zeile blinkt, fügen Sie diese Zeilen der Methode CTable::UpdateTable() in der letzten Schleife hinzu:

//--- Spalten
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- Ermitteln der aktuellen Position des Schiebereglers für die vertikale Bildlaufleiste
      v=m_scrollv.CurrentPos()+t;
      //--- Zeilen
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- Daten der Offset-Tabelle
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- Anpassung für die hervorgehobene Zeile
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];

            //--- Anpassen von (1) Werten, (2) Hintergrundfarbe, (3) Textfarbe und (4) Textausrichtung in Zellen
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }

Nein, am Verhalten hat sich nichts geändert - sie blinkt immer noch. Wenn sich der Mauszeiger über der Tabelle befindet, blinkt sie, wenn sich der Mauszeiger außerhalb des Fensters befindet, ist überhaupt keine Zeilenauswahl sichtbar.
 
Artyom Trishkin:
Nein, am Verhalten hat sich nichts geändert - es blinkt immer noch. Wenn sich der Mauszeiger über der Tabelle befindet, blinkt er, wenn sich der Mauszeiger außerhalb des Fensters befindet, ist überhaupt keine Zeilenauswahl sichtbar.
Das ist bei meinen Änderungen nicht der Fall. Bei dem von Ihnen vorgeschlagenen Beispiel blinkt die markierte Zeile nicht mehr.
 
Anatoli Kazharski:
Mit den Änderungen, die ich vorgenommen habe, sehe ich das nicht. Die hervorgehobene Zeile blinkt nicht mehr in dem Beispiel, das Sie zum Testen vorgeschlagen haben.
Tol, ich werde mir das Beispiel ansehen - ich habe es in meinem Programm durchgesehen, aber jetzt muss ich weglaufen. Wenn ich zurückkomme, schreibe ich dir wieder.
 
Artyom Trishkin:
Tol, ich werde mir das Beispiel ansehen - ich habe es in meinem Programm durchgesehen, aber jetzt muss ich weglaufen. Wenn ich zurückkomme, schreibe ich dir wieder.
Sehr gut. Lassen Sie uns später mit dem Beispiel fortfahren, mit dem wir hier begonnen haben. Vervollständigen Sie es bis zu dem Punkt, an dem das Problem auftritt.