Dialogの表示をOnInitではなく、OnChartEventで実行すると上手く表示されない

 

こんにちは。

MT4で[T]キーを押したらダイアログが表示されるインジケータを作成したいのですが

OnInitでダイアログのCreate()とRun()を実行すると、ちゃんと表示されるのですが

OnChartEventでCreate()とRun()を実行すると上手く表示されません。

OnChartEvent内でダイアログを表示する場合は Create()とRun()以外の関数を利用するのでしょうか。

ご教示いただけますと幸いです。


また、ダイアログが表示されている場合に再び[T]キーを押したら

ダイアログが消える仕様にしたいのですが

Destroy()を使うとチャート毎閉じてしまいます。

チャートは残し、ダイアログだけ消える方法もご教示いただけますと幸いです。


【表示したいダイアログのコード】

#include <Controls\Dialog.mqh>
#include <Controls\Button.mqh>

class BtnDialog : public CAppDialog{
   private:
      CButton m_btn;

   protected:
      bool CreateBtn();

   public:
      virtual bool Create(){
         if(!CAppDialog::Create(0, "BtnTest", 0, 50, 50, 250, 250)){
            return(false);
         }
         if(!CreateBtn()) return false;

         return(true);
      }
};

bool BtnDialog::CreateBtn(){
   if(!m_btn.Create(m_chart_id, m_name + "Btn", m_subwin, 50, 50, 110, 110)) return false;
   if(!Add(m_btn)) return false;
   if(!m_btn.Text("Test")) return false;
   if(!m_btn.Font("MS Pゴシック")) return false;
   //m_btn.FontSize(8);

   return true;
}
BtnDialog oBtn;


【OnChartEvent のソースコード】

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   if (id == CHARTEVENT_KEYDOWN) {
      if (lparam == 84) {
         // Tキーが押された場合
         if (oBtn.Caption() == "Btn") {
            // ダイアログが表示済みなら非表示にする
            oBtn.Destroy(REASON_CHARTCHANGE);
            return;
         } else {
            // ダイアログが未表示なら表示する
            if(!oBtn.Create()) return;
            if(!oBtn.Run())return;

            return;
         }

      }

      return;

   } else if (id == CHARTEVENT_OBJECT_CLICK){
      oBtn.ChartEvent(id, lparam, dparam, sparam);
   } else {
      oBtn.ChartEvent(id, lparam, dparam, sparam);
   }
   return;
  }
 

いったい何をしようとしているのか分かりませんが、ボタンをON-OFFしたいのならボタンオブジェクトを使ったほうが早いのと違いますか?

これはこのような使い方をするものではないと思います。

 
Nagisa Unada #:

いったい何をしようとしているのか分かりませんが、ボタンをON-OFFしたいのならボタンオブジェクトを使ったほうが早いのと違いますか?

これはこのような使い方をするものではないと思います。

コメントありがとうございます。

現在はボタンだけ表示しているのですが、

・ロット数のテキスト

・S/Lのテキスト

・T/Pのテキスト

・所持中の総合PIPSを表示するテキスト

・SELLボタン

・BUYボタン

・一括決済ボタン

などを表示するダイアログを作ろうと思っております。


表示項目も多くなるので、

ショートカットキーでダイアログの表示/非表示ができればと思いました。


ダイアログオブジェクトは、このような使い方はしないのですね。

上記のテキストとボタンをショートカットキーのような

簡単なアクションで表示/非表示する場合は

どのようなオブジェクトを使用すればいいのでしょうか。

ご教授いただけると幸いです。

 

参考になるかどうか分かりませんが、下記のページで似たような発想で発言しています。

https://www.mql5.com/en/forum/233950

ただし、ここでやっていることはアプリをロードした状態で表示/非表示しているだけです。

Create - Destroy のようなことをするには、起動はナビゲーターでショートカットを作成し、終了はプログラム内でChartIndicatorDeleteを実行するしかないように思います。

このページで画像表示している私のランキングパネルは次の物を参考にしています。

https://www.mql5.com/en/code/19190

 
Nagisa Unada #:

参考になるかどうか分かりませんが、下記のページで似たような発想で発言しています。

https://www.mql5.com/en/forum/233950

ただし、ここでやっていることはアプリをロードした状態で表示/非表示しているだけです。

Create - Destroy のようなことをするには、起動はナビゲーターでショートカットを作成し、終了はプログラム内でChartIndicatorDeleteを実行するしかないように思います。

このページで画像表示している私のランキングパネルは次の物を参考にしています。

https://www.mql5.com/en/code/19190


返信ありがとうございます。

Create - Destroy のようなことをするには、起動はナビゲーターでショートカットを作成し、終了はプログラム内でChartIndicatorDeleteを実行するしかないように思います。

そういう仕様なのですね。

プログラミング初心者なので、色々と勉強になりました。ありがとうございます。


最終的に最初に提案していただいた通り、ボタンで実装することになりました。

ありがとうございます。

理由: