記事"グラフィカルインタフェース I: フォームボタンとインターフェイス要素削除のための関数(チャプター 4)"についてのディスカッション

 

新しい記事 グラフィカルインタフェース I: フォームボタンとインターフェイス要素削除のための関数(チャプター 4) はパブリッシュされました:

本稿はグラフィカルインターフェイスに関するシリーズの続きです。シリーズ第一弾のグラフィカルインタフェース I: ライブラリストラクチャの準備(チャプター 1)ではライブラリの目的を詳細に考慮します。第一部の記事へのリンクの完全なリストは各章の終わりにあります。そこではまた、開発の現段階でのライブラリの完全版をダウンロードすることができます。ファイルはアーカイブと同じディレクトリに配置される必要があります。

前回の記事ではCWindowクラスがチャート上でのフォームの移動を可能にする機能の追加によって拡張されました。フォームコントロールは、マウスカーソルの動きに反応します。本稿ではCWindowクラスの開発を続け、コントロールのクリックによってのフォーム管理を可能にするメソッドでそれをより豊かにします。フォームのボタンによってのプログラムの終了を有効にするだけでなく、フォームの最小化と最大化機能も実装します。

インターフェース機能の削除

これまでの記事の一連の推奨アクションに従った場合、EAがチャートから削除された場合 に、グラフィカルインターフェースのすべてのオブジェクトが削除されることを見ることができます。チャートからグラフィックオブジェクトを削除するメソッ ドはまだ説明されていません。EAが削除されたときにオブジェクトはなぜ削除されるのでしょうか。これは、標準ライブラリ、正確にはCChartObjectクラスのデストラクタで提供されていて、その派生クラスは我々のライブラリで使用されています。プログラムがチャートから削除された場合、これを含むクラスのデストラクタが呼び出されます。オブジェクトがこのチャートに接続されている場合、それが削除されます。

//+------------------------------------------------------------------+
//| デストラクタ                                                       |
//+------------------------------------------------------------------+
CChartObject::~CChartObject(void)
  {
   if(m_chart_id!=-1)
      ::ObjectDelete(m_chart_id,m_name);
  }

EAがチャート上にあるときにチャートの銘柄や時間枠が変更された場合、デストラクタが呼び出されず、グラフィカルオブジェクトは削除されません。グラフィカルインターフェイスがメインプログラムファイルのOnInit() 初期化関数で作成され、銘柄またはEAの時間枠の変更によって初期化解除と初期化が実施され、グラフィカルインターフェイスが既存のものの上に作成されま す。その結果、このような変更の最初のインスタンスはオブジェクトの2つのコピーを生成します。チャートの銘柄や時間枠を変更し続ける場合は、インタ フェースオブジェクトの多数のコピーができます。

図4チャートの銘柄と時間枠の切り替え時のフォームのテスト

図4チャートの銘柄と時間枠の切り替え時のフォームのテスト


作者: Anatoli Kazharski

理由: