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)
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.
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. ....
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? :
Ave.
pr.
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."
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.
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.
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))
//--- Hinzufügen einer Zeile zur Tabelle, wenn die Gesamtzahl kleiner ist als die angegebene Zahl{
int dg=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);
m_table.SetValue(1,1,DoubleToString(tick.bid,dg),dg);
m_table.UpdateTable();
}
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)
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.
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.
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:
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.
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? :
Um zu verhindern, dass die hervorgehobene Zeile blinkt, fügen Sie diese Zeilen in die Methode CTable::UpdateTable() in der letzten Schleife ein:
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? :
Um zu verhindern, dass die hervorgehobene Zeile blinkt, fügen Sie diese Zeilen der Methode CTable::UpdateTable() in der letzten Schleife hinzu:
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 - 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.
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.