記事"GUIのレイアウトとコンテナの使用: CBoxクラス"についてのディスカッション - ページ 2

 

このコードはコンパイルできない。ビルド 1702。

'pipvaluecalculator.mq5' pipvaluecalculator.mq5 1 1

...

'm_client_area' - プライベートメンバアクセスエラー PipValueCalculator.mqh 118 60

'm_client_area' - プライベートメンバアクセスエラー PipValueCalculator.mqh 118 91

'm_client_area' - プライベートメンバアクセスエラー PipValueCalculator.mqh 129 72

'm_client_area' - プライベートメンバアクセスエラー PipValueCalculator.mqh 148 75

'm_client_area' - プライベートメンバアクセスエラー PipValueCalculator.mqh 168 77

'm_client_area' - プライベートメンバアクセスエラー PipValueCalculator.mqh 187 72

6 エラー(s), 0 警告(s) 7 1

余談ですが、私が見落としていなければ、ファイルを置く場所を指定する必要があります。インクルードで "Layouts "フォルダを作成し、その中にBox.mqhファイルを配置する必要があることは、コードを見てみなければわかりません。


 

ビルド1755を使用しています。

ControlsDialog.mqhのCDialogクラスの メンバm_client_areaがprivateになり、WidthとHeightのプロパティを取得する新しいメソッドが作成されました。

私の場合、以下の変更で動作するようになりました。
a) CDialog::m_client_area.Width() を CDialog::ClientAreaWidth() に置き換えた。
b) CDialog::m_client_area.Height() を CDialog::ClientAreaHeight() に置き換えた。
 
Alain Verleyen :

このページは1702年に公開されました。

'pipvaluecalculator.mq5' pipvaluecalculator.mq5 1 1

...

'm_client_area' - PipValueCalculator.mqh 118 60% の値を返します。

'm_client_area' - PipValueCalculator.mqh 118 91 を計算します。

'm_client_area' - 指定されたクライアント領域 PipValueCalculator.mqh 129 72

'm_client_area' - PipValueCalculator.mqh 148 75

'm_client_area' - PipValueCalculator.mqh 168 77

'm_client_area' - PipValueCalculator.mqh 187 72 を参照してください。

6 エラー (s), 0 警告 (s) 7 1

このオプションを選択した場合、その時点で、このファイルパスの内容を確認する必要があります。この場合、そのファイルが保存されていることを確認する必要があります。Layouts "フォルダをインクルードし、Box.mqhファイルをインクルードすることを確認するために、コードを確認し、変更する必要があります。


 

この便利なアドオンで問題が発生しました。

標準コントロールに詳しい方にアドバイスをお願いします。

このパネル付きアドインは標準クラス CWnd, CWndClientを使用しているので、その内部構造を知っていれば、どこで「犬が戦っている」のかを理解するのに十分かもしれないと仮定します。

問題の本質記事からControls2.mq5プログラム(コンパイルにはControlsDialog2.mqhとBox.mqhも必要)を取り出し、コンパイルし、実行する。

datapicker "以外はほとんどうまく動く。これは開いたり閉じたりするだけですが、開いた状態ではクリックに反応せず、下にあるコントロールへのイベントをスキップします。

MQのオリジナルの同様のデモ(Experts/Examples/Controls.mq5)は、"datapicker "で正常に動作します。

 
Stanislav Korotky:

datapicker "以外はほぼすべて正常に動作します。これは開いたり閉じたりするだけだが、開いた状態では押されたことに反応せず、下にあるコントロールへのイベントをスキップする。

MQのオリジナルの同様のデモ(Experts/Examples/Controls.mq5)は、"datapicker "で正常に動作します。

疑問は取り除かれました。CDatePickerでは、例えばCComboBoxで行われるような、ドロップダウンが展開されたときのBringToTop呼び出しはありません。標準の例では、CDatePickerが動作するのは、その初期化が(故意か偶然か)、トポロジー的に下にある "leafbox "の作成後に移動されたためです。そして、CWndContainer::OnMouseEventのコントロールは、最後に追加されたものから最初に追加されたものへとバイパスされます。

普通に修正するには、CDatePicker::ListShowをオーバーライドする必要があるが、これは仮想ではない。CDatePicker::OnClickButtonを再定義して、そこにBringToTopを追加するしかない。しかし、全てのメンバ変数がprivate宣言されているため、標準ライブラリの 仮想メソッドと同じように正しく書くことができない。特に

bool MyDatePicker::OnClickButton(void) // override
{
    return ((m_drop.Pressed()) ? BringToTop() && ListShow() : ListHide());
}

と書くことはできない。BringToTopは、開くときと折りたたむときの両方で呼び出さなければならない。

#include <Controls/DatePicker.mqh>

class CDatePickerFixed: public CDatePicker
{
  protected:
    virtual bool OnClickButton() override
    {
      BringToTop();
      return CDatePicker::OnClickButton();
    }
};
 

そして、いくつかのミスがある:


 
分かち合ってくれてありがとう