記事"エキスパートアドバイザとインディケータに素早く制御パネルを追加する方法"についてのディスカッション - ページ 2

 
Maxim Dmitrievsky:

まあ、そうしたんだけど、何も動かないんだ。パネルは以前のように白いままだ。

コンパイラーはMacro redifinition、つまり過分割のようだと言っている。

最初のアドバイス、元のファイルの色を置き換えて、EAを再コンパイルしてください。

パネルの色をどのように再定義したかを思い出すには、いろいろ調べる必要があるが、今は時間がない。

 

歴史のために

取引、自動取引システム、取引戦略のテストに関するフォーラム

Expert Advisorの設定を更新する際にパネルが離れてしまうのはなぜですか?

Andrey Khatimlianskii, 2016.03.10 13:17

だいたいこんな感じです:

// Dialog.mqhに接続する前に!
#include <Controls\Defines.mqh>

//--- 古い色は忘れよう
#undef   CONTROLS_DIALOG_COLOR_BORDER_LIGHT
#undef   CONTROLS_DIALOG_COLOR_BORDER_DARK
#undef   CONTROLS_DIALOG_COLOR_BG
#undef   CONTROLS_DIALOG_COLOR_CAPTION_TEXT
#undef   CONTROLS_DIALOG_COLOR_CLIENT_BG
#undef   CONTROLS_DIALOG_COLOR_CLIENT_BORDER

//--- 新しい色を設定する
#define  CONTROLS_DIALOG_COLOR_BORDER_LIGHT  clrWhite            // ダイアログのボーダーの色(外側)
#define  CONTROLS_DIALOG_COLOR_BORDER_DARK   C'0xB6,0xB6,0xB6'   // ダイアログの枠の色(内側)
#define  CONTROLS_DIALOG_COLOR_BG            clrLightGreen       // ダイアログの背景 (キャプションの下とクライアントエリアの周囲)
#define  CONTROLS_DIALOG_COLOR_CAPTION_TEXT  C'0x28,0x29,0x3B'   // ダイアログのキャプション・テキストの色
#define  CONTROLS_DIALOG_COLOR_CLIENT_BG     clrAliceBlue        // クライアントエリアの背景色
#define  CONTROLS_DIALOG_COLOR_CLIENT_BORDER C'0xC8,0xC8,0xC8'   // クライアント・エリアの色

// 接続
#include <Controls\Dialog.mqh>

 

CWndContainerが.Show()を使ってチャット画面に少なくとも四角を表示するための簡単な例を教えてください。

例えば、このようにいろいろ試しましたが、エラーも画像も、.Show()が動作する兆候もありません。

#include <Controls\WndContainer.mqh>

class MyWndContainer : public CWndContainer  {
   public:
      MyWndContainer(string name);
};

//+------------------------------------------------------------------+
//| コンストラクタ|
//+------------------------------------------------------------------+
MyWndContainer::MyWndContainer(string name) {
   m_chart_id = ChartID();
   m_subwin = 0;
   m_name = name;
                   m_id = 0;
                   m_align_top = 5;
                   m_align_right = 5;
                   m_align_left = 5;
                   m_align_bottom = 5;
                   m_mouse_x = 100;
                   m_mouse_y = 100;
                   m_align_flags = ALIGN_CENTER;
                   m_prop_flags = PROGRAM_EXPERT;
                   m_mouse_flags = MOUSE_EMPTY;
} 
 
Evgeny Potapov:

CWndContainerが.Show()を使ってチャット画面に少なくとも正方形を表示するためにどのようにひねればいいか、簡単な例を教えてもらえますか?

例えば、このようにいろいろ試しましたが、エラーも画像も.Show()が機能する兆候もありません。

なぜCWndContainerな のですか?最終的に何が得られますか?
 

このロジックが理解できません:

