Prüfung von CGraphic - Fragen und Anregungen - Seite 11

 
Artyom Trishkin:

Wie auch immer, ich bin es leid, Ihnen das zu erklären. Diejenigen, die es wollen, werden es verstehen.

Vielen Dank für Ihre Geduld, da dies ein normales Phänomen ist, werde ich es jetzt wissen und berücksichtigen, wenn Fehler in meinem Code zu analysieren. Aber ich wünschte, sie würden einen Fehler einfach weglassen - es ist eine Sache, wenn es unmöglich ist, und eine andere, wenn - nennen wir es eine Besonderheit und nicht einen Fehler - die Besonderheit durch eine etablierte Tradition erklärt wird.

 
Aleksey Vyazmikin:


Zeigt auf diesen Code -D.PointsFill(false);

Der Fehler war auf die unterschiedliche Größe der X- und Y-Arrays zurückzuführen - warum Sie dies nicht im Protokoll vermerken konnten, ist ein Rätsel.

 
Aleksey Vyazmikin:

Vielen Dank für Ihre Geduld, da es sich um ein normales Phänomen handelt, werde ich es jetzt wissen und bei der Analyse von Fehlern in meinem Code berücksichtigen. Aber ich wünschte, sie würden einen Fehler einfach weglassen - es ist eine Sache, wenn es nicht möglich ist, und eine andere Sache, wenn, nennen wir es eine Besonderheit statt eines Fehlers, also wenn eine Besonderheit durch eine etablierte Tradition erklärt wird.

Denken Sie daran, dass _LastError nicht nur den Code des eigentlichen Fehlers enthält, sondern auch die Codes der Meldungen zur Funktionsweise. In diesem Fall ist es der Code, der besagt, dass kein Objekt vorhanden ist. Und es hängt alles vom Kontext ab, in dem ein Objekt mit einem bestimmten Namen angefordert wird. Wenn es um die Änderung des Objekts geht, wird dieser Code darauf hinweisen, dass man verstehen muss, warum mein Objekt plötzlich weg ist, und wenn es um die Erstellung eines neuen Objekts geht, sagt der Code, dass es kein solches Objekt gibt - hier ist es genau das Gegenteil - alles ist in Ordnung und man kann es erstellen.

Und nehmen Sie es als Regel: Prüfen Sie das Rückgabeergebnis der Funktion und analysieren Sie den Fehlercode, wenn sie einen echten Fehler zurückgibt.

In Ihrem Beispiel machen Sie sich vor, dass die Erstellung des Canvas-Objekts erfolgreich war und Sie denken, dass irgendwo ein Fehler vorliegt.

 
Artyom Trishkin:

Denken Sie nur an eines: _LastError enthält nicht nur den Code eines echten Fehlers, sondern auch die Codes von Funktionsmeldungen. In diesem Fall ist es der Code, dass es kein Objekt gibt. Und es hängt alles vom Kontext ab, in dem ein Objekt mit einem bestimmten Namen angefordert wird. Wenn es um die Änderung des Objekts geht, wird dieser Code darauf hinweisen, dass man verstehen muss, warum mein Objekt plötzlich weg ist, und wenn es um die Erstellung eines neuen Objekts geht, sagt der Code, dass es kein solches Objekt gibt - hier ist es genau das Gegenteil - alles ist in Ordnung und man kann es erstellen.

Und nehmen Sie es als Regel: Sie müssen das Rückgabeergebnis der Funktion überprüfen, und wenn sie einen echten Fehler zurückgibt, dann analysieren Sie den Fehlercode.

Du bringst dein Beispiel durcheinander, indem du sagst, dass ein Cantvas-Objekt erfolgreich erstellt wurde und du glaubst, dass irgendwo ein Fehler vorliegt.

Ok, ich werde versuchen, bei der Fehleranalyse so zu denken, wie Sie es beschrieben haben. Ich danke Ihnen.

Vielleicht können Sie eine Antwort auf meine Fragen in diesem Thread geben, die unbeantwortet blieben - über die Änderung der Größe der Legende und das Verbot, Informationen über die erstellte Kurve in dieser Legende zu platzieren?

 
Aleksey Vyazmikin:

OK, ich werde versuchen, bei der Analyse der Fehler so zu denken, wie Sie es beschrieben haben. Ich danke Ihnen.

Vielleicht können Sie eine Antwort auf meine Fragen in diesem Thread geben, die unbeantwortet geblieben sind - über die Größenänderung der Legende und die Nichtzulassung von Informationen über die erstellte Kurve in dieser Legende?

Das kann ich nicht - es braucht Zeit. Es tut mir leid, ich habe keine Zeit.

 
Aleksey Vyazmikin:

OK, ich werde versuchen, bei der Analyse der Fehler so zu denken, wie Sie es beschrieben haben. Ich danke Ihnen.

  1. Zurücksetzen des Fehlercodes - ResetLastError()
  2. Ruft eine Funktion auf.
  3. Vergewissern Sie sich, was sie zurückgegeben hat.
  4. Wenn sie genau einen Fehler zurückgibt (Fehlercode der Funktion, siehe Hilfe zu dieser Funktion)
    1. Mit GetLastError() geben Sie an, um welchen Fehler es sich genau handelt
    2. Schauen Sie Ihren Code durch, wenn es so etwas im Programm nicht geben darf oder
    3. Reagieren Sie in Ihrer Programmlogik auf diesen Fehler, wenn dies in der Logik des Programms vorgesehen ist (z.B. fehlerhafte Stopps)
    4. ...
    5. ...
    6. usw. ...
  5. Wenn das Ergebnis nicht ein Fehler ist, sondern eine einfache Antwort auf eine Frage
    1. Sie tun das, was in der Logik des Programms steht, und sehen sich den Code des letzten Fehlers nicht an, denn dort steht nur eine Antwort auf Ihre Anfrage an die Funktion, nicht aber eine Beschreibung des Fehlers
    2. etwas anderes, das mir nicht einfällt...
  6. Genießen Sie


 
Artyom Trishkin:

Das kann ich nicht - es braucht Zeit. Leider habe ich es nicht, tut mir leid.

Verstanden. Ich warte auf jemanden, der es weiß oder die Zeit hat. Aber ich verstehe, dass man das nicht mit den normalen Werkzeugen der Bibliothek machen kann.

 

Fehler inCGraphic::CreateAxes:

      //--- draw mark and set y value
      int yi_width=m_canvas.TextWidth(yvalue);
      m_canvas.TextOut(m_left-yi_width-m_mark_size-m_gap,m_yc[i]-yh/2,yvalue,ColorToARGB(clrBlack),TA_LEFT);
      if(m_mark_size>0.0)
         m_canvas.LineHorizontal(x1,x2,m_yc[i],ColorToARGB(clrBlack));
...
      //--- draw mark and set y value
      m_canvas.TextOut(m_xc[i]-xw/2,y2+m_gap,xvalue,ColorToARGB(clrBlack));
      if(m_mark_size>0.0)
         m_canvas.LineVertical(m_xc[i],y1,y2,ColorToARGB(clrBlack));

Solltem_y.Color() bzw.m_x.Color() anstelle von selected lauten.

Gelöst durch Erben von CGraphic und Überschreiben von CreateAxes (virtuell, Gott sei Dank).

 

Das gleicheCGraphic::CreateAxes verwendetm_grid.clr_frame, das nicht unabhängig eingestellt werden kann:

void CGraphic::CreateAxes(void)
  {
...
//--- create frame
   m_canvas.Rectangle(m_left,m_up,m_width-m_right,m_height-m_down,m_grid.clr_frame);

Es muss eine Methode hinzugefügt werden, um den Wert zu setzen:

void              GridFrameColor(const uint clr)        { m_grid.clr_frame=clr;       }
 

Warum ist die horizontale Linie nicht in das Diagramm eingezeichnet? Warum sind die Koordinaten vom Typ int und nicht double?

//+------------------------------------------------------------------+
//|                                                   Test_CLine.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
#include <Graphics\Graphic.mqh>
#include <Graphics\Axis.mqh>

input int pix_X=800;//Ширина графика баланса
input int pix_Y=400;//Высота графика баланса
input bool Use_Koef=true;//Использовать коэфициент для установки ширины графика Parallel
input double Point_Kx=0.5;//Коэффициент ширины графика Parallel
input int Point_K=12;//Размер шрифта
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Save_Graf_P();   
  }
//+------------------------------------------------------------------+
void Save_Graf_P()
{

   int pixx_Y=pix_Y;
   int pixx_X=pix_X;

//--- отключим показ ценового графика
   ChartSetInteger(0,CHART_SHOW,false);

   long chart=0;
   string NameGraf="Test Line";

   CGraphic graphicL;

   if(ObjectFind(chart,NameGraf)<0)
   {
      graphicL.Create(chart,NameGraf,0,0,0,pixx_X,pixx_Y);//Создает графический ресурс, привязанный к объекту чарта
   }
   graphicL.Attach(chart,NameGraf);//Получить/создать  графический ресурс и привязать его к экземпляру класса CGraphic
   graphicL.BackgroundMain(NameGraf);//Получить/установить текст заголовка графика
   graphicL.BackgroundMainSize(16);//Получить/установить размер шрифта заголовка
   graphicL.HistoryNameSize(Point_K);//Устанавливает размер шрифта имени кривой
   graphicL.HistorySymbolSize(Point_K);//Получить/установить размер символов условных обозначений
   graphicL.LineAdd(-5,10,5,10,ColorToARGB(Blue,255),POINT_HORIZONTAL_DASH);//Создает и добавляет линию на график
   graphicL.CurvePlotAll();//Отрисовывает все ранее созданные кривые
   graphicL.Update();//Отображает на экране сделанные изменения
   ResetLastError();

   Sleep(3000);
   graphicL.Destroy();//Удаляет с чарта график и уничтожает графический ресурс.
   ChartSetInteger(0,CHART_SHOW,true);
}