記事"グラフィカルインターフェイスX:ソート、テーブル再構築とセル内のコントロール(ビルド11)"についてのディスカッション - ページ 9

 
Anatoli Kazharski:
何の整列?

写真を表示するには、AddRowメソッドを呼び出した後、テーブル・セル 内のテキストを整列させる必要があります。
 
Konstantin:

画像を表示するには、AddRowメソッドを呼び出した後に、テーブル・セル内のテキストを整列させる必要がある。

テキストはデフォルトで列全体に対して揃えられる。行を追加(AddRow)してもデフォルト値は変わりません。

このようなメソッドもあります:

CCanvasTable::TextAlign(const ENUM_ALIGN_MODE &array[])
 
Anatoli Kazharski:
テキストはデフォルトで列全体に対して整列されます。行を追加(AddRow)しても、デフォルト値は変わりません。


そのため、追加された行に 画像が表示されない理由は不明です:

      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         //--- 写真の配列
         string _image[3]= { "::Images\\EasyAndFastGUI\\Icons\\bmp16\\circle_gray.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_up.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_down.bmp" };
         a_table.SetImages(1, r, _image);
      }
 
Konstantin:

ちなみに、表の行数が事前にわからない場合、後から行数を追加すると、セルには情報が追加されるが、画像のある列のアライメントは変更できない:

何か他の仕組みがあるのかもしれませんが、教えてください。

表に行を追加 する関数を作りました:それは、作業シンボル(メイン表に表示されるべきもの)のリストと表にチェックが入っているシンボルに関するデータをファイルから読み込み、表に追加します:

//+------------------------------------------------------------------+
//| データ・テーブルに行を追加する。
//+------------------------------------------------------------------+
void CProgram::AddSymbolToTableMain(void){
   string img_butt0[1];    img_butt0[0]=m_img_graphic;
   string img_butt8[1];    img_butt8[0]=m_img_buy;
   string img_butt9[1];    img_butt9[0]=m_img_sell;
   string img_butt10[1];   img_butt10[0]=m_img_close;
   //---
   uint sz_used=FillingListUsedSymbols();       // チェックを入れた文字でファイルを埋める
   uint row=m_table_main.RowsTotal();
   string sy=m_symbol;
   for(ushort i=0; i<sz_used; i++) {
      sy=m_array_data_symbols[i].symbol_name;
      short index=IndexSymbolInTableMain(sy);   // メイン・テーブルのシンボル・インデックス
      //--- シンボルがまだテーブルに存在しない場合
      if(index==WRONG_VALUE) {               
         m_table_main.AddRow(i);                // テーブルに行を追加する。
         }
      //--- テーブルのカラム・パラメータを設定する
      m_table_main.CellType(0,i,CELL_BUTTON);
      m_table_main.SetImages(0,i,img_butt0);
      m_table_main.CellType(8,i,CELL_BUTTON);
      m_table_main.SetImages(8,i,img_butt8);
      m_table_main.CellType(9,i,CELL_BUTTON);
      m_table_main.SetImages(9,i,img_butt9);
      m_table_main.CellType(10,i,CELL_BUTTON);
      m_table_main.SetImages(10,i,img_butt10);
      //---
      m_table_main.SetValue(0,i,sy,0);
      m_table_main.TextColor(0,i,(SymbolInfoInteger(sy,SYMBOL_TRADE_MODE)==SYMBOL_TRADE_MODE_DISABLED ? NewColor(clrRed,100,100,100) : 
                                  SymbolInfoInteger(sy,SYMBOL_TRADE_MODE)==SYMBOL_TRADE_MODE_FULL ?     NewColor(clrDimGray,0,50,0) : clrLightGray));
      for(uchar c=2; c<m_table_main.ColumnsTotal(); c++) m_table_main.TextColor(c,i,clrDimGray);
      }
   m_table_main.UpdateTable(true);
   CreateClasses();
}
//+------------------------------------------------------------------+


 
Artyom Trishkin:

表に行を追加 する関数を作りました:それは、作業文字のリスト(メインの表に出力されるべきもの)と共に、表にチェックを入れた文字に関するデータをファイルから読み込み、表に追加します:

いい例だ。手伝いたいけど、時間がないんだ。)

これまでの議論に基づき、テーブル・パラメーターを変更するための、よりシンプルな方法を追加する予定です。近日中にアップデートを行います。

 
Artyom Trishkin:

表に行を追加 する関数を作りました:それは、作業シンボル(メイン表に表示されるべきもの)のリストと表にチェックが入っているシンボルに関するデータをファイルから読み込み、表に追加します:


私は何も理解していません。私は同じことをしますが、すべてのデータが追加され、更新されているにもかかわらず、画像は表示されません:

