記事"グラフィカルインタフェースX:リストとテーブルの高度な管理コードの最適化(ビルド7)"についてのディスカッション - ページ 7

 
Anatoli Kazharski:
再現するにはデータが足りない。自分で再現できるように、完全な例を教えてください。

プライベート・メッセージで - そこに追加のクラスが必要です。

はい、それはテーブルを再構築した後に起こります。

 
Anatoli Kazharski:
再現するのに十分なデータがありません。自分で再現できるように、完全な例を添付してください。

Tol、前の質問とタンバリンのないコード例のプライベート・メッセージについて: ExpertsArticle10\TestLibrary06からあなたの例を取ってください。

タイマーのProgram.mqhに数行書いて、コンパイルして見るだけです。

//+------------------------------------------------------------------+
//| タイマー|
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//--- 要素の更新の間にポーズを入れる
   if(m_counter1.CheckTimeCounter())
     {
      //--- ステータスバーの2番目の項目を更新する
      m_status_bar.ValueToItem(1,::TimeToString(::TimeLocal(),TIME_DATE|TIME_SECONDS));
      //--- グラフを再描画する
      m_chart.Redraw();
     }
//--- 要素の更新の間にポーズを入れる
   if(m_counter2.CheckTimeCounter())
     {
      //--- 現在のシンボルの価格値を最初の行の「Price」に入力する。
      MqlTick tick;

      if(SymbolInfoTick(Symbol(),tick))
        {
         int dg=(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);
         m_table.SetValue(1,1,DoubleToString(tick.bid,dg),dg);
         m_table.UpdateTable();
        }

      //--- 総数が指定された数より少ない場合、テーブルに行を追加する。
      if(m_table.RowsTotal()<m_spin_edit1.GetValue())
         m_table.AddRow();
      //--- カラムの総数が指定された数より少ない場合、テーブルにカラムを追加する。
      if(m_table.ColumnsTotal()<m_spin_edit2.GetValue())
         m_table.AddColumn();
      //--- 総数が指定された数より少ない場合、リストに項目を追加する。
      if(m_listview.ItemsTotal()<m_spin_edit5.GetValue())
        {
         m_listview.AddItem("SYMBOL "+string(m_listview.ItemsTotal()));
         //--- スクロール・バーのスライダーをリストの最後に移動する。
         m_listview.Scrolling();
        }
      //--- 総数が指定された数より少ない場合、チェックボックスからリストに項目を追加する
      if(m_checkbox_list.ItemsTotal()<m_spin_edit5.GetValue())
        {
         m_checkbox_list.AddItem("Checkbox "+string(m_checkbox_list.ItemsTotal()));
         //--- スクロール・バーのスライダーをリストの最後に移動する。
         m_checkbox_list.Scrolling();
        }
      //--- グラフを再描画する
      m_chart.Redraw();
     }
  }
//+------------------------------------------------------------------+

テーブルを更新する行が なければ、最初の行の最初の列に価格はない。もしあれば、価格は入力され変更されますが、テーブルは常に再描画され、もはや作業することはできません。

表の多くの行をリアルタイムで更新する必要がある場合はどうすればよいですか?(シンボルが多数あり、それぞれに現在の 価格を表示する必要がある場合)

 
Artyom Trishkin:

Tol、前の質問と、タンバリンのないコード例を使った個人的なメッセージについて: ExpertsArticle10にあるあなたの例を見てください。

タイマーのProgram.mqhに数行書いて、コンパイルして見てください。

...

テーブル更新の行が なければ、最初の行の最初の列に価格はない。もしあれば、価格は入力され、変更されますが、テーブルは常に再描画され、もはやそれを使って作業することはできません。

表の多くの行をリアルタイムで更新する必要がある場合はどうすればよいですか?(多くのシンボルがあり、それぞれに現在の 価格を表示する必要があります)。

おそらく(一見したところ)、CTable::SetValue()メソッドを少し修正して、表全体ではなく、指定したセル(可視領域にある場合)だけを更新して値を変更できるようにする必要があるでしょう。

今の記事を書き終えたら見てみるよ。

追伸 :ハイライトされた行の点滅も修正します。

 
Anatoli Kazharski:

おそらく(一見したところ)、CTable::SetValue()メソッドを少し修正して、テーブル全体ではなく、指定したセルだけを更新して(可視領域にある場合)値を変更できるようにする必要があるでしょう。

