CGraphic'i test etme - sorular ve öneriler - sayfa 11

 
Artyom Trishkin :

Genel olarak, size açıklama yapmaktan bıktım. Kim ister - anlayacaktır.

Sabrınız için teşekkür ederiz, çünkü bu normal bir fenomendir, o zaman şimdi kodumdaki hataları analiz ederken bunu bileceğim ve dikkate alacağım. Ancak, sadece hatayı sıfırlamak istiyorum - bu mümkün olmadığında bir şey ve başka bir şey olduğunda, buna bir hata yerine bir özellik diyelim, yani özellik yerleşik geleneklerle açıklandığında.

 
Aleksey Vyazmikin :


Bu kodu işaret eder - D.PointsFill( false );

Hata, X ve Y dizilerinin farklı boyutundan kaynaklanıyordu - bunun hakkında günlükte yazmak neden imkansızdı - bir gizem.

 
Aleksey Vyazmikin :

Sabrınız için teşekkür ederiz, çünkü bu normal bir fenomendir, o zaman şimdi kodumdaki hataları analiz ederken bunu bileceğim ve dikkate alacağım. Ancak, sadece hatayı sıfırlamak istiyorum - bu mümkün olmadığında bir şey ve başka bir şey olduğunda, buna bir hata yerine bir özellik diyelim, yani özellik yerleşik geleneklerle açıklandığında.

Sadece bir şeyi hatırlayın: _LastError sadece gerçek bir hatanın kodunu değil, aynı zamanda fonksiyonların çalışmasıyla ilgili mesajların kodlarını da içerir. Tartışılan durumda, orada hiçbir nesne olmadığı gerçeğinin kodu girilir. Ve hepsi, belirli bir ada sahip bir nesnenin talep edildiği bağlama bağlıdır. Bir nesneyi değiştirmek için, böyle bir kod anlama ihtiyacını gösterecektir - nesnem neden aniden ortadan kayboldu .. ve yeni bir nesne oluşturmak için, o zaman böyle bir nesne olmadığını söyleyen kod - tam tersi - her şey yolunda ve yaratabilirsiniz.

Ve bunu bir kural haline getirin: işlevin dönüş sonucunu kontrol etmeniz ve gerçek bir hata döndürürse, o zaman bile hata kodunu analiz etmeniz gerekir.

Örneğinizde , canvas nesnesinin başarılı bir şekilde oluşturulduğu gerçeğiyle kendinizi kandırıyorsunuz ve bir yerde bir hata olduğunu düşünüyorsunuz.

 
Artyom Trishkin :

Sadece bir şeyi hatırlayın: _LastError sadece gerçek bir hatanın kodunu değil, aynı zamanda fonksiyonların çalışmasıyla ilgili mesajların kodlarını da içerir. Tartışılan durumda, orada hiçbir nesne olmadığı gerçeğinin kodu girilir. Ve hepsi, belirli bir ada sahip bir nesnenin talep edildiği bağlama bağlıdır. Bir nesneyi değiştirmek için, böyle bir kod anlama ihtiyacını gösterecektir - nesnem neden aniden ortadan kayboldu .. ve yeni bir nesne oluşturmak için, o zaman böyle bir nesne olmadığını söyleyen kod - tam tersi - her şey yolunda ve yaratabilirsiniz.

Ve bunu bir kural haline getirin: işlevin dönüş sonucunu kontrol etmeniz ve gerçek bir hata döndürürse, o zaman bile hata kodunu analiz etmeniz gerekir.

Örneğinizde , canvas nesnesinin başarılı bir şekilde oluşturulduğu gerçeğiyle kendinizi kandırıyorsunuz ve bir yerde bir hata olduğunu düşünüyorsunuz.

Tamam, hataları analiz ederken tarif ettiğiniz şekilde düşünmeye çalışacağım. Teşekkür ederim.

Belki de bu başlıkta, efsanenin boyutunu değiştirmek ve oluşturulan eğri hakkındaki bilgilerin bu efsaneye yerleştirilmesini yasaklamakla ilgili - dikkatsiz bırakılan sorularıma cevap verebilirsiniz?

 
Aleksey Vyazmikin :

Tamam, hataları analiz ederken tarif ettiğiniz şekilde düşünmeye çalışacağım. Teşekkür ederim.

Belki de bu başlıkta, efsanenin boyutunu değiştirmek ve oluşturulan eğri hakkındaki bilgilerin bu efsaneye yerleştirilmesini yasaklamakla ilgili - dikkatsiz bırakılan sorularıma cevap verebilirsiniz?

Yapamam - zaman alır. Maalesef yok, üzgünüm.

 
Aleksey Vyazmikin :

Tamam, hataları analiz ederken tarif ettiğiniz şekilde düşünmeye çalışacağım. Teşekkür ederim.

  1. Hata kodunu sıfırla - ResetLastError()
  2. Bir işlev denir
  3. Ne geri aldığına bir bak.
  4. Tam olarak bir hata döndürdüyse (fonksiyonun hatalı yürütülmesinin kodu için belirli bir işlevin yardımına bakın)
    1. GetLastError() ile hatanın tam olarak ne olduğunu belirtin
    2. Programda durum böyle değilse kodunuza bakın veya
    3. Programın mantığı tarafından sağlanıyorsa, programınızın mantığında böyle bir hataya tepki verin (örneğin, hatalı duraklar)
    4. ...
    5. ...
    6. vb. ...
  5. Hata olmayan, ancak bir soruya basit bir cevap olan bir sonuç döndürülürse
    1. Program mantığının doğasında olanı yapın veson hata koduna bakmayın, çünkü yalnızca işlev isteğinize bir yanıt vardır ve hatanın açıklaması yoktur.
    2. Şey, hemen aklıma gelmeyen başka bir şey...
  6. Zevk almak


 
Artyom Trishkin :

Yapamam - zaman alır. Maalesef yok, üzgünüm.

Anladım. Bilen veya vakti olan birini bekleyeceğim. Ama bunun kütüphanenin normal imkanlarıyla yapılamayacağını anlıyorum.

 

CGraphic::CreateAxes'da hata:

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

Seçilenin yerine sırasıyla m_y.Color() ve m_x.Color() olmalıdır.

CGraphic'ten devralarak ve CreateAxes'i (neyse ki sanal) yeniden tanımlayarak çözülür.

 

Aynı CGraphic::CreateAxes , bağımsız olarak ayarlanamayan m_grid.clr_frame öğesini kullanır :

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

Değeri ayarlamak için bir yöntem eklemeniz gerekir:

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

Grafikte neden yatay bir çizgi çizilmiyor ? Neden int türünde koordinatları var ve double değil?

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