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

 
Anatoli Kazharski:
Ich muss das falsche Beispiel in den Artikel eingefügt haben. Auf jeden Fall korrigieren Sie es für Ihre Aufgaben, wie Sie es brauchen.

Ich kopiere nicht Ihren Code, ich interessiere mich für die Arbeit der SetImages-Methode selbst, ist es notwendig, Bilder in jeder Zelle zu setzen, wenn Sie sie in jeder Spalte der Tabelle verwenden, oder ist es ein Fehler in Ihrem Beispiel und Sie müssen sie nur einfügen, wo Sie sie verwenden?
 
Konstantin:

Ich kopiere Ihren Code nicht, sondern interessiere mich für die Arbeit der SetImages-Methode selbst. Ist es notwendig, Bilder in jede Zelle einzufügen, wenn Sie sie in einer beliebigen Spalte der Tabelle verwenden, oder ist es ein Fehler in Ihrem Beispiel und Sie sollten sie nur dort einfügen, wo Sie sie verwenden?

Soweit ich das verstanden habe, müssen Sie Bilder nur in die Zellen der ersten Spalte einfügen.

Versuchen Sie es so:

//+------------------------------------------------------------------+
//| Initialisierung der Tabelle|
//+------------------------------------------------------------------+
void CMainPanel::InitializingTable(void)
  {
//--- Array von Kopfzeilennamen
   string text_headers[COLUMNS1_TOTAL]={"Symbol","Bid","Ask","!","Time"};
//--- Array von Zeichen
   string text_str = "MFON SBER SBERP GAZP TATN LKOH ROSN NVTK SNGS SNGSP VTBR MOEX AFKS IRAO "
                     "AFLT FEES ALRS MAGN NLMK CHMF GMKN HYDR TATNP YNDX RTKM MGNT MTSS";
   string text_array[];
   int _size = CreateArray(text_str, text_array); 
//--- Array von Bildern
   string image_array[3]=
     {
      "::Images\\EasyAndFastGUI\\Icons\\bmp16\\circle_gray.bmp",
      "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_up.bmp",
      "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_down.bmp"
     };
//---
   for(int c=0; c<COLUMNS1_TOTAL; c++)
     {
      //--- Festlegen der Kopfzeilennamen
      m_canvas_table.SetHeaderText(c,text_headers[c]);
      //---
      for(int r=0; r<ROWS1_TOTAL; r++)
        {
         //--- Bilder und Zeichennamen in der ersten Spalte einstellen
         if(c<1)
            {
             m_canvas_table.SetImages(c,r,image_array);
             m_canvas_table.SetValue(c,r,text_array[r]);
            }
         //--- In allen anderen Spalten für alle Zellen den Standardwert und ohne Bilder
         else
            m_canvas_table.SetValue(c,r,"-");
        }
     }
  }
 
Anatoli Kazharski:

Soweit ich das verstanden habe, müssen Sie Bilder nur in die Zellen der ersten Spalte einfügen.

Versuchen Sie dies:


))))) es gibt also immer noch einen Tippfehler in der Methode? ich bin so vorgegangen.

Und wie kann man die Belastung der berechneten Kapazitäten am besten optimieren. Es gibt Daten, die einmal pro Periode gezählt werden (z.B. M5), die Daten werden in einer Tabelle von OnTimer angezeigt. Die Größe der Zeilen bei jeder Neuberechnung ist nicht garantiert, dass sie der letzten Berechnung entspricht. Ich sehe bisher zwei Möglichkeiten:
1. Nach jeder Neuberechnung alle Zeilen löschen und die erforderliche Anzahl von Zeilen erstellen. Zwischen den Neuberechnungen werden die Daten einfach aktualisiert.

2. Nach jeder Neuberechnung aktualisieren wir die Daten in den vorhandenen Zeilen der Tabelle, wenn es nicht genug Zeilen gibt, fügen wir neue hinzu, wenn es mehr Zeilen als Daten gibt, löschen wir die, die wir nicht brauchen.

Welche dieser Optionen ist für eine Tabelle, die auf CCanvasTable basiert, am besten geeignet?

 
Konstantin:

...

Welche dieser Optionen ist für eine auf CCanvasTable basierende Tabelle besser geeignet?

Ich werde das nicht sofort beantworten können. Versuchen Sie, Tests mit Zeitmessungen(GetTickCount() oder GetMicrosecondCount()) durchzuführen oder testen Sie im Profiling-Modus.
 
