测试CGraphic--问题和建议 - 页 11

 
Artyom Trishkin:

总之,我已经厌倦了向你解释。那些想要的人,会理解的。

谢谢你的耐心,因为这是一个正常的现象,我现在会知道它,并在分析我的代码中的错误时考虑到它。但我希望他们放弃一个错误--当它不可能的时候是一回事,而当我们称它为特殊性而不是错误的时候又是另一回事,那就是当这个特殊性被一个既定的传统所解释时。

 
Aleksey Vyazmikin:


指向这段代码 -D.PointsFill(false)

这个错误是由于X和Y数组的大小 不同造成的--为什么你不能在日志中写到这个问题是个谜。

 
Aleksey Vyazmikin:

谢谢你的耐心,因为这是一个正常的现象,我现在会知道它,并在分析我的代码中的错误时考虑到它。但我希望他们能放弃一个错误--不可能是一回事,而另一回事是,让我们称它为特殊性而不是错误,所以当一个特殊性被一个既定的传统所解释。

请记住一件事:_LastError不仅包含真正的错误代码,还包含关于函数的信息代码。在我们讨论的案例中,它是指那里没有对象的代码。而这一切都取决于上下文,当有特定名称的对象被请求时。如果是修改对象,这段代码会表明需要了解为什么我的对象突然消失了,如果是创建一个新的对象,代码会告诉你没有这样一个对象--这里正好相反--一切正常,你可以创建它。

并把它作为一个规则:检查函数的返回结果,如果它返回一个真正的错误,那么分析错误代码。

在你的例子中,你是在自欺欺人,因为画布对象的创建 是成功的,你认为在某个地方出现了错误。

 
Artyom Trishkin:

请记住一件事:_LastError不仅包含真正的错误代码,也包含函数信息的代码。在这种情况下,它是没有对象的代码。而这一切都取决于上下文,在这种情况下,一个具有特定名称的对象被请求。如果是修改对象,这段代码将表明需要了解为什么我的对象突然消失了,如果是创建一个新的对象,代码说没有这样的对象--这里正好相反--一切正常,你可以创建它。

并把它作为一条规则:你必须检查函数的返回结果,如果它返回一个真正的错误,那么就分析错误代码。

你把你的例子搞得一团糟,说有一个成功的cantvas对象的创建,你认为在某个地方有一个错误。

好的,我将尝试在分析错误时以你描述的方式思考。谢谢你。

也许你可以回答我在这个主题中的问题,这些问题一直没有得到回答--关于改变图例的大小和禁止在这个图例中放置有关创建的曲线的信息?

 
Aleksey Vyazmikin:

好的,我在分析错误时,会试着按照你描述的思路思考。谢谢你。

也许你可以回答我在这个主题中的问题,这些问题没有得到回答--关于调整图例的大小和不允许在这个图例中提供所创建的曲线的信息?

我做不到--这需要时间。对不起,我没有时间。

 
Aleksey Vyazmikin:

好的,我在分析错误时,会试着按照你描述的思路思考。谢谢你。

  1. 重置错误代码 - ResetLastError()
  2. 调用了一个函数。
  3. 确保你看到它返回的内容。
  4. 如果它正好返回一个错误(函数的错误代码,见该特定函数的帮助)。
    1. 你用GetLastError()指定错误的具体内容。
    2. 翻看你的代码,如果程序中一定没有这样的东西或
    3. 在你的程序逻辑中,对这一错误作出反应,如果在程序逻辑中提供了这一点(例如,错误的停止)。
    4. ...
    5. ...
    6. 等......。
  5. 如果它返回了一个结果,这不是一个错误,而是一个问题的简单答案
    1. 你做程序逻辑中的事情,不要看最后一个错误的 代码,因为那里只有你对函数查询的答案,而不是对错误的描述
    2. 其他我想不起来的东西...
  6. 享受


 
Artyom Trishkin:

我做不到--这需要时间。唉,我没有了,对不起。

明白了。我等着知道或有时间的人。但我明白,你不能用图书馆的常规工具来做这件事。

 

CGraphic::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));

应该是m_y.Color()m_x.Color() 而不是selected,分别。

通过继承CGraphic并重写CreateAxes(虚拟的,感谢上帝)解决了这个问题。

 

同样的CGraphic::CreateAxes 使用m_grid.clr_frame,它不能被独立设置

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);

必须添加一个方法来设置值。

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

为什么横线 没有画在图上?为什么它的坐标是int类型而不是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);
}