Обсуждение статьи "Графические интерфейсы X: Расширенное управление списками и таблицами. Оптимизация кода (build 7)" - страница 11

 
Juer:

Спасибо. Только там сортировку не учитывает. 

При сортировке строки могут менять свое положение...

Вы можете контролировать сортировку самостоятельно. Для этого есть публичный метод CTable::SortData().

Пример и последняя версия класса CTable здесь: Обновления библиотеки EasyAndFast

 
Anatoli Kazharski:

Вы можете контролировать сортировку самостоятельно. Для этого есть публичный метод CTable::SortData().

Пример и последняя версия класса CTable здесь: Обновления библиотеки EasyAndFast

Всё равно непонятно. Нет метода определить сколько строк в таблице непустых. Я выгружаю в таблицу информацию по открытым ордерам. Ордера могут появляться или закрываться. Мне надо перебирать все значения каждый раз в таблице и сравнивать по тикету... Неудобно, но можно.

А ещё не подскажите с сортировкой. Надо сделать в таблице строку аналог того что на вкладке Торговля. Строка, суммирующая прибыль по открытым позициям, комиссии и др. То есть, столбцы у этой строки будут те же, что и в таблице, только с суммарными значениями. Так вот, как мне эту строку поставить первой в списке и чтоб к ней не применялась сортировка?

 
Juer:

Всё равно непонятно. Нет метода определить сколько строк в таблице непустых. Я выгружаю в таблицу информацию по открытым ордерам. Ордера могут появляться или закрываться. Мне надо перебирать все значения каждый раз в таблице и сравнивать по тикету... Неудобно, но можно.

...

Сами проходите по строкам и смотрите, пустые они или нет.

В статье Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II) подробно показано, как это может быть реализовано.

Juer:

...

А ещё не подскажите с сортировкой. Надо сделать в таблице строку аналог того что на вкладке Торговля. Строка, суммирующая прибыль по открытым позициям, комиссии и др. То есть, столбцы у этой строки будут те же, что и в таблице, только с суммарными значениями. Так вот, как мне эту строку поставить первой в списке и чтоб к ней не применялась сортировка?

В библиотеке нет такой возможности. Как вариант, можно над первой таблицей создать вторую таблицу без заголовков с одной строкой и в неё выводить суммарные значения.

 
Anatoli Kazharski:

Сами проходите по строкам и смотрите, пустые они или нет.

В статье Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II) подробно показано, как это может быть реализовано.

В библиотеке нет такой возможности. Как вариант, можно над первой таблицей создать вторую таблицу без заголовков с одной строкой и в неё выводить суммарные значения.

В примере в статье опять же количество строк постоянное, а у меня динамичекое. Но понял, руками так руками, чего ж тут. 

Вторая таблица сверху решение неплохое, но как быть с изменением ширины колонок в основной таблице?.. Как синхронизировать со второй?

Ещё вопрос. Если у меня первый столбец просто обозначает порядковый номер записи. Он сортировке не подлежит. Есть способ сделать определенный столбец несортируемым?

 
Juer:

В примере в статье опять же количество строк постоянное, а у меня динамичекое. Но понял, руками так руками, чего ж тут. 

Где Вы там увидели постоянное количество строк? Количество позиций и количество используемых символов изменяется и эти изменения отражаются в таблицах.


Juer:

Вторая таблица сверху решение неплохое, но как быть с изменением ширины колонок в основной таблице?.. Как синхронизировать со второй?

Ещё вопрос. Если у меня первый столбец просто обозначает порядковый номер записи. Он сортировке не подлежит. Есть способ сделать определенный столбец несортируемым?

Нет, таких возможностей нет.

 
Anatoli Kazharski:

Где Вы там увидели постоянное количество строк? Количество позиций и количество используемых символов изменяется и эти изменения отражаются в таблицах.

Честно говоря, не очень понял, как вы обновляете позиции там. Я вижу, что для обновления таблицы символов вы просто удаляете все строки. А как обновляется таблица позиций пока не пойму:

