CGraphicのテスト - 質問と提案 - ページ 11

 
Artyom Trishkin:

とにかく、説明するのに疲れました。欲しい人は、きっとわかってくれる。

お待たせしました、これは正常な現象なので、これから知って、自分のコードのエラーを分析するときに考慮します。でも、エラーはやめて ほしいですね。不可能なことと、エラーではなく特殊性とでも言いましょうか、その特殊性が確立された伝統によって説明されることは別物ですからね。

 
Aleksey Vyazmikin:


このコードへのポイント -D.PointsFill(false);

X配列と Y配列のサイズが 違うことがエラーの原因だったのですが、なぜログに書けなかったのか謎です。

 
Aleksey Vyazmikin:

お待たせしました、正常な現象なので、これから知って、自分のコードのエラーを分析するときに考慮します。でも、エラーはやめてほしいですね。不可能なことと、エラーではなく特殊性とでも言いましょうか、特殊性が確立された伝統によって説明されることは別物ですからね。

ひとつだけ覚えておいてほしいのは、_LastErrorには実際のエラーのコードだけでなく、関数の操作に関するメッセージのコードも含まれているということです。今回議論しているケースでは、そこにオブジェクトがないというコードです。そして、すべては、ある名前のオブジェクトが要求されるコンテキストに依存します。オブジェクトを修正するためのコードであれば、なぜ私のオブジェクトが突然なくなったのかを理解する必要があることを示し、新しいオブジェクトを作成するためのコードであれば、そのようなオブジェクトは存在しないと言うでしょう。

そして、関数の戻り結果を確認し、もし本当にエラーを返したら、エラーコードを分析する、ということをルールとしてください。

あなたの例では、canvasオブジェクトの作成が 成功したことで、どこかでエラーが発生していると思い、自分をごまかしているのです。

 
Artyom Trishkin:

ひとつだけ覚えておいてほしいのは、_LastErrorには実際のエラーのコードだけでなく、関数メッセージのコードも含まれるということです。この場合、オブジェクトが存在しないことを示すコードです。そして、すべては、ある名前のオブジェクトが要求されるコンテキストに依存します。オブジェクトを変更する場合、このコードは、なぜ私のオブジェクトが突然なくなったのかを理解する必要性を示し、新しいオブジェクトを作成する場合、そのようなオブジェクトは存在しないと言うコードになります。

そして、関数の戻り結果を確認し、本当にエラーを返した場合は、エラーコードを解析することをルールとしてください。

cantvasオブジェクトの作成に 成功したというのに、どこかに間違いがあるとか言って、例を台無しにしていますね。

なるほど、エラーを分析するときは、おっしゃるような方法で考えてみます。ありがとうございます。

このスレッドで私がした質問(凡例の大きさの変更と、作成したカーブに関する情報をこの凡例に載せることの禁止)に対する答えを教えていただけないでしょうか。

 
Aleksey Vyazmikin:

なるほど、エラーを分析するときは、おっしゃるとおりに考えるようにします。ありがとうございます。

このスレッドで私がした質問、つまり凡例のサイズを変更することと、この凡例で作成されたカーブに関する情報を許可しないことについて、答えられないまま放置されているのですが、もしかしたらあなたは答えを出すことができるかもしれません。

できないんです。時間がかかるんです。すみません、時間がないんです。

 
Aleksey Vyazmikin:

なるほど、エラーを分析するときは、おっしゃるとおりに考えてみることにします。ありがとうございます。

  1. エラーコードをリセットする - ResetLastError()
  2. 関数を呼び出した。
  3. 何が返ってきたのか、しっかり見てください。
  4. 正確にエラーを返した場合(関数のエラーコード、この特定の関数のヘルプを参照)。
    1. エラーの内容は、GetLastError() で正確に指定します。
    2. プログラム中にそのようなものがあってはならない場合は、コードに目を通したり
    3. プログラムのロジックで、このエラーが提供されている場合、このエラーに反応します(例えば、誤停止など)
    4. ...
    5. ...
    6. 等 ...
  5. もし、それがエラーではなく、単純な質問に対する答えを返したのなら
    1. あなたは、プログラムのロジックにあるものを行うと、最後のエラーの コードを見ていない、なぜならそこに唯一の関数へのクエリの答えは、エラーの説明ではありません。
    2. 他に思いつかないもの
  6. 楽しむ


 
Artyom Trishkin:

できないんです。時間がかかるんです。残念ながら、持っていないんです、ごめんなさい。

了解しました。知っている人、時間のある人を待ちます。でも、ライブラリの正規のツールではできないんですね。

 

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

それぞれ selected ではなくm_y.Color(),m_x.Color() とすること。

CGraphicを継承してCreateAxesをオーバーライドすることで解決(バーチャルでよかった)。

 

同じCGraphic::CreateAxesでもm_grid.clr_frameを 使用するので、単独で設定することはできません

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

値を設定するためのメソッドを追加する必要があります。

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

グラフに水平線が 引かれていないのはなぜですか?座標がdouble型ではなくint型になっているのはなぜですか?

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