/*!
 ■テーブル値の更新
 ■param CWrapTradePair &a_pair - シグナルデータを格納した配列へのポインタ
 ■param CCanvasTable &a_table - テーブルオブジェクト
*/.
void CTblSignal::UpdateTable(CWrapTradePair &a_pair,CCanvasTable &a_table) {
   MqlDateTime _date;
   ::TimeToStruct(::TimeTradeServer(), _date);

   //--- 週末のチェック
   if(_date.day_of_week == 0 || _date.day_of_week == 6)
      return;

   //--- データをテーブルに分解する。
   uint _count = 0;
   for(uint r = 0, _size = a_pair.Size(); r < _size; ++r) {
      if(!a_pair[r].coint)
         continue;

      _count++;
      //--- 行数が足りない場合は、テーブル構造を追加・更新する。
      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         a_table.CellType(1, r, CELL_BUTTON);

         //--- 写真の配列
         string _image[3]= { "::Images\\EasyAndFastGUI\\Icons\\bmp16\\circle_gray.bmp",
                             "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_up.bmp",
                             "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_down.bmp" };
         a_table.SetImages(1, r, _image);
      }

      if(a_pair[r].event == COINT_BS_NOISE || a_pair[r].event == COINT_SB_NOISE) {
         //--- "ティッカー"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_NOISE, true);
         //--- "シグナル"
         a_table.ChangeImage(1, _count - 1, 0, true);
         //--- "DF-test"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_NOISE, true);
         //--- "デルタ%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_NOISE, true);
      } else if(a_pair[r].event == COINT_BS || a_pair[r].event == COINT_SB) {
         //--- "ティッカー"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_BSSB, true);
         //--- "シグナル"
         a_table.ChangeImage(1, _count - 1, 1, true);
         //--- "DF-test"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_BSSB, true);
         //--- "デルタ%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_BSSB, true);
      } else {
         //--- "ティッカー"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_NOT, true);
         //--- "シグナル"
         a_table.ChangeImage(1, _count - 1, 2, true);
         //--- "DF-test"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_NOT, true);
         //--- "デルタ%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_NOT, true);
      }
   }

//--- テーブルに余分な行がないかチェックする
   for(uint r = _count, _size = a_table.RowsTotal(); r < _size; ++r)
      a_table.DeleteRow(r, true);

//--- テーブルの更新
   a_table.UpdateTable();
}


何がエラーなのでしょうか、教えてください。)

 
Konstantin:

私は何も理解していない、私は同じことをやっているが、すべてのデータが追加され、更新されているにもかかわらず、画像が表示されません:


何がエラーになるのでしょうか?)

そして、あなたはどこに写真を持つ列の整列を設定するのですか?

各列にアライメントが設定されている配列があるはずです。

 
テストしてみたところ、TableSize メソッドであらかじめ設定した行数にすべてが依存していることに気づいた。
 
Artyom Trishkin:
画像付きカラムのアライメントはどこで設定するのですか?


私はテーブルの作成 メソッドでそれを行うが、私はこのように追加した場合:

/*!
 ■テーブル値の更新
 ■param CWrapTradePair &a_pair - シグナルデータを格納した配列へのポインタ
 ■param CCanvasTable &a_table - テーブルオブジェクト
*/.
void CTblSignal::UpdateTable(CWrapTradePair &a_pair,CCanvasTable &a_table) {
   //--- データをテーブルに分解する。
   uint _count = 0;
   for(uint r = 0, _size = a_pair.Size(); r < _size; ++r) {
      if(!a_pair[r].coint)
         continue;

      _count++;
      //--- 行数が足りない場合は、テーブル構造を追加・更新する。
      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);

         //--- 列単位のテキスト配置の配列
         ENUM_ALIGN_MODE _align[TBL_COLUMNS_TOTAL];
         ::ArrayInitialize(_align, ALIGN_RIGHT);
         _align[1] = ALIGN_LEFT;
         m_table.TextAlign(_align);

         a_table.CellType(1, r, CELL_BUTTON);

         //--- 写真の配列
         string _image[3]= { "::Images\\EasyAndFastGUI\\Icons\\bmp16\\circle_gray.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_up.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_down.bmp" };
         a_table.SetImages(1, r, _image);
      }

      if(a_pair[r].event == COINT_BS_NOISE || a_pair[r].event == COINT_SB_NOISE) {
         //--- "ティッカー"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_NOISE, true);
         //--- "シグナル"
         a_table.ChangeImage(1, _count - 1, 0, true);
         //--- "DF-テスト"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_NOISE, true);
         //--- "デルタ%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_NOISE, true);
      } else if(a_pair[r].event == COINT_BS || a_pair[r].event == COINT_SB) {
         //--- "ティッカー"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_BSSB, true);
         //--- "シグナル"
         a_table.ChangeImage(1, _count - 1, 1, true);
         //--- "DF-テスト"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_BSSB, true);
         //--- "デルタ%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_BSSB, true);
      } else {
         //--- "ティッカー"
         a_table.SetValue(0, _count - 1, a_pair[r].ticker[0] + "_" + a_pair[r].ticker[1]);
         a_table.TextColor(0, _count - 1, TBL_INFO_DATA_NOT, true);
         //--- "シグナル"
         a_table.ChangeImage(1, _count - 1, 2, true);
         //--- "DF-テスト"
         a_table.SetValue(2, _count - 1, ::DoubleToString(a_pair[r].adf_pvalue, 3));
         a_table.TextColor(2, _count - 1, TBL_INFO_DATA_NOT, true);
         //--- "デルタ%"
         a_table.SetValue(3, _count - 1, ::DoubleToString(a_pair[r].delta, 0));
         a_table.TextColor(3, _count - 1, TBL_INFO_DATA_NOT, true);
      }
   }

//--- テーブルに余分な行がないかチェックする
   for(uint r = _count, _size = a_table.RowsTotal(); r < _size; ++r)
      a_table.DeleteRow(r, true);

//--- テーブルの更新
   a_table.UpdateTable(true);
}

を追加しても何も変わりません。

 

問題は解決しました。インデックス作成にミスがありました:

      if(a_table.RowsTotal() < _count) {
         a_table.AddRow(_count - 1, true);
         
         //--- делать дополнительно выравнивание не нужно, все сохраняется от первой строки

         a_table.CellType(1, _count - 1, CELL_BUTTON);

         //--- 写真の配列
         string _image[3]= { "::Images\\EasyAndFastGUI\\Icons\\bmp16\\circle_gray.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_up.bmp",
                       "::Images\\EasyAndFastGUI\\Icons\\bmp16\\arrow_down.bmp" };
         a_table.SetImages(1, _count - 1, _image);
      }