記事"グラフィカルインタフェースVI:チェックボックスコントロール、編集コントロールとその混合型(チャプター 1)"についてのディスカッション

 

新しい記事 グラフィカルインタフェースVI:チェックボックスコントロール、編集コントロールとその混合型(チャプター 1) はパブリッシュされました:

本稿は、MetaTrader端末でグラフィカルインタフェースを作成するためのライブラリの開発に関するシリーズの第六部の始まりです。第1章ではチェックボックスコントロール、編集コントロールとその混合型についてお話します。

チェックボックスコントロール

チェックボックスコントロールは、2つの状態しか持つことができないパ ラメータの管理にのために設計されています。2つのアイコンを持つボタンがコントロールが接続されているパラメータの現在の状態を識別するために使用され ます。チェックマークの付いたアイコンは、パラメータが有効(オン)になっていることを意味します。チェックマークのないアイコンは、パラメータが無効 (オフ)になっていることを意味します。パラメータの簡単な説明は、ボタンの近くに位置します。 

この要素は、3つのグラフィカルオブジェクトで構成されます。それらは:

  1. 背景
  2. アイコン(ボタン)
  3. テキストラベル

図1。チェックボックスコントロールの複合部分

図1。チェックボックスコントロールの複合部分

作者: Anatoli Kazharski

 

しかし、極端な値に達したときに "ウィンク "することは、インジケーターでは機能しない -Sleep()...

Anatoly, もう一つ改善要求を書いてください: 遅延はタイマーを使って整理すべきです。

 
Artyom Trishkin:

しかし、極端な値に達したときに "ウィンク "することは、インジケータでは機能しない - Sleep() ...

Anatoly、もう一つ改善要求を書いてください:遅延はタイマーで組織されるべきです。

私はそれを書き留めました。リストは増えています。ありがとう。)
 
感動的だ...。:)
 

アナトリー、あなたの作成したライブラリーは非常に完成度が高いので、それを使って自分用に小さなプロジェクトを作成してみることにしました。質問がどの要素を指しているのかが明確になるように、このトピックに書きます。入力フィールド(SpinEdit)では、10分の2の精度で値を入力する必要があります。フィールド作成のプロシージャで、対応するプロパティ(StepValueとStepDigits)を設定しました(以下のコードを参照):

...
   m_spin_edit_Depo.MaxValue(10000000);
   m_spin_edit_Depo.MinValue(0);
   m_spin_edit_Depo.StepValue(0,01);
   m_spin_edit_Depo.SetDigits(2);
   m_spin_edit_Depo.SetValue(v);
...

コンパイル後、エラーが発生しました:'StepValue' - どのオーバーロードも関数呼び出しに適用できません。

論理的には、値の文字数が1より小さい場合、ステップ値のインクリメントも1より小さくなります。同時に、このクラスのコードでは、入力された値のチェックは非負の場合のみ行われます。

...

   //--- Шаг значения

   double            StepValue(void)                          const { return(m_step_value);               }
   void              StepValue(const double value)                  { m_step_value=(value<=0)? 1 : value; }
...

問題は、このエラーがどこから来るのか、私にはわからないということです。

そこで疑問というか、希望がある。最小値/最大値を制御する必要がなく、それを格納するために使用されるdouble 型の変数のサイズによってのみ制限される場合はどうなるのでしょうか?コードから理解したように、最小値/最大値の設定は必須です。私の希望を改善リストに加えることは可能でしょうか?すなわち、フィールドの最小値/最大値が指定されていない場合、入力された値の制御は、double型の変数の範囲に入るときにのみ実行されます。

 
Pavel Trofimov:

そしてコンパイル後、次のエラーが出た:'StepValue' - どのオーバーロードも関数呼び出しに適用できない。

...

疑問なのは、このエラーがどこから来ているのかがはっきりしないことだ。

タイプミスがあります。区切り文字としてドット「.:

   m_spin_edit_Depo.StepValue(0. 01);

//---

次に質問というか希望です。最小値/最大値を制御する必要がなく、その格納に使用される double型の変数のサイズによってのみ制限される場合はどうなるの でしょうか?コードから理解したように、最小値/最大値の設定は必須です。私の希望を改善リストに加えることは可能でしょうか?すなわち、フィールドの最小値/最大値が指定されていない場合、入力された値の制御はdouble型の変数の範囲に入るときのみ実行されます。