//+------------------------------------------------------------------+
//| Установить значения в таблицу позиций                            |
//+------------------------------------------------------------------+
void CProgram::SetValuesToPositionsTable(string &symbols_name[])
  {
//--- Проверка на выход из диапазона
   uint symbols_total =::ArraySize(symbols_name);
   uint rows_total    =m_table_positions.RowsTotal();
   if(symbols_total<rows_total)
      return;
//--- Получим в таблицу показатели
   for(uint r=0; r<rows_total; r++)
     {
      int    positions_total =PositionsTotal(symbols_name[r]);
      double pos_volume      =PositionsVolumeTotal(symbols_name[r]);
      double buy_volume      =PositionsVolumeTotal(symbols_name[r],POSITION_TYPE_BUY);
      double sell_volume     =PositionsVolumeTotal(symbols_name[r],POSITION_TYPE_SELL);
      double pos_profit      =PositionsFloatingProfitTotal(symbols_name[r]);
      double buy_profit      =PositionsFloatingProfitTotal(symbols_name[r],POSITION_TYPE_BUY);
      double sell_profit     =PositionsFloatingProfitTotal(symbols_name[r],POSITION_TYPE_SELL);
      double average_price   =PositionAveragePrice(symbols_name[r]);
      string deposit_load    =::DoubleToString(DepositLoad(false,average_price,symbols_name[r],pos_volume),2)+"/"+
                              ::DoubleToString(DepositLoad(true,average_price,symbols_name[r],pos_volume),2)+"%";
      //--- Установим значения
      m_table_positions.SetValue(0,r,symbols_name[r]);
      m_table_positions.SetValue(1,r,(string)positions_total);
      m_table_positions.SetValue(2,r,::DoubleToString(pos_volume,2));
      m_table_positions.SetValue(3,r,::DoubleToString(buy_volume,2));
      m_table_positions.SetValue(4,r,::DoubleToString(sell_volume,2));
      m_table_positions.SetValue(5,r,::DoubleToString(pos_profit,2));
      m_table_positions.SetValue(6,r,::DoubleToString(buy_profit,2));
      m_table_positions.SetValue(7,r,::DoubleToString(sell_profit,2));
      m_table_positions.SetValue(8,r,deposit_load);
      m_table_positions.SetValue(9,r,::DoubleToString(average_price,(int)::SymbolInfoInteger(symbols_name[r],SYMBOL_DIGITS)));
      //--- Установим цвет
      m_table_positions.TextColor(3,r,(buy_volume>0)? clrBlack : clrLightGray);
      m_table_positions.TextColor(4,r,(sell_volume>0)? clrBlack : clrLightGray);
      m_table_positions.TextColor(5,r,(pos_profit!=0)? (pos_profit>0)? clrGreen : clrRed : clrLightGray);
      m_table_positions.TextColor(6,r,(buy_profit!=0)? (buy_profit>0)? clrGreen : clrRed : clrLightGray);
      m_table_positions.TextColor(7,r,(sell_profit!=0)?(sell_profit>0)? clrGreen : clrRed : clrLightGray);
     }
  }

Не пойму я чего-то. Если символов меньше чем строк в таблице, то вы просто не обновляете что ли?

Мне надо обновлять значения фактически по каждому тику. Насколько правильно будет каждый раз удалять все строки и заполнять таблицу заново?

 

Juer:

Мне надо обновлять значения фактически по каждому тику. Насколько правильно будет каждый раз удалять все строки и заполнять таблицу заново?

Если просто нужно обновить значения, то ничего удалять не нужно.

Если нужно изменить количество строк в таблице, то показан один из способов, как это можно сделать. 

Второй способ это воспользоваться методом CTable::Rebuilding(). Но тогда нужно будет устанавливать заново некоторые свойства таблицы (заголовки, ширина столбцов и т.д.).

 
Anatoli Kazharski:

Если просто нужно обновить значения, то ничего удалять не нужно.

Если нужно изменить количество строк в таблице, то показан один из способов, как это можно сделать. 

Второй способ это воспользоваться методом CTable::Rebuilding(). Но тогда нужно будет устанавливать заново некоторые свойства таблицы (заголовки, ширина столбцов и т.д.).

Спасибо, посмотрю еще раз.

Но у меня CCanvasTable. А какая разница вообще между CCanvasTable и CTable? Вроде, я и с CCanvasTable создаю таблицу нормально..

 
Juer:

Спасибо, посмотрю еще раз.

Но у меня CCanvasTable. А какая разница вообще между CCanvasTable и CTable? Вроде, я и с CCanvasTable создаю таблицу нормально..

Скачайте последнюю версию библиотеки: EasyAndFast и обновлённые файлы с классами в этой статье: Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)

Используйте класс CTable. CCanvasTable совсем старая версия с минимальными возможностями. 

 
Juer:

Скачал, но что-то не могу найти метод IsSortedColumnIndex() или его аналог.

...обновлённые файлы с классами в этой статье: Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)

Класс CTable:

   //--- (1) Текущее направление сортировки, (2) индекс отсортированного массива
   int               IsSortDirection(void)             const { return(m_last_sort_direction);    }
   int               IsSortedColumnIndex(void)         const { return(m_is_sorted_column_index); }
Причина обращения: