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

 
Karputov Vladimir:

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

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

ありがとうございます!

CDialogで試してみますが、どう動くべきかまだ理解できていません:作成後すぐにボタンが見えるようになりますが、消えてCDialogに飛ぶべきでしょうか?

 
Evgeny Potapov:

ありがとうございます!

CDialogで試してみますが、どのように動作するのかまだ理解できていません:ボタンは作成直後に表示されるようになりますが、消えてCDialogにジャンプするのでしょうか?

ステップ・バイ・ステップ(F11)デバッグモードでブレークポイントを使えば、隠れていたものがすべて見えるようになります。
 
Evgeny Potapov:

ありがとうございます!

CDialogで試してみますが、まだどのように動作するのか理解できていません:ボタンは作成直後に表示されるようになりますが、消えてCDialogにジャンプするのでしょうか?

Karputov Vladimir:

記事のPanelDialog2.mqh ファイルの例について:

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

はい、このクラスで動作しますが、なぜかダイアログがマウスでドラッグされません。ここで

int OnInit()  {
   MyButton = new CButton;
   if(CheckPointer(MyButton) == POINTER_INVALID) return(INIT_FAILED);
   MyDialog = new CDialog();
   if(CheckPointer(MyDialog) == POINTER_INVALID) return(INIT_FAILED);
   MyDialog.Create(ChartID(),WindowExpertName()+"_dailog",0,50,100,150,250);
   MyDialog.Add(MyButton);
   MyButton.Create(ChartID(),WindowExpertName()+"_button",0,70,120,90,190);
   MyDialog.Show();
   MyDialog.Enable();
   return(INIT_SUCCEEDED);
}
 
Vladimir Karputov:

すべてのイベントやボタンクリックの処理をしばらくの間無効にする方法を教えてください。
 
Subscribers:
すべてのイベントやボタンクリックの処理をしばらくの間(例えば、ポジションの オープンやクローズの 間)無効にする方法を教えてください。
具体的には?この記事のコードについて質問がありますか?
 
Vladimir Karputov:
そしてもっと重要なことは?この記事のコードについて質問がありますか?

この記事とは限りませんが...。ただ、どこにも見当たらないんだ。例えば...この記事には、ボタンのイベント処理に関する サブスクリプションがあります。

EVENT_MAP_BEGIN(CControlsDialog)
...
ON_EVENT(ON_CLICK,m_button_ok,OnClickButtonOK)
EVENT_MAP_END(CAppDialog)

質問:プログラムでこの処理を無効にし(ON_CLICK 処理を無効にし)、再度有効にするにはどうすればいいですか?

 
Subscribers:

この記事によれば、必ずしもそうではないが...。ただ、どこにも見当たらないんだ。例えば...この記事には、ボタンのイベント処理に関する サブスクリプションがあります。

EVENT_MAP_BEGIN(CControlsDialog)
...
ON_EVENT(ON_CLICK,m_button_ok,OnClickButtonOK)
EVENT_MAP_END(CAppDialog)

質問:プログラムでこの処理を無効にし(ON_CLICK 処理を無効にし)、再び有効にするにはどうすればいいですか?

禁止する方法はありませんが、クリック処理関数にフラグチェックを書くことができます。フラグがtrueならクリック処理を行い、falseなら関数を終了します。
 
Vladimir Karputov:
禁止する方法はないが、クリック処理の関数内にフラグチェックを書いて、フラグがtrueならクリック処理を行い、falseなら関数を抜けるようにすればいい。
それはすでにやったのだが・・・。でも、やっぱり違うんです。例えば、パネルのボタンを押して多くの注文をクローズするとき、パネルが完全に反応しないようにしたいのです。そうでなければ、(このとき)買いボタンをクリックしてもイベントは発生し、クローズがうまくいった後にイベント・ハンドラへの入力があります。
 
Vladimir Karputov:
禁止する方法はありませんが、クリック処理関数にフラグチェックを書くことができます。フラグがtrueならクリックを処理し、falseなら関数を終了します。
一般的に、パネルを非アクティブにする方法はありません。
 
Subscribers:
それはもうやったよ。一概には言えないんだけど...。例えば、パネルのボタンを押して大量の注文をクローズするとき、パネルが完全に反応しないようにしたいのです。そうしないと、(このとき)買いボタンをクリックしてもイベントは発生し、クローズがトリガーされた後にイベントハンドラへの入力があります。

正しいことをする - 関数に入ったらすぐに禁止フラグを処理する。

しかしちょっとだけ...。

追加しました:

禁則フラグに応じた押下処理が必要なだけです。