記事"グラフィカルインタフェースVIII: ファイルナビゲータコントロール(チャプター3)"についてのディスカッション - ページ 2

 

アナトリー、これは私がここで見たmqlのguiライブラリの中で最高の実装だと思う。

私は今、これを私のEAに「ボルトで固定」する方法を検討しています。2つのことを除いて、すべてが十分です:

1) 個々のセル内にコントロール(チェックボックス、ボタン、...)を持つテーブルがない。

2) 動的なコンテンツを持つウィンドウをどのように作るか、「追いつく」ことができない。

1)-thについては、原理的にはCTableの拡張として新しいクラスを作る必要があることは明らかです。しかし、2)については謎だ。Expert Advisorが動作するさまざまな瞬間に、現在の状況に応じて異なる数のチェックボックスがあるダイアログウィンドウが開かれると仮定しよう。次にウィンドウを開いたときにチェックボックスの数が増えていれば、それがどのように行われるかは明らかである。しかし、チェックボックスの数が減少した場合、どのようにすればよいのでしょうか?私の理解が正しければ、このウィンドウに「サブスクライブ」されているコントロールのいくつかを「殺す」必要がありますが、CWndContainerには アイテムを破壊するメソッドはなく、追加するメソッドしかありません。もしこのバージョンのライブラリで可能なら、その方法を教えていただけますか?

 
akskarabey:

アナトリー、これは私がここで見たmqlのguiライブラリの中で最高の実装だと思う。

私は今、これを私のEAに「ボルトで固定」する方法を検討しています。2つのことを除いて、すべてが十分です:

1) 個々のセル内にコントロール(チェックボックス、ボタン、...)を持つテーブルがない。

2) 動的なコンテンツを持つウィンドウをどのように作るか、「追いつく」ことができない。

1)-thについては、原理的にはCTableの拡張として新しいクラスを作る必要があることは明らかです。しかし、2)については謎だ。Expert Advisorが動作するさまざまな瞬間に、現在の状況に応じて異なる数のチェックボックスがあるダイアログウィンドウが開かれると仮定しよう。次にウィンドウを開いたときにチェックボックスの数が増えていれば、それがどのように行われるかは明らかである。しかし、チェックボックスの数が減少した場合、どのようにすればよいのでしょうか?私の理解が正しければ、このウィンドウに「サブスクライブ」されているコントロールのいくつかを「殺す」必要がありますが、CWndContainerにはアイテムを破壊するメソッドはなく、追加するメソッドしかありません。もしこのバージョンのライブラリで可能であれば、その方法を教えていただけますか?

興味深いご提案をありがとうございます。

はい、このバージョンにはそのような既成のソリューションはありません。私はそのような機能の必要性を感じているので、実装の計画に加えました。

2点目について。もしチェックボックスの動的なリストが必要なら、CCheckboxListの ようなアイテムのクラスをもうひとつ作って、アイテムが作られた後に配列(リスト)のアイテムを 追加したり削除したりするメソッドを持たせたほうが簡単です。ちなみに、この機能はすべてのタイプのリストとテーブルにも追加する予定だ。

 
Anatoli Kazharski:

2点目について。チェックボックスの動的なリストが必要な場合、もっと簡単な方法は、CCheckboxList 型の要素の別のクラスを作り、要素が作られた後に配列(リスト)の要素を 追加したり削除したりするメソッドを持たせることだ。ちなみに、この機能はすべてのタイプのリストやテーブルにも追加する予定です。

異なるチェックボックスのセットを持つ複数のタブを作り、必要なものを表示することは可能ですか?
 
Andrey Khatimlianskii:
チェックボックスのセットが異なる複数のタブを作り、必要なものを表示することはできますか?

もしセットがあらかじめ定義されているなら、このオプションは問題ない。

タブを作成することはすでに可能です:GUI VII: "タブ "要素(第2章) >>タブ

 
Anatoli Kazharski:

セットが最初から定義されている場合は、このオプションでよい。

タブの作成はすでに可能です:GUI VII:タブ要素(第2章)>>。

質問者へのヒントです)

タブをプログラムでアクティブにすることは可能ですか?

 
Andrey Khatimlianskii:

...

タブをプログラムでアクティブにすることは可能ですか?

カスタムクラスで、要素を作成する前にインターフェイスを作成します:

//+------------------------------------------------------------------+
//| タブ領域を作成する|
//+------------------------------------------------------------------+
bool CProgram::CreateTabs(void)
  {
#define  TABS1_TOTAL 4
//--- パネルオブジェクトを渡す
   m_tabs.WindowPointer(m_window1);
//--- 座標
   int x=m_window1.X()+TABS1_GAP_X;
   int y=m_window1.Y()+TABS1_GAP_Y;
//--- タブのテキストと幅を表す配列
   string tabs_text[]={"Tab 1","Tab 2","Tab 3","Tab 4"};
   int tabs_width[]={90,90,90,90};
//--- 作成前にプロパティを設定する
   m_tabs.XSize(596);
   m_tabs.YSize(243);
   m_tabs.TabYSize(TabsHeight);
   m_tabs.PositionMode(TabsPosition);
   m_tabs.SelectedTab((m_tabs.SelectedTab()==WRONG_VALUE) ? 1 : m_tabs.SelectedTab());
//--- 指定されたプロパティを持つタブを追加する
   for(int i=0; i<TABS1_TOTAL; i++)
      m_tabs.AddTab(tabs_text[i],tabs_width[i]);
//--- コントロールの作成
   if(!m_tabs.CreateTabs(m_chart_id,m_subwin,x,y))
      return(false);
//--- オブジェクト・グループの共通配列にオブジェクトを追加する。
   CWndContainer::AddToElementsArray(0,m_tabs);
   return(true);
  }

//---

これで十分ですか?それとも、作業中に要素が作成された後に、プログラムでタブを切り替えられるようにする必要があるのでしょうか?

 

そのような機能を追加することが望ましいのだが...。

というようなことだ:

m_tabs.SelectTab(...)
 
Ruslan Khasanov:
Andrey Khatimlianskii

作成後にタブのインデックスを指定して、そのタブをアクティブにできるようにします。

確かに、それが必要な場合もあるでしょう。タブを自動的にアクティブにするアイデアをいくつか思いつきました。)

 

ナビゲーターのサイズをナビゲーターが表示されているウィンドウのサイズに合わせるには?

例:ウィンドウのサイズは450です。左右に2ピクセルのインデントがあるようにナビゲータをウィンドウに収めるにはどうしたらいいですか?

 
Artyom Trishkin:

ナビゲーターのサイズをナビゲーターが表示されているウィンドウのサイズに合わせるには?

例:ウィンドウのサイズが450です。右と左がそれぞれ2ピクセルずつインデントされるように、ナビゲータをウィンドウに収めるにはどうすればよいですか?

CFileNavigator::TreeViewAreaWidth()メソッドとCFileNavigator::ContentAreaWidth()メソッドを使用して、ツリーリストエリアとコンテンツエリアの幅を指定する必要があります。コンテンツ領域の幅を設定しない場合、ナビゲータの右端は自動的にウィンドウの右端に合わせられます。