Anatoli Kazharski:
Ich werde Ihnen nicht sofort eine Antwort geben können. Versuchen Sie, Tests mit Zeitmessungen(GetTickCount() oder GetMicrosecondCount()) durchzuführen oder testen Sie im Profiling-Modus.
Aus irgendeinem Grund wird das Bild nur in der Spalte mit dem Index 0 eingefügt, nicht aber in den anderen Spalten, ist das eine Besonderheit oder ein Fehler?
 
Konstantin:
aus irgendeinem Grund wird das Bild nur in der Spalte mit dem Index 0 eingefügt, in anderen Spalten wird es nicht eingefügt, ist das eine Besonderheit oder etwas falsch?

Und welches Ergebnis möchten Sie erhalten? Beschreiben Sie es im Detail.

Und wo liegt das Problem, es selbst zu machen? Alle notwendigen Methoden sind dafür vorgesehen.

P.S. Zeigen Sie Screenshots und Code, um besser zu verstehen, was Sie brauchen.

 
Anatoli Kazharski:

Und welches Ergebnis wünschen Sie sich? Beschreiben Sie es im Detail.

Und was ist das Problem, wenn Sie es selbst machen? Alle notwendigen Methoden werden dafür bereitgestellt.

P.S. Zeigen Sie Screenshots und Code, um besser zu verstehen, was Sie brauchen.


Wenn ich Ihr Beispiel verwende, ändere ich den Index von 0 auf 1:

void CProgram::UpdateTable(void)
  {
   MqlDateTime check_time;
   ::TimeToStruct(::TimeTradeServer(),check_time);
//--- Beenden, wenn es Samstag oder Sonntag ist
   if(check_time.day_of_week==0 || check_time.day_of_week==6)
      return;
//---
   for(uint c=0; c < m_canvas_table.ColumnsTotal(); c++)
     {
      for(uint r=0; r < m_canvas_table.RowsTotal(); r++)
        {
         //--- Für welches Zeichen erhalten wir Daten
         string symbol = m_canvas_table.GetValue(0, r);
         //--- Abrufen der Daten der letzten beiden Ticks
         MqlTick ticks[];
         if(::CopyTicks(symbol, ticks, COPY_TICKS_ALL, 0, 2) < 2)
            continue;
         //--- Einstellen des Arrays als Zeitreihe
         ::ArraySetAsSeries(ticks, true);
         //--- Spalte Symbol - Symbol. Lassen Sie uns die Kursrichtung bestimmen.
         if(c==1)
           {
            int index=0;
            //--- Wenn sich die Preise nicht geändert haben
            if(ticks[0].ask==ticks[1].ask && ticks[0].bid==ticks[1].bid)
               index=0;
            //--- Wenn sich der Geldkurs nach oben verändert hat
            else if(ticks[0].bid>ticks[1].bid)
               index=1;
            //--- Wenn sich der Geldkurs nach unten verändert hat
            else if(ticks[0].bid<ticks[1].bid)
               index=2;
            //--- Das entsprechende Bild einstellen
            m_canvas_table.ChangeImage(c,r,index,true);
           }
         else
           {
            //--- Spalte Preisdifferenz - Spanne (!)
            if(c==3)
              {
               //--- Abrufen und Einstellen der Spread-Größe in Pips
               int spread=(int)::SymbolInfoInteger(symbol,SYMBOL_SPREAD);
               m_canvas_table.SetValue(c,r,string(spread),true);
               continue;
              }
            //--- Ermitteln der Anzahl der Dezimalstellen
            int digit=(int)::SymbolInfoInteger(symbol,SYMBOL_DIGITS);
            //--- Preisspalte Gebot
            if(c==1)
              {
               m_canvas_table.SetValue(c,r,::DoubleToString(ticks[0].bid,digit));
               //--- Wenn sich der Preis geändert hat, setzen Sie die Farbe entsprechend der Richtung
               if(ticks[0].bid!=ticks[1].bid)
                  m_canvas_table.TextColor(c,r,(ticks[0].bid<ticks[1].bid)? clrRed : clrBlue,true);
               //---
               continue;
              }
            //--- Spalte Briefkurs
            if(c==2)
              {
               m_canvas_table.SetValue(c,r,::DoubleToString(ticks[0].ask,digit));
               //--- Wenn sich der Preis geändert hat, setzen Sie die Farbe entsprechend der Richtung
               if(ticks[0].ask!=ticks[1].ask)
                  m_canvas_table.TextColor(c,r,(ticks[0].ask<ticks[1].ask)? clrRed : clrBlue,true);
               //---
               continue;
              }
            //--- Spalte mit der letzten Ankunftszeit der Symbolpreise
            if(c==4)
              {
               long   time     =::SymbolInfoInteger(symbol,SYMBOL_TIME);
               string time_msc =::IntegerToString(ticks[0].time_msc);
               int    length   =::StringLen(time_msc);
               string msc      =::StringSubstr(time_msc,length-3,3);
               string str      =::TimeToString(time,TIME_MINUTES|TIME_SECONDS)+"."+msc;
               //---
               color clr=clrBlack;
               //--- Wenn sich die Preise nicht geändert haben
               if(ticks[0].ask==ticks[1].ask && ticks[0].bid==ticks[1].bid)
                  clr=clrBlack;
               //--- Wenn sich der Geldkurs nach oben verändert hat
               else if(ticks[0].bid>ticks[1].bid)
                  clr=clrBlue;
               //--- Wenn sich der Geldkurs nach unten verändert hat
               else if(ticks[0].bid<ticks[1].bid)
                  clr=clrRed;
               //--- Den Wert und die Farbe des Textes festlegen
               m_canvas_table.SetValue(c,r,str);
               m_canvas_table.TextColor(c,r,clr,true);
               continue;
              }
           }
        }
     }

   int _height = int(m_chart.HeightInPixels(0) * .30);
   m_canvas_table.AutoYResizeBottomOffset(_height);

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

Die Icons sollten sich in die Spalte mit dem Index 1, also die zweite, bewegen, aber das passiert nicht. Das Beispiel ist aus TestLibrary10.mqh entnommen. Ich habe keine Methoden für die Positionierung der Zahlen gefunden, wenn es welche gibt, sagen Sie es mir bitte.

 
Im Allgemeinen kann ich das Prinzip des Ladens von Bildern in die Zellen der Tabelle nicht verstehen. Im Beispiel TestLibrary09.mqh werden Zeichnungen in verschiedenen Spalten geladen, und im Beispiel TestLibrary10.mqh nur in der Spalte mit dem Index 0, wenn sie in anderen Spalten eingestellt sind, werden Zeichnungen nicht geladen. Können Sie mir sagen, was die Feinheiten dort sind?
 
Konstantin:
Im Allgemeinen kann ich das Prinzip des Ladens von Bildern in die Zellen der Tabelle nicht verstehen. Im Beispiel TestLibrary09.mqh werden Zeichnungen in verschiedenen Spalten geladen, und im Beispiel TestLibrary10.mqh nur in der Spalte mit dem Index 0, wenn sie in anderen Spalten eingestellt sind, werden Zeichnungen nicht geladen. Können Sie mir sagen, was ist die Feinheiten dort?

Für jede Zelle der Tabelle, die Bilder enthalten soll, benötigen Sie ein eigenes Array von Bildern. Wenn die Zelle vom Typ CELL_BUTTON ist, dann reicht ein Minimum von einem Bild pro Zelle, wenn der Typ CELL_CHECKBOX, dann ein Minimum von zwei.

Ein Beispiel:

Das Bild mit dem Index 0 - entspricht dem "gedrückten" Zustand der Checkbox (Schaltfläche), die anderen Indizes entsprechen dem "ausgewählten" Zustand der Checkbox (Schaltfläche).

(nicht fertig, aber zum Verständnis ausreichend):

Bildschirmfotos der MetaTrader-Handelsplattform

EURUSD, M1, 2017.04.21

MetaQuotes Software Corp, MetaTrader 4, Demo

EURUSD, M1, 2017.04.21, MetaQuotes Software Corp., MetaTrader 4, Demo

Es gibt nur eine Spalte in der rechten Tabelle mit der Liste der Symbole, und sie ist vom Typ CELL_CHECKBOX - sie erfordert eine Bild-Array-Größe von mindestens 2:
arr_chk[2]; arr_chk[0]=m_img_chk_off; (Bild eines Kontrollkästchens mit nicht aktiviertem Kontrollkästchen) arr_chk[1]=m_img_chk_on; (Bild eines Kontrollkästchens mit aktiviertem Kontrollkästchen)


In der Haupttabelle:

Zelle 0 enthält das Eröffnungsbild des Diagramms - es hat den Typ CELL_BUTTON, Sie können ein Array von Bildern mit der Dimension 1 haben: arr_img0[1]; arr_img0[0]=m_image_graph;

Zelle 8 enthält das Eröffnungsbild Kaufen - ihr Typ ist CELL_BUTTON, das Bild-Array kann die Dimension 1 haben: arr_img8[1]; arr_img8[0]=m_image_buy;

Zelle 9 enthält das Eröffnungsbild Verkauf - ihr Typ ist CELL_BUTTON, das Bild-Array kann die Dimension 1 haben: arr_img9[1]; arr_img9[0]=m_image_sell;

Nachdem Sie die Tabelle erstellt haben, können Sie sie mit den erforderlichen Werten initialisieren und die erforderlichen Zellentypen sowie Ihre eigenen Bild-Arrays für sie festlegen.


 
Artyom Trishkin:

Für jede Zelle der Tabelle, die Bilder enthalten soll, benötigen Sie ein eigenes Array von Bildern. Wenn die Zelle vom Typ CELL_BUTTON ist, dann reicht ein Minimum von einem Bild pro Zelle, wenn der Typ CELL_CHECKBOX ist, dann ein Minimum von zwei. Das Bild mit dem Index 0 entspricht dem Zustand "gedrückt" des Kontrollkästchens (der Schaltfläche), die anderen Indizes entsprechen dem Zustand "ausgewählt" des Kontrollkästchens (der Schaltfläche).

Ein Beispiel (nicht fertig, aber zum Verständnis ausreichend):

In der rechten Tabelle mit der Liste der Symbole gibt es nur eine Spalte, und die ist vom Typ CELL_CHECKBOX - sie erfordert eine Bild-Array-Größe von mindestens 2:
arr_chk[2]; arr_chk[0]=m_img_chk0; arr_chk[1]=m_img_chk1;


In der Haupttabelle:

Zelle 0 enthält das Eröffnungsbild des Graphen - es hat den Typ CELL_BUTTON, Sie können ein Array von Bildern mit der Dimension 1 haben: arr_img0[1]; arr_img0[0]=m_image_graph;

Zelle 8 enthält das Eröffnungsbild Kaufen - ihr Typ ist CELL_BUTTON, das Bild-Array kann die Dimension 1 haben: arr_img8[1]; arr_img8[0]=m_image_buy;

Zelle 9 enthält das Eröffnungsbild Verkauf - sie hat den Typ CELL_BUTTON, das Bild-Array kann die Dimension 1 haben: arr_img9[1]; arr_img9[0]=m_image_sell;

Sobald die Tabelle erstellt ist, können Sie sie mit den gewünschten Werten initialisieren und die gewünschten Zellentypen und Bildfelder für sie festlegen.


Ich verstehe wirklich nicht, was das Problem ist )) in der ersten Bildschirm geändert, um die Spalte mit Index 1 Bilder verschwunden, und in der zweiten Bildschirm zurück zu der Spalte mit Index 0, erschienen die Bilder. Dies ist alles auf dem Beispielcode TestLibrary10. mqh

