記事"グラフィカルインタフェース V:コンボボックス要素(チャプター 3)"についてのディスカッション

 

新しい記事 グラフィカルインタフェース V:コンボボックス要素(チャプター 3) はパブリッシュされました:

シリーズの第五部の最初の2つの記事では、スクロールバーとビューリストを作成するためのクラスが作成されました。この章では、コンボボックスコントロールのクラスを作成する方法についてお話します。これはまた、とりわけ第五部の前の章で考慮された要素を含むコンパウンドコントロールです。

本稿では、複合型のコントロールコンボボックスについて考えました。グラフィカルインタフェースを作成するためのライブラリーの開発の現段階での概略は以下に示されます。

 図3。開発の現段階でのライブラリの構造

図3。開発の現段階でのライブラリの構造

作者: Anatoli Kazharski

 

クールで便利なことをやっているね ;)

アナトール、改善すべき点がいくつかあると思う。例えば、カーソルがリストのどれかに重なっているとき、僕の手はリストをスクロールさせようとホイールに伸びるが、残念なことにチャートをスクロールさせてしまう。チャートのスクロール・トラッキングもある。もしかしたら、リストを削除するのではなく、グラフのスクロールを一時的に無効にしてスクロールさせた方がいいのかもしれません。

もうひとつ、リスト・ボタンの左にあるリストの説明を表示しないオプションがあることに気づきませんでした。常に必要というわけではありません。

 

まあ、または一般的にcardinally - プログラムのメインウィンドウにフォーカスがある場合は、チャートのスクロールを無効にし、そこにすでにホイールから何かをスクロールする必要があるかどうかを判断するためにその場で、またはそれに反応しない....

例えば、3DスタジオMAXでは、クランプされたマウスの左ボタンと、任意の値のインクリメント/デクリメントの形で上下にその動きに反応があります。上下矢印を クリックし、ボタンを離さずにマウスを上下に動かすと、マウスの移動方向によってフォームウィンドウの値が増減する。

 
Artyom Trishkin:

アナトール、改善すべき点がいくつかあると思う。例えば、カーソルがリストのどれかに重なったとき、リストをスクロールさせようとホイールに手が伸びるが、残念ながら、チャートをスクロールさせてしまう。そして、チャートのスクロールをトラッキングしている。リストを削除するのではなく、一時的にチャートのスクロールを無効にしてスクロールさせた方がいいのではないでしょうか?

さて、私の知る限り、MQLツールはマウスの中ボタンが押されているかどうかを追跡することができる。しかし、スクロールしているかどうかを追跡することはまだ不可能です。

もうひとつ、リスト・ボタンの左側にあるリストの説明を表示しないオプションがあるかどうか、私はまだ気づいていない。常に必要というわけではありません。

はい、可能です。項目を作成するとき、CComboBox::LabelText()メソッドに空の文字列("")を渡します。

例えば、3D Studio MAXなどでは、クランプされたマウスの左ボタンとその上下の動きに対して、ある値のインクリメント/デクリメントという形で反応があります。 上下の矢印をクリック し、ボタンを離さずにマウスを上下に動かすと、マウスの動く方向によって、ボックス内の値が増減します。

次回は、"Input Field "要素を含む多くのコントロールを紹介する。現在の実装では、加速スクロールがあります。つまり、マウスの左ボタンを増減ボタンの上に置いたまま、これらのボタンの領域にカーソルを置くと、値のスクロールが加速されます。

 
//+------------------------------------------------------------------+

