Teste CGraphic - perguntas e sugestões - página 11

 
Artyom Trishkin:

De qualquer forma, estou cansado de lhe explicar isso. Aqueles que quiserem, entenderão.

Obrigado por sua paciência, já que se trata de um fenômeno normal, vou conhecê-lo agora e levá-lo em consideração ao analisar os erros em meu código. Mas eu gostaria que eles simplesmente deixassem cair um erro - é uma coisa quando é impossível e outra quando, vamos chamá-la de peculiaridade ao invés de erro, é quando a peculiaridade é explicada por uma tradição estabelecida.

 
Aleksey Vyazmikin:


Pontos para este código -D.PointsFill(falso);

O erro foi devido a diferentes tamanhos de matrizes X e Y - por que não se podia escrever sobre isso no diário de bordo é um mistério.

 
Aleksey Vyazmikin:

Obrigado por sua paciência, já que se trata de um fenômeno normal, vou conhecê-lo agora e levá-lo em consideração ao analisar erros em meu código. Mas eu gostaria que eles simplesmente deixassem cair um erro - é uma coisa quando não é possível, e outra quando, vamos chamá-la de peculiaridade em vez de erro, então quando uma peculiaridade é explicada por uma tradição estabelecida.

Basta lembrar uma coisa: o _LastError contém não apenas o código do erro real, mas também códigos de mensagens sobre a operação da função. No caso que estamos discutindo, é o código que não há nenhum objeto lá. E tudo depende do contexto, quando o objeto com nome específico é solicitado. Se for para modificar o objeto, este código indicará a necessidade de entender porque meu objeto desapareceu de repente e se for para criar um novo objeto, o código dirá que não existe tal objeto - aqui é exatamente o oposto - tudo está bem e você pode criá-lo.

E tome como regra: verifique o resultado do retorno da função e, se ele retornar um erro real, então analise o código de erro.

Em seu exemplo, você está se enganando com o fato de que a criação do objeto de tela foi bem sucedida e você acha que há um erro em algum lugar.

 
Artyom Trishkin:

Basta lembrar de uma coisa: _LastError contém não apenas código de erro real, mas também códigos de mensagens de função. Neste caso, é o código que não há nenhum objeto. E tudo depende do contexto, quando o objeto com nome específico é solicitado. Se for para modificar o objeto, este código indicará a necessidade de entender porque meu objeto desapareceu de repente e se for para criar um novo objeto, o código dirá que não existe tal objeto - aqui é exatamente o oposto - tudo está bem e você pode criá-lo.

E tome isso como regra: você deve verificar o resultado do retorno da função e se ele retornar um erro real, então analise o código de erro.

Você está mexendo com seu exemplo dizendo que houve uma criação bem sucedida de um objeto de lona e acha que há um erro em algum lugar.

Ok, vou tentar pensar da maneira que você descreveu ao analisar os erros. Obrigado.

Talvez você possa dar uma resposta às minhas perguntas neste tópico, que ficou sem resposta - sobre a mudança do tamanho da lenda e a proibição de colocar informações sobre a curva criada nesta lenda?

 
Aleksey Vyazmikin:

OK, tentarei pensar de acordo com as linhas que você descreveu ao analisar os erros. Obrigado.

Talvez você possa dar uma resposta às minhas perguntas neste tópico, que ficaram sem resposta - sobre redimensionar a lenda e não permitir informações sobre a curva criada nesta lenda?

Não posso - isso leva tempo. Sinto muito, não tenho tempo.

 
Aleksey Vyazmikin:

OK, tentarei pensar de acordo com as linhas que você descreveu ao analisar os erros. Obrigado.

  1. Redefinir o código de erro - ResetLastError()
  2. Chamada de função.
  3. Certifique-se de ver o que ele retornou.
  4. Se ele retornou exatamente um erro (código de erro de função, veja ajuda para esta função em particular)
    1. Você especifica qual é exatamente o erro com GetLastError()
    2. Veja seu código se não deve haver tal coisa no programa ou
    3. Em sua lógica de programa, reaja a este erro, se isto for fornecido na lógica do programa (por exemplo, paradas errôneas)
    4. ...
    5. ...
    6. etc. ...
  5. Se retornou um resultado, que não é um erro, mas uma resposta simples a uma pergunta
    1. Você faz o que está na lógica do programa e não olha para o código do último erro, porque há apenas uma resposta para sua consulta à função, não uma descrição do erro
    2. algo mais que eu não consigo pensar...
  6. Aproveite


 
Artyom Trishkin:

Não posso - isso leva tempo. Infelizmente, não o tenho, desculpe.

Entendido. Vou esperar por alguém que saiba ou tenha tempo. Mas entendo que você não pode fazer isso com as ferramentas regulares da biblioteca.

 

Erro emCGraphic::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));

Deve serm_y.Color() em_x.Color() em vez de selecionado, respectivamente.

Resolvido por herança de CGraphic e CreateAxes (virtual, graças a Deus).

 

O mesmoCGraphic::CreateAxes usam_grid.clr_frame, que não pode ser definido independentemente:

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

Um método deve ser adicionado para definir o valor:

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

Por que a linha horizontal não está desenhada no gráfico? Por que ele tem coordenadas do tipo int em vez de duplo?

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