Hier sind die Methoden zur Erstellung der Tabelle:

bool CProgram::CreateCanvasTable(const int x_gap,const int y_gap)
  {
#define  COLUMNS1_TOTAL 5
#define  ROWS1_TOTAL    27
//--- Speichern des Zeigers auf das Formular
   m_canvas_table.WindowPointer(m_window);
//--- Array der Spaltenbreiten
   int width[COLUMNS1_TOTAL]={75, 60, 60, 60, 75};
//--- Array der Texteinrückung in Spalten auf der X-Achse
   int text_x_offset[COLUMNS1_TOTAL];
   ::ArrayInitialize(text_x_offset,5);
   text_x_offset[0]=25;
//--- Array der Textausrichtung in Spalten
   ENUM_ALIGN_MODE align[COLUMNS1_TOTAL];
   ::ArrayInitialize(align,ALIGN_RIGHT);
   align[0]=ALIGN_LEFT;
//--- Eigenschaften vor der Erstellung festlegen
   m_canvas_table.XSize(345);
   m_canvas_table.YSize(289);
   m_canvas_table.TableSize(COLUMNS1_TOTAL, ROWS1_TOTAL);
   m_canvas_table.TextAlign(align);
   m_canvas_table.TextXOffset(text_x_offset);
   m_canvas_table.ColumnsWidth(width);
   m_canvas_table.TextXOffset(5);
   m_canvas_table.TextYOffset(4);
   m_canvas_table.CellYSize(20);
   //m_canvas_table.ImageXOffset(8);//
   //m_canvas_table.ImageYOffset(6);//
   m_canvas_table.ShowHeaders(true);
   m_canvas_table.HeaderYSize(30);
   m_canvas_table.HeadersColor(C'255,244,213');
   m_canvas_table.CellColorHover(C'255,244,213');
   m_canvas_table.LightsHover(true);
   m_canvas_table.SelectableRow(true);
   m_canvas_table.ColumnResizeMode(true);
   m_canvas_table.IsZebraFormatRows(clrWhiteSmoke);
   //m_canvas_table.AutoXResizeMode(true);
   m_canvas_table.AutoXResizeRightOffset(1);
   m_canvas_table.AutoYResizeMode(true);
   int _height = int(m_chart.HeightInPixels(0) * .30);
   m_canvas_table.AutoYResizeBottomOffset(/*25 + */_height);
//--- Füllen der Tabelle mit Daten
   InitializingTable();
//--- Ein Steuerelement erstellen
   if(!m_canvas_table.CreateTable(m_chart_id,m_subwin,x_gap,y_gap))
      return(false);
//--- Hinzufügen des Objekts zu dem gemeinsamen Array von Objektgruppen
   CWndContainer::AddToElementsArray(0,m_canvas_table);
   return(true);
  }