今のところ、強制的に最大値と最小値を設定することができます。このように:

   m_spin_edit_Depo.MaxValue(DBL_MAX);
   m_spin_edit_Depo.MinValue(-DBL_MAX);
 
Anatoli Kazharski:

タイプミスがあります。区切り文字としてフルストップ「.:

//---

とりあえず、最大値と最小値を強制的に指定することができます。これでよし:

タイプミスのご指摘、ありがとうございました。私のコードでは、私の目は「石鹸のよう」です。そして、最大値と最小値を強制的に設定することについてですが、それは大丈夫です。自分で書いておきます。本当にありがとうございました!
削除済み  


EAに読み込めるように、スピンエディットの値を取得する方法を教えてください。

よろしくお願いします。

 
Hidayat Nur Wahit:


スピン編集の値を取得し、EAに読み込ませる方法を教えてください。

よろしくお願いします。

例えば、CProgram::OnEvent()イベントハンドラの記事から:

void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
//--- Событие нажатия на текстовой метке
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL)
     {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
      //--- Если нажали на первом чекбоксе
      if(lparam==m_checkbox1.Id())
        {
         m_checkbox2.CheckBoxState(m_checkbox1.CheckButtonState());
         m_spin_edit1.SpinEditState(m_checkbox1.CheckButtonState());
         
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }

      if(lparam==m_checkbox3.Id())
        {
         m_checkboxedit1.CheckBoxEditState(m_checkbox3.CheckButtonState());
         
         Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue());
        }

      if(lparam==m_checkbox4.Id())
        {
         m_checkcombobox1.CheckComboBoxState(m_checkbox4.CheckButtonState());
        }

      if(lparam==m_checkbox5.Id())
        {
         m_slider1.SliderState(m_checkbox5.CheckButtonState());
         m_dual_slider1.SliderState(m_checkbox5.CheckButtonState());
         
         Print("m_slider1.GetValue(): ",m_slider1.GetValue());
         Print("m_dual_slider1.GetLeftValue(): ",m_dual_slider1.GetLeftValue());
         Print("m_dual_slider1.GetRightValue(): ",m_dual_slider1.GetRightValue());
        }
     }

   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
     {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
      
      if(lparam==m_spin_edit1.Id())
        {
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
        
      if(lparam==m_checkboxedit1.Id())
        {
         Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue());
        }
      
      if(lparam==m_slider1.Id())
        {
         Print("m_slider1.GetValue(): ",m_slider1.GetValue());
        }
        
      if(lparam==m_dual_slider1.Id())
        {
         Print("m_dual_slider1.GetLeftValue(): ",m_dual_slider1.GetLeftValue());
         Print("m_dual_slider1.GetRightValue(): ",m_dual_slider1.GetRightValue());
        }
     }

   if(id==CHARTEVENT_CUSTOM+ON_CLICK_INC || id==CHARTEVENT_CUSTOM+ON_CLICK_DEC)
     {
      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
      
      if(lparam==m_spin_edit1.Id())
        {
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
        
      if(lparam==m_checkboxedit1.Id())
        {
         Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue());
        }
     }
  }
削除済み  
Anatoli Kazharski:

例えば、CProgram::OnEvent()イベントハンドラの記事から:

ありがとうございました。これでうまく値を読み取ることができ、私のEAに適用することができます。

Regard's
 

親愛なる アナトーリ・カザルスキー 、この素晴らしいライブラリを本当にありがとう!

出来上がったインターフェースのルック&フィールがとても気に入っています。

テスト・ライブラリ10.mq5を私の個人的なニーズに適応させ始めたとき、次のメソッドを追加することが本当に役に立ちました。

void CSpinEdit::LabelText(const string new_text)

メソッドをCSpinEdit クラスに 追加することで、CLabel::Description(const string new_text)への呼び出しを遅延させることができます。その理由は、CComboBoxの状態によって異なるタイプの値のためにCSpinEditを使っているからです。LabelText(text)でラベルを変更し、適切な編集書式を選択した後、値を表示するために

void CSpinEdit::ChangeValue(const double value)

ありがとうございました。