記事"グラフィカルインタフェースX: Easy And Fast (簡単で手早い)ライブラリの更新(ビルド2)"についてのディスカッション - ページ 2

 
Alexey Oreshkin:

多分、私のコードは削除されてしまったのだろう。

...

グラフィカル・インターフェース I:ライブラリ構造の準備 (第1章)

上のコードリストで、関数の前にダブルコロンがあることに注目してほしい。実際には、これを省略してもすべてが正しく動作します。しかし、プログラミングの世界では、ある言語の システム関数の前にダブルコロンを付けるのは良い習慣とされている。これにより、その関数がシステム関数であることが明確になります。

アレクセイ・オレシキン

このエラーは、インジケーターが作成したウィンドウを十字で閉じたときに発生します。ここにある例からMainWindow.mqhファイルを少し変更しました。

追加チェックでエラーを除外します。次回のアップデートで修正します。リプレイに失敗しました。MainWindow.mqh ファイルにどのような変更を加えましたか?

アレクセイ・オレシキン

また、作成されたテーブルの行を削除する方法がわかりません。

今のところ方法はありません。ライブラリーの次のバージョンになります。テーブルやリストの行を追加したり削除したりできるようになります。

 

不要なものを削除してしまったようだ。ファイルを添付します。

p.s. テーブルの各列に異なる幅を設定できますか?

ファイル:
 
Alexey Oreshkin:

不要なものを削除してしまったようだ。ファイルを添付します。

p.s. テーブルの各列に異なる幅を設定できますか?

同じテーブルのオブジェクトを要素ベースに2回追加したのが原因です。まず、CProgram::CreateTable()テーブル作成 メソッドでそれを行い、次にCProgram::ModifyTable()メソッドでそれを行います。以下のコード・リストで赤く ハイライトされている行を削除してください。

//+------------------------------------------------------------------+
//|| シンボル・テーブルの作成|
//+------------------------------------------------------------------+
bool CProgram::ModifyTable(int id)
  {
   int r=1;
   switch(id){
      case  0:         
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL;r++)
            m_table.SetValue(c,r,"rb1 "+(string)c+" "+(string)r);                                  
      break;
      
      case 1:
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL-5;r++)
            m_table.SetValue(c,r,"rb2 "+(string)c+" "+(string)r);  
      break;
      case 3:
         for(int c=0;c<COLUMNS2_TOTAL;c++)
         for(r=1;r<ROWS2_TOTAL-10;r++)
            m_table.SetValue(c,r,"rb3 "+(string)c+" "+(string)r);                                      
      break;
   }
      for(int c=0;c<COLUMNS2_TOTAL;c++)
      for(int rr=r;rr<ROWS2_TOTAL;rr++) m_table.SetValue(c,rr,"");

//--- 変更を示すためにテーブルを更新する
   m_table.UpdateTable();
//--- オブジェクト・グループの共通配列にオブジェクトを追加する。
   CWndContainer::AddToElementsArray(0,m_table);
   return(true);
  }  

//---

タイムフレームやシンボルを変更する場合など、チャートからプログラムを削除したり、再読み込みしたりするときに、以前にすでに削除された項目を削除しようとする2回目の試みが行われました。テーブル・オブジェクトを削除すると、配列が解放され、項目を削除するメソッドを再度呼び出すとエラーが発生しました。

アレクセイ・オレシキン

p.s. テーブルの各列に異なる幅を設定できますか?

このタイプのテーブル(CTable)ではできません。列の幅を設定できるのはCCanvasTable タイプのテーブルだけです。しかし、このタイプのテーブルでは、今のところ、他にも多くの制限があります。CCanvasTable タイプのテーブルの可能性は拡張される予定です。

 
Anatoli Kazharski:

その理由は、同じテーブル・オブジェクトを要素ベースに 2 回追加したためです。まずCProgram::CreateTable()メソッドで行い、次にCProgram::ModifyTable()メソッドで行います。下のコード・リストで赤く ハイライトされている行を削除してください。


CCanvasTableを試して みます。うまくいくかもしれません。
ありがとうございます!

p.s:テーブルの行を削除できない場合、テーブル全体を削除して、必要なテーブルを再度作成することができます。削除方法も見つかりませんでした。テーブルの削除はまだできないのですか?

p.s2: テーブルの列の幅を変えることができないので、2つのテーブルを隣り合わせに配置するのが論理的ですが、私の理解では、テーブルが自動的に右の境界線まで拡大されるため、それはできません。AutoXResizeModeという メソッドがあるのですが、まだ機能していないのでしょうか? falseに設定すると、何も変化が起こりません。

 
Alexey Oreshkin:

...