ist Initialisierung:

void CProgram::InitializingTable(void)
  {
//--- Array von Kopfzeilennamen
   string text_headers[COLUMNS1_TOTAL]={"Symbol","Bid","Ask","!","Time"};
//--- Array von Zeichen
   //Zeichenfolge text_array[25]=
   // {
   // "AUDUSD", "GBPUSD", "EURUSD", "USDCAD", "USDCHF", "USDJPY", "NZDUSD", "USDSEK", "USDHKD", "USDMXN",
   // "USDZAR", "USDTRY", "GBPAUD", "AUDCAD", "CADCHF", "EURAUD", "GBPCHF", "GBPJPY", "NZDJPY", "AUDJPY",
   // "EURJPY", "EURCHF", "EURGBP", "AUDCHF", "CHFJPY"
   // };
   string text_str = "MFON SBER SBERP GAZP TATN LKOH ROSN NVTK SNGS SNGSP VTBR MOEX AFKS IRAO "
                     "AFLT FEES ALRS MAGN NLMK CHMF GMKN HYDR TATNP YNDX RTKM MGNT MTSS";
   string text_array[];
   int _size = CreateArray(text_str, text_array); 
//--- Array von Bildern
   string image_array[3]=
     {
      "::Images\\EasyAndFastGUI\\Icons\\bmp16\\circle_gray.bmp",//circle_gray_t32.bmp",
      "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_up.bmp",
      "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_down.bmp"
     };
//---
   for(int c=0; c<COLUMNS1_TOTAL; c++)
     {
      //--- Festlegen der Kopfzeilennamen
      m_canvas_table.SetHeaderText(c,text_headers[c]);
      //---
      for(int r=0; r<ROWS1_TOTAL; r++)
        {
         //--- Einstellen der Bilder
         if(c == 1) {
            m_canvas_table.CellType(c, r, CELL_BUTTON);
            m_canvas_table.SetImages(c,r,image_array);
         }
         //--- Zeichennamen festlegen
         if(c<1)
            m_canvas_table.SetValue(c,r,text_array[r]);
         //--- Standardwert für alle Zellen
         else
            m_canvas_table.SetValue(c,r,"-");
        }
     }
  }

Dies ist die Aktualisierung:

void CProgram::UpdateTable(void)
  {
   MqlDateTime check_time;
   ::TimeToStruct(::TimeTradeServer(),check_time);
//--- Beenden, wenn es Samstag oder Sonntag ist
   if(check_time.day_of_week==0 || check_time.day_of_week==6)
      return;
//---
   for(uint c=0; c < m_canvas_table.ColumnsTotal(); c++)
     {
      for(uint r=0; r < m_canvas_table.RowsTotal(); r++)
        {
         //--- Für welches Zeichen erhalten wir Daten
         string symbol = m_canvas_table.GetValue(0, r);
         //--- Abrufen der Daten der letzten beiden Ticks
         MqlTick ticks[];
         if(::CopyTicks(symbol, ticks, COPY_TICKS_ALL, 0, 2) < 2)
            continue;
         //--- Einstellen des Arrays als Zeitreihe
         ::ArraySetAsSeries(ticks, true);
         //--- Spalte Symbol - Symbol. Lassen Sie uns die Kursrichtung bestimmen.
         if(c==1)
           {
            int index=0;
            //--- Wenn sich die Preise nicht geändert haben
            if(ticks[0].ask==ticks[1].ask && ticks[0].bid==ticks[1].bid)
               index=0;
            //--- Wenn sich der Geldkurs nach oben verändert hat
            else if(ticks[0].bid > ticks[1].bid)
               index=1;
            //--- Wenn sich der Geldkurs nach unten verändert hat
            else if(ticks[0].bid < ticks[1].bid)
               index=2;
            //--- Das entsprechende Bild einstellen
            m_canvas_table.ChangeImage(c,r,index,true);
           }
         else
           {
            //--- Spalte Preisdifferenz - Spanne (!)
            if(c==3)
              {
               //--- Abrufen und Einstellen der Spread-Größe in Pips
               int spread=(int)::SymbolInfoInteger(symbol,SYMBOL_SPREAD);
               m_canvas_table.SetValue(c,r,string(spread),true);
               continue;
              }
            //--- Ermitteln der Anzahl der Dezimalstellen
            int digit=(int)::SymbolInfoInteger(symbol,SYMBOL_DIGITS);
            //--- Preisspalte Gebot
            if(c==1)
              {
               m_canvas_table.SetValue(c,r,::DoubleToString(ticks[0].bid,digit));
               //--- Wenn sich der Preis geändert hat, setzen Sie die Farbe entsprechend der Richtung
               if(ticks[0].bid!=ticks[1].bid)
                  m_canvas_table.TextColor(c,r,(ticks[0].bid<ticks[1].bid)? clrRed : clrBlue,true);
               //---
               continue;
              }
            //--- Spalte Briefkurs
            if(c==2)
              {
               m_canvas_table.SetValue(c,r,::DoubleToString(ticks[0].ask,digit));
               //--- Wenn sich der Preis geändert hat, setzen Sie die Farbe entsprechend der Richtung
               if(ticks[0].ask!=ticks[1].ask)
                  m_canvas_table.TextColor(c,r,(ticks[0].ask<ticks[1].ask)? clrRed : clrBlue,true);
               //---
               continue;
              }
            //--- Spalte mit der letzten Ankunftszeit der Symbolpreise
            if(c==4)
              {
               long   time     =::SymbolInfoInteger(symbol,SYMBOL_TIME);
               string time_msc =::IntegerToString(ticks[0].time_msc);
               int    length   =::StringLen(time_msc);
               string msc      =::StringSubstr(time_msc,length-3,3);
               string str      =::TimeToString(time,TIME_MINUTES|TIME_SECONDS)+"."+msc;
               //---
               color clr=clrBlack;
               //--- Wenn sich die Preise nicht geändert haben
               if(ticks[0].ask==ticks[1].ask && ticks[0].bid==ticks[1].bid)
                  clr=clrBlack;
               //--- Wenn sich der Geldkurs nach oben verändert hat
               else if(ticks[0].bid>ticks[1].bid)
                  clr=clrBlue;
               //--- Wenn sich der Geldkurs nach unten verändert hat
               else if(ticks[0].bid<ticks[1].bid)
                  clr=clrRed;
               //--- Den Wert und die Farbe des Textes festlegen
               m_canvas_table.SetValue(c,r,str);
               m_canvas_table.TextColor(c,r,clr,true);
               continue;
              }
           }
        }
     }

   int _height = int(m_chart.HeightInPixels(0) * .30);
   m_canvas_table.AutoYResizeBottomOffset(_height);

//--- Tabelle aktualisieren
   m_canvas_table.UpdateTable();
  }
hervorgehoben von 0 auf 1 geändert, d.h. das Einfügen der Bilder in die Spalte von Nummer 0 auf Nummer 1 geändert, wo ist hier der Fehler?
Dateien:
07.png  163 kb
00.png  161 kb