Test de CGraphic - questions et suggestions - page 11

 
Artyom Trishkin:

De toute façon, je suis fatigué de vous l'expliquer. Ceux qui le veulent comprendront.

Merci de votre patience, puisque c'est un phénomène normal, je vais le savoir maintenant et en tenir compte lors de l'analyse des erreurs dans mon code. Mais j'aimerais qu'ils laissent tomber une erreur - c'est une chose quand c'est impossible et une autre quand, appelons ça une particularité plutôt qu'une erreur, c'est-à-dire quand la particularité est expliquée par une tradition établie.

 
Aleksey Vyazmikin:


Indique ce code -D.PointsFill(false);

L'erreur était due à la différence de taille des tableaux X et Y - pourquoi vous n'avez pas pu l'écrire dans le journal est un mystère.

 
Aleksey Vyazmikin:

Merci de votre patience, puisque c'est un phénomène normal, je vais le savoir maintenant et en tenir compte lors de l'analyse des erreurs dans mon code. Mais j'aimerais qu'ils laissent tomber une erreur - c'est une chose quand ce n'est pas possible, et une autre quand, appelons cela une particularité plutôt qu'une erreur, donc quand une particularité est expliquée par une tradition établie.

N'oubliez pas une chose : le _LastError contient non seulement le code de l'erreur réelle mais aussi les codes des messages sur le fonctionnement de la fonction. Dans le cas qui nous occupe, c'est le code qu'il n'y a pas d'objet à cet endroit. Et tout dépend du contexte, dans lequel un objet portant un certain nom est demandé. Si c'est pour modifier l'objet, ce code indiquera la nécessité de comprendre pourquoi mon objet a soudainement disparu et si c'est pour créer un nouvel objet, le code indiquant qu'un tel objet n'existe pas - ici, c'est tout le contraire - tout va bien et vous pouvez le créer.

Et prenez-le comme une règle : vérifiez le résultat du retour de la fonction et, si elle renvoie une erreur réelle, analysez le code d'erreur.

Dans votre exemple, vous vous faites des illusions sur le fait que la création de l'objet canvas a réussi et vous pensez qu'il y a une erreur quelque part.

 
Artyom Trishkin:

N'oubliez pas une chose : _LastError contient non seulement le code de l'erreur réelle, mais aussi les codes des messages de fonction. Dans ce cas, c'est le code qu'il n'y a pas d'objet. Et tout dépend du contexte, lorsque l'objet avec un nom spécifique est demandé. Si c'est pour modifier l'objet, ce code indiquera la nécessité de comprendre pourquoi mon objet a soudainement disparu et si c'est pour créer un nouvel objet, le code indiquant qu'un tel objet n'existe pas - ici, c'est tout le contraire - tout va bien et vous pouvez le créer.

Et prenez-le comme une règle : vous devez vérifier le résultat du retour de la fonction et si elle renvoie une erreur réelle, alors analysez le code d'erreur.

Vous perturbez votre exemple en disant qu'il y a eu une création réussie d'un objet cantvas et vous pensez qu'il y a une erreur quelque part.

Ok, je vais essayer de penser de la manière que vous avez décrite en analysant les erreurs. Merci.

Peut-être pouvez-vous donner une réponse aux questions que j'ai posées dans ce fil de discussion et qui sont restées sans réponse - sur la modification de la taille de la légende et l'interdiction de placer des informations sur la courbe créée dans cette légende ?

 
Aleksey Vyazmikin:

OK, j'essaierai de penser comme vous l'avez décrit en analysant les erreurs. Merci.

Peut-être pouvez-vous répondre aux questions que j'ai posées dans ce fil de discussion et qui sont restées sans réponse - concernant le redimensionnement de la légende et le fait de ne pas autoriser les informations sur la courbe créée dans cette légende ?

Je ne peux pas - ça prend du temps. Je suis désolé, je n'ai pas le temps.

 
Aleksey Vyazmikin:

OK, j'essaierai de penser comme vous l'avez décrit en analysant les erreurs. Merci.

  1. Réinitialiser le code d'erreur - ResetLastError()
  2. Appelé une fonction.
  3. Assurez-vous de voir ce qu'il a rendu.
  4. Si elle renvoie exactement une erreur (code d'erreur de la fonction, voir l'aide pour cette fonction particulière)
    1. Vous spécifiez la nature exacte de l'erreur avec GetLastError().
    2. Regardez dans votre code s'il ne doit pas y avoir une telle chose dans le programme ou...
    3. Dans la logique de votre programme, réagissez à cette erreur, si cela est prévu dans la logique du programme (par exemple, des arrêts erronés)
    4. ...
    5. ...
    6. etc. ...
  5. Si elle renvoie un résultat, qui n'est pas une erreur, mais une simple réponse à une question
    1. Vous faites ce qui est dans la logique du programme et ne regardez pas le code de la dernière erreur, parce qu'il y a seulement une réponse à votre requête à la fonction, pas une description de l'erreur.
    2. quelque chose d'autre que je n'arrive pas à trouver...
  6. Profitez de


 
Artyom Trishkin:

Je ne peux pas - ça prend du temps. Hélas, je ne l'ai pas, désolé.

Compris. J'attendrai quelqu'un qui sait ou qui a le temps. Mais je comprends que vous ne puissiez pas le faire avec les outils habituels de la bibliothèque.

 

Erreur dansCGraphic::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));

Devrait êtrem_y.Color() etm_x.Color() au lieu de sélectionné, respectivement.

Résolu en héritant de CGraphic et en surchargeant CreateAxes (virtuel, Dieu merci).

 

Le mêmeCGraphic::CreateAxes utilisem_grid.clr_frame, qui ne peut pas être défini indépendamment:

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

Une méthode doit être ajoutée pour définir la valeur :

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

Pourquoi la ligne horizontale n'est-elle pas dessinée sur le graphique? Pourquoi les coordonnées sont-elles de type int au lieu de 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);
}