p.s.:テーブルの行を削除できない場合、テーブル全体を削除して、必要なテーブルを再度作成することができます。削除メソッドも見つかりませんでした。まだテーブルを削除できないのですか?

現在は、すべてのGUI 要素が一度に作成され、Show()メソッドとHide()メソッドを使用してそれらの可視性を制御できます。

アレクセイ・オレシキン

p.s2:異なる幅のテーブル列を作成できないので、2つのテーブルを隣り合わせに配置するのが論理的ですが、テーブルが自動的に右の境界線まで拡大されるため、それができないことに気づきました。AutoXResizeModeという メソッドがありますが、まだ動作していないのでしょうか? これがfalseに設定されている場合、変更は発生しません。

テーブルの幅を設定するには、XSize() メソッドを使用します。

m_table.XSize(300);
 

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

あといくつか質問があります:

1.データが表のセルに収まらない場合、将来このセルにツールチップかティッカーを表示する予定はありますか?

2.いくつかのテーブルで水平スクロールを無効にすることは可能ですか?

p.s:

5列のテーブルを作成し、さらに表示しようとするとエラーが発生します。このオプションは馬鹿げているとは思いますが、必要です。特に、テーブルが将来的にダイナミックになる可能性がある場合は。

p.s2:表示と非表示のメソッドは完璧に機能し、その場でテーブルを変更するのではなく、必要なテーブルを表示することができます。各タブに必要なテーブルを作成し、それをラジオボタンにバインドし、それらがアクティブになると必要なものが表示され、そうでないものは非表示になります。ここではすべて機能しています。しかし、なぜか作成直後に無関係なテーブルを非表示にすることができません。このため、スクロール・バーが 正しく機能しないのだと思いますが、ラジオ・ボタンを一度クリックし、不要なものがすべて非表示になると、すべてがうまく機能し始めます。

 
Alexey Oreshkin:

1.データが表のセルに収まらない場合、将来的にこのセルにツールチップかティッカーを表示する予定はありますか?

今後のアップデートリストに追加しました。テーブル内にツールチップを表示するモードを作る予定です。

アレクセイ・オレシキン

2.いくつかのテーブルで水平スクロールを無効にすることは可能ですか?

テーブルの可視部分が全体の部分より小さい場合にスクロールバーが 表示されます。

Alexey Oreshkin

5列のテーブルを作成し、さらに表示しようとするとエラーが発生します。このオプションは馬鹿げていると思いますが、チェックは必要です。特に、将来的にテーブルがダイナミックになる可能性があるのであれば。

修正しました。次のアップデートで利用できるようになります。

アレクセイ・オレシキン

p.s2:表示と非表示の方法は完璧に機能し、その場でテーブルを変更するのではなく、必要なものを表示することができます。各タブに必要なテーブルを作り、ラジオボタンにバインドしました。ここではすべてうまくいく。しかし、なぜか作成直後に無関係なテーブルを非表示にすることができません。このため、スクロール・バーが正しく機能しないのだと思いますが、ラジオ・ボタンを一度クリックし、不要なものがすべて非表示になると、すべてがうまく機能し始めます。

タブエレメントが更新された後に非表示にしてください:

//--- アクティブなタブの項目を表示する
   m_tabs.ShowTabElements();
//--- テーブルを隠す
...

うまくいかない場合は、コードを送ってください。

 
起動時はほとんど動かないのですが、ラジオボタンを使って更新すると、すべてが正常に動き始めます。新しいタブに切り替えても、ラジオボタンをクリックするまでは同じ問題です。
アーカイブをPMに送りました。
 
Alexey Oreshkin:

起動時、スクロールバーはほとんど機能しませんが、ラジオボタンを使って更新すると、すべてが正常に機能し始めます。 アーカイブをPMに送りました。

あなたのファイルを見ました。問題ははっきりしています。表示されているテーブルの上にあるスクロールバーの 間に矛盾があります。タブを切り替えると、現在選択されているタブに割り当てられているすべての項目が見えるようになります。タブを切り替えると、現在選択されているタブに割り当てられている項目がすべて見えるようになります。下のスクリーンショットをご覧ください。わかりやすくするために、このタブの2つのテーブルの座標を変えてあります:

//---

タブの切り替えがあったことを知らせるイベントが必要だ。そして、カスタムクラスのハンドラでそれを受け取り、必要なアクションを取ることができる。あなたの場合、選択されたラジオボタンのインデックスを取得し、それに関連づけられたテーブルを表示し、他のテーブルを非表示にすることができます。

今のところ、このようなイベントはタブの切り替え時には生成されません。次回のライブラリ更新で利用可能になる予定です。

 
いつアップデートを待てばいい?