Prueba CGraphic - preguntas y sugerencias - página 11

 
Artyom Trishkin:

En fin, estoy cansado de explicártelo. Los que quieran, lo entenderán.

Gracias por tu paciencia, ya que es un fenómeno normal, ahora lo sabré y lo tendré en cuenta a la hora de analizar los errores de mi código. Pero me gustaría que dejaran de lado un error, una cosa es cuando es imposible y otra cuando, llamémosle peculiaridad en vez de error, es cuando la peculiaridad se explica por una tradición establecida.

 
Aleksey Vyazmikin:


Señala este código -D.PointsFill(false);

El error se debió a un tamaño diferente de las matrices X e Y - por qué no se pudo escribir sobre ello en el registro es un misterio.

 
Aleksey Vyazmikin:

Gracias por tu paciencia, ya que es un fenómeno normal, ahora lo sabré y lo tendré en cuenta a la hora de analizar los errores en mi código. Pero me gustaría que dejaran de lado un error: una cosa es cuando es imposible, y otra cuando, llamémoslo peculiaridad en lugar de error, así que cuando una peculiaridad se explica por una tradición establecida.

Sólo recuerde una cosa: el _LastError contiene no sólo el código del error real, sino también los códigos de los mensajes sobre las funciones. En el caso que estamos discutiendo, es el código que no hay ningún objeto allí. Y todo depende del contexto, en el que se solicita un objeto con determinado nombre. Si es para modificar el objeto este código indicará la necesidad de entender por qué mi objeto ha desaparecido de repente y si es para crear un nuevo objeto el código diciendo que no existe tal objeto - aquí es justo lo contrario - todo está bien y se puede crear.

Y tómelo como una regla: compruebe el resultado de retorno de la función y, si devuelve un error real, analice el código de error.

En tu ejemplo, te engañas con el hecho de que la creación del objeto canvas fue exitosa y crees que hay un error en alguna parte.

 
Artyom Trishkin:

Sólo recuerde una cosa: _LastError contiene no sólo el código de error real, sino también los códigos de los mensajes de función. En este caso, es el código que no hay objeto. Y todo depende del contexto, cuando se solicita un objeto con un nombre específico. Si es para modificar el objeto este código indicará la necesidad de entender por qué mi objeto ha desaparecido de repente y si es para crear un nuevo objeto el código diciendo que no existe tal objeto - aquí es justo lo contrario - todo está bien y se puede crear.

Y tómelo como una regla: debe comprobar el resultado de retorno de la función y si devuelve un error real, entonces analice el código de error.

Te metes con tu ejemplo al decir que hubo una creación exitosa de un objeto cantvas y crees que hay un error en alguna parte.

Vale, intentaré pensar de la forma que has descrito al analizar los errores. Gracias.

¿Quizás puedas dar una respuesta a mis preguntas en este hilo, que quedaron sin respuesta - sobre el cambio de tamaño de la leyenda y la prohibición de colocar información sobre la curva creada en esta leyenda?

 
Aleksey Vyazmikin:

Vale, intentaré pensar en la línea que has descrito al analizar los errores. Gracias.

¿Quizás puedas dar una respuesta a mis preguntas en este hilo, que quedaron sin respuesta - sobre el redimensionamiento de la leyenda y el no permitir información sobre la curva creada en esta leyenda?

No puedo, se necesita tiempo. Lo siento, no tengo tiempo.

 
Aleksey Vyazmikin:

Vale, intentaré pensar en la línea que has descrito al analizar los errores. Gracias.

  1. Restablecer el código de error - ResetLastError()
  2. Llamada a una función.
  3. Asegúrate de ver lo que ha devuelto.
  4. Si devuelve exactamente un error (código de error de la función, véase la ayuda de esta función en particular)
    1. Se especifica cuál es exactamente el error con GetLastError()
    2. Revise su código si no debe haber tal cosa en el programa o
    3. En la lógica de su programa, reaccione a este error, si está previsto en la lógica del programa (por ejemplo, paradas erróneas)
    4. ...
    5. ...
    6. etc...
  5. Si devuelve un resultado, que no es un error, sino una simple respuesta a una pregunta
    1. Usted hace lo que está en la lógica del programa y no mira el código del último error, porque sólo hay una respuesta a su consulta a la función, no una descripción del error
    2. algo más que no se me ocurre...
  6. Disfrute de


 
Artyom Trishkin:

No puedo, se necesita tiempo. Por desgracia, no lo tengo, lo siento.

Entendido. Esperaré a alguien que sepa o tenga tiempo. Pero entiendo que no se puede hacer con las herramientas habituales de la biblioteca.

 

Error enCGraphic::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));

Deberían serm_y.Color() ym_x.Color() en lugar de seleccionados, respectivamente.

Resuelto heredando de CGraphic y anulando CreateAxes (virtual, gracias a Dios).

 

El mismoCGraphic::CreateAxes utilizam_grid.clr_frame, que no puede ser establecido independientemente:

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

Hay que añadir un método para establecer el valor:

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

¿Por qué no se dibuja la línea horizontal en el gráfico? ¿Por qué tiene coordenadas de tipo int en lugar de doble?

//+------------------------------------------------------------------+
//|                                                   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);
}