//+------------------------------------------------------------------+
//| コントロールのグループを表示する
//+------------------------------------------------------------------+
bool CWndContainer::Show(void)
  {
//--- グループの要素ごとにループする
   int total=m_controls.Total();
   for(int i=0;i<total;i++)
     {
      CWnd *control=Control(i);
      //--- ポインタのチェック
      if(control==NULL)
         continue;
      control.Show();
     }
//--- 親クラスのメソッドの呼び出し
   return(CWnd::Show());
  }

Buttonオブジェクトがあり、そのオブジェクトに.Show()メソッドがなかったらどうなるのでしょうか?

コンテナの中に入れることはできないのでしょうか?

 
Karputov Vladimir:
なぜCWndContainerなのか?最終的に何が得られるのか?
買いと売りのボタンと、Expert Advisorの状態に関するいくつかの通知があるパネル。しかし、マウスで画面上をドラッグできるはずなのに、ボタンがドラッグされない。
 
Evgeny Potapov:
ExpertAdvisorの状態について、買い-売りボタンといくつかのより多くの通知を持つパネル。しかし、それはマウスで画面上にドラッグされなければなりませんが、ボタンはドラッグされません。
オブジェクト(ボタン、リスト、テキストフィールドなど)を作成した 後、このオブジェクトをパネルに追加します(Addメソッド)。そうすれば、パネルをドラッグするとき、すべてのオブジェクトはパネルと一緒に移動します。
 
Karputov Vladimir:
オブジェクト(ボタン、リスト、テキストフィールドなど)を作成 したら、このオブジェクトをパネルに追加します(Addメソッド)。そして、パネルをドラッグすると、すべてのオブジェクトはパネルと一緒に移動します。

こんな感じ?

#include <Controls\Button.mqh>
#include <MyControls\MyWndContainer.mqh>

CButton *MyButton;
CWndContainer  *MyContainer;
//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()  {
   MyButton = new CButton;
   if(CheckPointer(MyButton) == POINTER_INVALID) return(INIT_FAILED);
   MyButton.Create(ChartID(),WindowExpertName()+"_button",0,50,100,150,250);

   MyContainer = new MyWndContainer("MyContainer");
   if(CheckPointer(MyContainer) == POINTER_INVALID) return(INIT_FAILED);
   MyContainer.Add(MyButton);
   MyContainer.Show();
   MyContainer.Enable();

   
   return(INIT_SUCCEEDED);
}
 
Karputov Vladimir:
オブジェクト(ボタン、リスト、テキスト・フィールドなど)を作成 したら、このオブジェクトをパネルに追加します(Addメソッド)。それから、パネルをドラッグすると、すべてのオブジェクトはパネルと一緒に移動します。

それとも、これは「パネルに追加」ではないのでしょうか?

コンテナはパネルではないのですか?

 
Evgeny Potapov:

それとも "パネルに加える "ことではないのでしょうか?

コンテナはパネルではないのですか?

記事の中のPanelDialog2.mqh ファイルを例として使います:

//+------------------------------------------------------------------+
//|PanelDialog2.mqh
//| Copyright 2015, MetaQuotes Software Corp.
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#include <Controls\Dialog.mqh>
#include <Controls\CheckGroup.mqh>
#include <Controls\Label.mqh>
#include <Controls\Edit.mqh>
#include <Controls\Button.mqh>
//+------------------------------------------------------------------+
//| 定義|
//+------------------------------------------------------------------+
//--- インデントとギャップ
#define  INDENT_LEFT                         (11)      // 左からインデントする(ボーダーの幅を考慮する)
#define  INDENT_TOP                          (11)      // 上からインデント(ボーダーの幅に余裕を持たせる)
#define  INDENT_RIGHT                        (11)      // 右からインデントする(ボーダーの幅を考慮する)
#define  INDENT_BOTTOM     

このファイルはダイアログ・パネルの要素を作成します。パネルの符号はCDialog クラスです。

CDialogクラス

CDialogクラスはDialogコンボコントロールのクラスです。

説明

CDialogクラスは、機能的に関連する異種の要素群を視覚的に結合するように設計されています。