今の記事が終わったら見てみるよ。

追伸: ハイライトされた行の点滅も修正します。

今すぐ」できる「迅速な」解決策はありますか?
 
Artyom Trishkin:
手っ取り早い "解決策はありません。"今すぐ "でしょうか?

選択したテーブル行が点滅しないようにするには、最後のループでCTable::UpdateTable()メソッドに以下の行を 追加します:

//--- コラム
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- 垂直スクロールバー・スライダーの現在位置を取得する。
      v=m_scrollv.CurrentPos()+t;
      //--- 行
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- オフセット・テーブル・データ
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- ハイライトされた行の調整
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];

            //--- セルの (1) 値、(2) 背景色、(3) 文字色、(4) 文字揃えを調整する。
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }

//---

そして、残りの部分については、さらに詳細が必要です。

Artyom Trishkin です:

新しいティックを受信するたびにテーブルを更新すると、テーブルが点滅し、選択した行が点滅 するなど、テーブルを操作することが不可能になります。

これは何ですか?:

  1. pr.
  2. pr.
  3. pr...
 
Anatoli Kazharski:

ハイライトされた行が点滅しないようにするには、最後のループでCTable::UpdateTable()メソッドに以下の行を 追加する:

//--- コラム
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- 垂直スクロールバー・スライダーの現在位置を取得する。
      v=m_scrollv.CurrentPos()+t;
      //--- 行
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- オフセット・テーブル・データ
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- ハイライトされた行の調整
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];

            //--- セルの (1) 値、(2) 背景色、(3) 文字色、(4) 文字揃えを調整する。
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }

//---

そして、残りの部分については、さらに詳細が必要です。

これは何ですか?:

  1. Ave.
  2. pr
  3. pr--。
コードの訂正、そして「pr、pr、pr、pr」についてありがとう。- maybe I was in a hurry to write it that way ;)訂正がどうなるか、どうなるかを見てから、また報告するよ。ただ、ひとつ言えることは、テーブル全体が更新される、ということだ。そのため、テーブル全体を更新するときに点滅が目立つことがある。
 
Anatoli Kazharski:

ハイライトされた行が点滅しないようにするには、最後のループのCTable::UpdateTable()メソッドに以下の行を 追加する:

//--- コラム
   for(uint c=l; c<m_visible_columns_total; c++)
     {
      //--- 垂直スクロールバー・スライダーの現在位置を取得する。
      v=m_scrollv.CurrentPos()+t;
      //--- 行
      for(uint r=t; r<m_visible_rows_total; r++)
        {
         //--- オフセット・テーブル・データ
         if(v>=t && v<m_rows_total && h>=l && h<m_columns_total)
           {
            //--- ハイライトされた行の調整
            color back_color=(m_selected_item==v) ? m_selected_row_color : m_vcolumns[h].m_cell_color[v];
            color text_color=(m_selected_item==v) ? m_selected_row_text_color : m_vcolumns[h].m_text_color[v];

            //--- セルの (1) 値、(2) 背景色、(3) 文字色、(4) 文字揃えを調整する。
            SetCellParameters(c,r,m_vcolumns[h].m_vrows[v],back_color,text_color,m_vcolumns[h].m_text_align[v]);
            v++;
           }
        }
      //---
      h++;
     }

いいえ、動作は何も変わっていません。マウス・カーソルがテーブルの上にある場合は点滅し、マウス・カーソルがウィンドウの外にある場合は、行の選択は表示されません。
 
Artyom Trishkin:
いいえ、動作は何も変わっていません。マウスカーソルがテーブルの上にある場合は点滅し、マウスカーソルがウィンドウの外にある場合は、行の選択はまったく表示されません。
これは私の変更とは異なります。あなたがテストするよう提案した例では、ハイライトされた行は点滅しなくなりました。
 
Anatoli Kazharski:
私が行った変更では、このようなことは見られません。あなたがテストするよう提案した例では、ハイライトされた行が点滅しなくなりました。
トール、その例を見てみるよ。僕のプログラムでは一通り見たんだけど、今は逃げなきゃいけないんだ。戻ってきたら、また返事を書くよ。
 
Artyom Trishkin:
トール、その例を見てみるよ。プログラムには目を通したんだけど、今は逃げなきゃならないんだ。戻ってきたら、また返事を書くよ。
わかった。ここで始めた例の続きを後でやりましょう。問題が出始めるレベルまで完成させてください。