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

 
Thomas Schwabhäuser:

...

ヒントをありがとう!

この機能を追加します。このシリーズの今後の記事をお楽しみに。

 

あなたの例では、常にid、lparam、dparam、sparamが出力されています。

   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)

     {

      ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);

      //Print(m_spin_edit1.GetValue());

     }

以下のようになります

TestLibrary (NZDUSD,H1) CProgram::OnEvent > id: 1020; lparam: 12; dparam: -1.0; sparam: Spin Edit 1:

id - 要素の識別子

lparam - ?

dparam - ?

sparam - 要素名

入力フィールドを考えて います。もちろん、入力された値を取得するのは興味深いことですが、それを可能な限り高速に行うにはどうすればよいでしょうか?

 
Pavel Kolchin:

あなたの例では、常にid、lparam、dparam、sparamが出力されています。

...

id - 要素の識別子

lparam - ?

dparam - ?

sparam - 要素名

コントロールが生成するメッセージとパラメータは,ほとんどの場合,以下のような意味です.

  • id - イベント識別子.
  • lparam - 要素識別子.
  • dparam - 要素インデックス.
  • sparam - ライブラリユーザーによって指定された表示テキスト(要素名)。

各要素のイベント・パラメーターのセットを示す表は、後で用意します。

Pavel Kolchin:

...

入力フィールドを考えて みましょう。もちろん、入力された値を取得するのは興味深いことです。

CSpinEdit::GetValue()メソッドを使用するだけで、入力フィールドの現在の値を取得できます。

//--- 入力フィールドからのイベントが到着した。
   if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
     {
      //--- 項目IDが最初の入力フィールドのものである場合
      if(lparam==m_spin_edit1.Id())
        {
         //--- その値を出力する
         Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
        }
      //---
      return;
     }
 
もし名前がわからなかったり、フィールドが100個もあったりしたら、idを使ったメソッドがあるかもしれないし、this.GetValue()の ようなものがあるかもしれない。
 
Pavel Kolchin:
もし名前がわからなかったり、フィールドが100個もあったりしたら、idを使ったメソッドがあるかもしれないし、this.GetValue()の ようなものがあるかもしれない。
各要素はそれぞれ固有の要素IDを持っているわけです。
 
Anatoli Kazharski:
だから、各要素はそれぞれ固有の要素識別子を持つ。


if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

   if(lparam==m_spin_edit1.Id()){Print(m_spin_edit1.GetValue());}

   if(lparam==m_spin_edit2.Id()){Print(m_spin_edit2.GetValue());}

   if(lparam==m_spin_edit3.Id()){Print(m_spin_edit3.GetValue());}

   if(lparam==m_spin_edit4.Id()){Print(m_spin_edit4.GetValue());}

   if(lparam==m_spin_edit5.Id()){Print(m_spin_edit5.GetValue());}

   if(lparam==m_spin_edit6.Id()){Print(m_spin_edit6.GetValue());}

   if(lparam==m_spin_edit7.Id()){Print(m_spin_edit7.GetValue());}

   if(lparam==m_spin_edit8.Id()){Print(m_spin_edit8.GetValue());}

   if(lparam==m_spin_edit9.Id()){Print(m_spin_edit9.GetValue());}

   ...

}

私はそのようなコードを書かないつもりだった。

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

    Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

しかし、私はフィールドの数が多くないので、最初のオプションで十分です。

 

Pavel Kolchin:

...

私はそのようなコードを書かないつもりだった。

if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{

    Print(GetValue(lparam));

   или

   Print(this.GetValue());

}

全要素の全ゲット・メソッドに対してそれを行う方法はまだ持っていない。でも考えてみます。
 
//+------------------------------------------------------------------+
//| チャートイベント機能|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   program.ChartEvent(id,lparam,dparam,sparam);
   if(lparam==program.m_checkbox.Id())
      if(program.m_checkbox.CheckButtonState())
        {
         program.m_checkbox.LabelColor(clrGreen);
        }
   else
     {
      program.m_checkbox.LabelColor(clrRed);
     }
  }
//+------------------------------------------------------------------+
簡単な作業です。チェックボックスをクリックしたときのラベルの色を変える。チェックあり-緑文字、チェックなし-赤文字。うまくいかない。チェックを外すと青になり、チェックを入れても青のままです。
 

Alexander Fedosov:

簡単な作業です。チェックボックスをクリックしたときのラベルの色を変える。チェックあり-緑文字、チェックなし-赤文字。うまくいかない。チェックを外すと青になり、チェックを入れても青のままです。

アイテムがインストールされる前にのみ、異なる状態に色を設定できるようになりました(下の例):

//+------------------------------------------------------------------+
//| チェックボックス1を作成する|
//+------------------------------------------------------------------+
bool CProgram::CreateCheckBox1(const int x_gap,const int y_gap,string text)
  {
//--- ウィンドウ・ポインタを保存する
   m_checkbox1.WindowPointer(m_window1);
//--- 作成前にプロパティを設定する
   m_checkbox1.XSize(90);
   m_checkbox1.YSize(18);
   m_checkbox1.LabelColor(clrGreen);
   m_checkbox1.LabelColorOff(clrRed);
   m_checkbox1.LabelColorHover(clrCornflowerBlue);
   m_checkbox1.LabelColorLocked(clrSilver);

//--- コントロールの作成
   if(!m_checkbox1.CreateCheckBox(m_chart_id,m_subwin,text,x_gap,y_gap))
      return(false);
//--- オブジェクト・グループの共通配列にオブジェクトを追加する。
   CWndContainer::AddToElementsArray(0,m_checkbox1);
   return(true);
  }
 
Alexander Fedosov:
//+------------------------------------------------------------------+
//| チャートイベント機能|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   program.ChartEvent(id,lparam,dparam,sparam);
   if(lparam==program.m_checkbox.Id())
      if(program.m_checkbox.CheckButtonState())
        {
         program.m_checkbox.LabelColor(clrGreen);
        }
   else
     {
      program.m_checkbox.LabelColor(clrRed);
     }
  }
//+------------------------------------------------------------------+
簡単な作業です。チェックボックスをクリックしたときのラベルの色を変える。チェックあり-緑文字、チェックなし-赤文字。うまくいかない。チェックを外すと青になり、チェックを入れても青のままです。

どうでしょう?

   if(lparam==program.m_checkbox.Id())
     {
      if(program.m_checkbox.CheckButtonState()) program.m_checkbox.LabelColor(clrGreen);
      else program.m_checkbox.LabelColor(clrRed);
     }