//|コンボボックスmqh
//| Copyright 2015, MetaQuotes Software Corp.|
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#include "Element.mqh"
#include "Window.mqh"
#include "ListView.mqh"
//+------------------------------------------------------------------+
||そのような状況  下において、このようなことを行う必要があります。                     |
//+------------------------------------------------------------------+
class CComboBox : public CElement
  {
private:
   //--- この記事は、そのような理由で書かれたものです。
   CWim_buttonndow          *m_wnd;
   //--- このような場合、次のような方法があります。
   CRectLabel        m_area;
コメントが英語でなくなった理由は?
 
Amir Yacoby:
コメントが英語でなくなった理由は?

私も同様で、現在2つのことが起こっていると思います。


1.
2. 英語に翻訳できる人がいない。私にとっても、主要なコメントがなぜ英語でないのか、明確ではありません。しかし、関数が 英語で宣言され、上記のようなほとんどの例が英語で利用可能である限り、それは問題ではありません。


 
MetaQuotes Software Corp.:

新しい記事Graphical Interfaces V: The Combobox Control (Chapter 3) が掲載されました:

著者アナトリ・カザルスキー

次のシリーズも楽しみにしています。 SplitButton.mqhの90行目をチェックしてもらえますか?エラーが発生します。

return - constポインタからnonconstポインタに変換できません。

const "を削除して動作するようにしました。
 
Kaleem Haider:

return - constポインタから非constポインタに変換できない。

const "を削除したらうまくいきました。

はい。このエラーが発生した場合は、constを削除 する必要があります。後ほど、すべての記事のファイルを更新します。

 

[WIN7 64bits - MetaTrader5 build 1472]

コンボボックスでの SplitString の奇妙な動作。


ユーザーが売りまたは買いのボタンをクリックすると、プログラムはコンボボックスから選択されたアイテムを取得し、注文の sl と tp を計算します。
デバッグモード(F5)で実行すると問題はありません。
EasyAndFastライブラリはSplitString関数、PrintFormat関数、StringToDouble関数を オーバーライドしているようです。しかし、全くわかりません。
これが私の例です:

//+------------------------------------------------------------------+
//| コンボボックスTPを作成します:SL|
//+------------------------------------------------------------------+
bool CProgram::CreateTPSLComboBox(const int x_gap, const int y_gap, const string text) {
  // リストビュー項目の総数
  #define ITEMS_TOTAL1 4

  // パネルオブジェクトを渡す
  _tpslCombobox.WindowPointer(_mainWindow);
  
  // 最初のタブに貼り付ける
  _mainTabs.AddToElementsArray(0, _tpslCombobox);  
  
  // 座標
  int x = _mainWindow.X() + x_gap;
  int y = _mainWindow.Y() + y_gap;
  
  // リストビューの項目値の配列
  string items_text[ITEMS_TOTAL1] = {"2:4", "2:3", "3:4", "0:0"};
  
  // 作成前にプロパティを設定する
  _tpslCombobox.XSize(90);
  _tpslCombobox.YSize(18);
  _tpslCombobox.LabelText(text);
  _tpslCombobox.ButtonXSize(45);
  _tpslCombobox.ItemsTotal(ITEMS_TOTAL1);
  _tpslCombobox.VisibleItemsTotal(4);
  _tpslCombobox.AreaColor(clrWhite);

  // コンボボックスのリストビューに項目の値を格納する
  for(int i = 0; i < ITEMS_TOTAL1; i++)
    _tpslCombobox.ValueToList(i, items_text[i]);
  
  // リストビューのポインタを取得する
  CListView *lv = _tpslCombobox.GetListViewPointer();
  
  // リスト・ビューのプロパティを設定する
  lv.LightsHover(true);
  lv.SelectedItemByIndex(lv.SelectedItemIndex() == WRONG_VALUE ? 0 : lv.SelectedItemIndex());
  
  // コントロールの作成
  if(!_tpslCombobox.CreateComboBox(m_chart_id, m_subwin, x, y))
    return(false);

  // オブジェクト・グループの共通配列にオブジェクトを追加する
  CWndContainer::AddToElementsArray(0, _tpslCombobox);
  return(true);
}

...

//+------------------------------------------------------------------+
//| 販売機能|
//+------------------------------------------------------------------+
void CProgram::Sell() {
  string sep = ":";
  ushort usep;
  usep = StringGetCharacter(sep, 0);
  string s[];
  double tp = 0.0;
  double sl = 0.0;
  if(StringSplit(_tpslCombobox.ButtonText(), usep, s) == 2) {
    PrintFormat("s01: %s - s02: %s", s[0], s[1]); // output: s01: 2 - s02: 4 
    tp = StringToDouble(s[0]);
    sl = StringToDouble(s[1]);
  }
  PrintFormat("tp: %.2f - sl: %.2f", tp, sl); // output: tp: 2.00 - sl: 2.00
...

出力は"tp:2.00 - sl: 2.00 "は "tp:2.00 - sl: 4.00 "となるはずです。
しかし、やはり問題はチャートにドラッグ・アンド・ドロップしたときにのみ現れます。デバッグモードで実行すると、すべて問題ない。
何かアドバイスがありますか?

------
更新:
特にEasyAndFastライブラリの問題ではなく、MetaTrader 5の問題のようです。
以下はテストです:
//+------------------------------------------------------------------+
//|をテストします。mq5
//| Copyright 2016, MetaQuotes Software Corp.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| スクリプト・プログラム開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    string sep = ":";
    ushort usep;
    usep = StringGetCharacter(sep, 0);
    string s[];
    double tp = 0.0;
    double sl = 0.0;
    if(StringSplit("2:4", usep, s) == 2) {
      tp = StringToDouble(s[0]);
      sl = StringToDouble(s[1]);
    }
    PrintFormat("tp: %.2f - sl: %.2f", tp, sl);
  }
//+------------------------------------------------------------------+
出力:出力: "tp: 2.00 - sl: 4.00" デバッグモード(F5)
出力:スクリプトをチャートにドラッグ・アンド・ドロップすると、"tp: 2.00 - sl: 2.00 "と出力されます。

もし他の誰かがこれを確認したら、ServiceDeskに報告します。
ありがとうございます。

[WIN7 64bits - MetaTrader5 build 1472].
 

すべてを mql4 フォルダにコピーしたが、TestLibrary Expert Advisor は灰色で開かない。Expert Advisorでは "cannot open file "と表示されます。

テストモードでは動作するのでしょうか?テスト モードで動作することが非常に重要なので、なぜ起動しないのかを調査する意味はあるのでしょうか。

 
Evgeniy Scherbina:

すべてを mql4 フォルダにコピーしたが、TestLibrary Expert Advisor は灰色で開かない。Expert Advisorでは "cannot open file "と表示されます。

テストモードでは動作するのでしょうか?テスト モードで動作することが非常に重要なので、動作しない理由を調査する意味はあるのでしょうか。

MT4バージョンのライブラリはもうサポートされていません。

現時点でのMT5用の最新バージョンは、こちらの記事からダウンロードできます:GUI X: Time Element, Checkbox List Element and Table Sorting (build 6).

テスターテストは現在の開発段階では実施されておらず、長期にわたって実施される予定はありません。