Test CGraphic - domande e suggerimenti - pagina 11

 
Artyom Trishkin:

Comunque, sono stanco di spiegartelo. Quelli che vogliono, capiranno.

Grazie per la vostra pazienza, dato che questo è un fenomeno normale, ora lo saprò e lo terrò in considerazione quando analizzerò gli errori nel mio codice. Ma vorrei che lasciassero perdere un errore - una cosa è quando è impossibile e un'altra cosa è quando, chiamiamolo una peculiarità invece di un errore, cioè quando la peculiarità è spiegata da una tradizione consolidata.

 
Aleksey Vyazmikin:


Punta a questo codice -D.PointsFill(false);

L'errore era dovuto alla diversa dimensione degli array X e Y - perché non si poteva scrivere nel log è un mistero.

 
Aleksey Vyazmikin:

Grazie per la vostra pazienza, visto che è un fenomeno normale, ora lo saprò e ne terrò conto quando analizzerò gli errori nel mio codice. Ma vorrei che lasciassero perdere un errore - una cosa è quando non è possibile, e un'altra cosa quando, chiamiamola una peculiarità invece di un errore, quindi quando una peculiarità è spiegata da una tradizione consolidata.

Ricordate solo una cosa: il _LastError contiene non solo il codice dell'errore reale ma anche i codici dei messaggi sul funzionamento della funzione. Nel caso che stiamo discutendo, è il codice che non c'è nessun oggetto. E tutto dipende dal contesto, quando viene richiesto un oggetto con un nome specifico. Se è per modificare l'oggetto questo codice indicherà la necessità di capire perché il mio oggetto è improvvisamente sparito e se è per creare un nuovo oggetto il codice dirà che non esiste un tale oggetto - qui è proprio il contrario - tutto è a posto e si può creare.

E prendetelo come una regola: controllate il risultato di ritorno della funzione e, se restituisce un errore reale, analizzate il codice di errore.

Nel vostro esempio, vi state ingannando con il fatto che la creazione dell'oggetto canvas ha avuto successo e pensate che ci sia un errore da qualche parte.

 
Artyom Trishkin:

Ricordate solo una cosa: _LastError contiene non solo il codice dell'errore reale, ma anche i codici dei messaggi di funzione. In questo caso, è il codice che non c'è un oggetto. E tutto dipende dal contesto, quando viene richiesto un oggetto con un nome specifico. Se è per modificare l'oggetto questo codice indicherà la necessità di capire perché il mio oggetto è improvvisamente sparito e se è per creare un nuovo oggetto il codice dirà che non esiste un tale oggetto - qui è proprio il contrario - tutto è a posto e si può creare.

E prendetelo come una regola: dovete controllare il risultato di ritorno della funzione e se restituisce un errore reale, allora analizzate il codice di errore.

Stai incasinando il tuo esempio dicendo che c'è stata una creazione di successo di un oggetto cantvas e pensi che ci sia un errore da qualche parte.

Ok, cercherò di pensare nel modo che hai descritto nell'analisi degli errori. Grazie.

Forse puoi dare una risposta alle mie domande in questo thread, che sono rimaste senza risposta - sul cambiamento della dimensione della legenda e sul divieto di mettere informazioni sulla curva creata in questa legenda?

 
Aleksey Vyazmikin:

OK, cercherò di pensare secondo le linee che hai descritto nell'analisi degli errori. Grazie.

Forse puoi dare una risposta alle mie domande in questo thread, che sono rimaste senza risposta - sul ridimensionamento della legenda e sul non permettere informazioni sulla curva creata in questa legenda?

Non posso - ci vuole tempo. Mi dispiace, non ho tempo.

 
Aleksey Vyazmikin:

OK, cercherò di pensare secondo le linee che hai descritto nell'analisi degli errori. Grazie.

  1. Resettare il codice di errore - ResetLastError()
  2. Chiamato una funzione.
  3. Assicuratevi di vedere cosa ha restituito.
  4. Se restituisce esattamente un errore (codice di errore della funzione, vedere l'aiuto per questa particolare funzione)
    1. Si specifica qual è esattamente l'errore con GetLastError()
    2. Guarda nel tuo codice se non ci deve essere una cosa del genere nel programma o
    3. Nella logica del vostro programma, reagite a questo errore, se questo è previsto nella logica del programma (per esempio, arresti errati)
    4. ...
    5. ...
    6. ecc...
  5. Se restituisce un risultato, che non è un errore, ma una semplice risposta a una domanda
    1. Fate quello che è nella logica del programma e non guardate il codice dell'ultimo errore, perché c'è solo una risposta alla vostra domanda alla funzione, non una descrizione dell'errore
    2. qualcos'altro che non mi viene in mente...
  6. Godetevi


 
Artyom Trishkin:

Non posso - ci vuole tempo. Ahimè, non ce l'ho, mi dispiace.

Capito. Aspetterò qualcuno che lo sappia o che ne abbia il tempo. Ma capisco che non si può fare con gli strumenti regolari della biblioteca.

 

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

Dovrebbe esserem_y.Color() em_x.Color() invece di selected, rispettivamente.

Risolto ereditando da CGraphic e sovrascrivendo CreateAxes (virtuale, grazie al cielo).

 

Lo stessoCGraphic::CreateAxes usam_grid.clr_frame, che non può essere impostato indipendentemente:

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

Bisogna aggiungere un metodo per impostare il valore:

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

Perché la linea orizzontale non è disegnata sul grafico? Perché ha coordinate di tipo int invece che 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);
}