Библиотеки: EasyAndFastGUI - библиотека для создания графических интерфейсов - страница 8

 
Oleksii Chepurnyi:

Кстати, по поводу изменения ширины окна

В МТ5 все нормально, а вот в МТ4 вот такое

После клика на заголовке кнопки перемещаются на положеное место. Не подскажите, в какую сторону смотреть? Где реализовано перемещение этих кнопок?

Посмотрите метод Moving().

Попробуйте через указатели получить доступ к кнопкам окна и вызовите этот метод.

 
Alexey Navoykov:

Да, требуется либо пропорциональное увеличение ширины всех столбцов, либо только последнего столбца.  Второе предпочтительней.

Но в текущей версии даже самостоятельно это реализовать проблематично, т.к. я не нашёл в вашем классе метод для получения текущей ширины столбца, а все поля приватные.  В общем, как минимум этот метод необходимо добавить.

Вот так можно попробовать уже сейчас реализовать то, что Вам нужно:

//--- События изменения размеров окна
   if(id==CHARTEVENT_CUSTOM+ON_WINDOW_CHANGE_YSIZE)
     {
      //--- Корректируем ширину столбца краткой таблицы
      if(m_table_symbols.RowsTotal()>(uint)m_table_symbols.VisibleRowsTotal())
        {
         int width[]={79};
         m_table_symbols.ColumnsWidth(width);
        }
      else
        {
         int width[]={95};
         m_table_symbols.ColumnsWidth(width);
        }
      //---
      m_table_symbols.Update(true);
      m_table_symbols.GetScrollVPointer().CurrentPos(0);
      m_table_symbols.GetScrollVPointer().Update(true);
      return;
     }
 
Anatoli Kazharski:

Посмотрите метод Moving().

Попробуйте через указатели получить доступ к кнопкам окна и вызовите этот метод.

Да, то что надо :) Спасибо!

Казалось, уже все облазил, а самое очевидное пропустил :)

 
Anatoli Kazharski:

Вот так можно попробовать уже сейчас реализовать то, что Вам нужно:

Это ж просто фиксированная ширина столбца.  А речь шла о динамическом изменении ширины столбцов, исходя из их предыдущей ширины.  Впрочем я уже допилил класс, добавив туда метод  int ColumnWidth(int i)

 

Добрый день.

Проблема посерьезнее :)

Создаем динамический объект, например лейбл

   labels[i] = new CTextLabel;
   labels[i].MainPointer(m_window1);
   labels[i].XSize(SYMBOLS_COL_WIDTH);
   labels[i].YSize(HEAD_HIGHT);
   labels[i].Alpha(SYMBOLS_HEAD_BACK_ALPHA);
   labels[i].FontSize(SYMBOLS_HEAD_FONT_SIZE);
   labels[i].TextAlign(SYMBOLS_HEAD_TEXT_ALIGN,HORIZONTAL_SPACE,0);
   labels[i].FontStyle(SYMBOLS_HEAD_FONT_STYLE);
   labels[i].BackColor(SYMBOLS_HEAD_BACK_COLOR);
   labels[i].CreateTextLabel("0",x_gap,ProfitHeadGap);
   CWndContainer::AddToElementsArray(0,labels[i]);
   labels[i].Update(true);

А вот чем удалять?

Удаляю так

      labels[i].Delete();
      delete labels[i];

Но после удаления вылет, ругается на неправильный доступ к указателю.

На сколько я разобрался, CWndContainer::AddToElementsArray добавляет объект в общие массивы, но Delete() не удаляет его от туда, и окно пытается обращаться к объекту. А другого похожего на Delete() не нахожу.

Как правильно удалить объект?

 
Oleksii Chepurnyi:

Добрый день.

Проблема посерьезнее :)

Создаем динамический объект, например лейбл

...

Не тестировал библиотеку на динамическое создание объектов, поэтому не смогу сейчас подсказать. 

 

Ещё один пример приложения, GUI которого создано с помощью этой библиотеки:


 
Anatoli Kazharski:

Не тестировал библиотеку на динамическое создание объектов, поэтому не смогу сейчас подсказать. 

Так и подумал :)

Для несложных объектов написал вот такое:

//+------------------------------------------------------------------+
//| Удаляет указатель из массива элементов                           |
//+------------------------------------------------------------------+
void CWndContainer::DeleteElementsFromArray(const int window_index,const int id)
  {
   int windows_total=::ArraySize(m_windows);
//--- Если в базе нет форм для элементов управления
   if(windows_total<1)
     {
      ::Print(__FUNCTION__," > Нету ни одной формы.");
      return;
     }
//--- Если запрос на несуществующую форму
   if(window_index>=windows_total)
     {
      ::Print(PREVENTING_OUT_OF_RANGE," window_index: ",window_index,"; windows total: ",windows_total);
      return;
     }
//--- Удалим из общего массива элементов
   DeleteElement(id,m_wnd[window_index].m_elements);
//--- Удалим из массива главных элементов
   DeleteElement(id,m_wnd[window_index].m_main_elements);
//--- 
   DeleteElement(id,m_wnd[window_index].m_timer_elements);
//--- 
   DeleteElement(id,m_wnd[window_index].m_available_elements);
//--- 
   DeleteElement(id,m_wnd[window_index].m_auto_x_resize_elements);
//--- 
   DeleteElement(id,m_wnd[window_index].m_auto_y_resize_elements);
  }
//+------------------------------------------------------------------+
//| Удаляет указатель из массива элементов                           |
//+------------------------------------------------------------------+
template<typename T>
void CWndContainer::DeleteElement(const int id,T &array[])
  {
   bool del=false;
   for(int i=0;i<ArraySize(array);i++)
     {
      if(del)
        {
         if(i==ArraySize(array)-1) break;
         array[i] = array[i+1];
         continue;
        }
      if(array[i].Id()==id)
        {
         del=true;
         if(i==ArraySize(array)-1) break;
         array[i] = array[i+1];
        }
     }
   if(del) ArrayResize(array,ArraySize(array)-1,RESERVE_SIZE_ARRAY);
  }
//+------------------------------------------------------------------+
 

Подскажите , в таблице кнопка с картинкой добавляется только в первый столбик , а в остальные не работает .

Это баг или нет ?

 
Vladimir Ananich:

Подскажите , в таблице кнопка с картинкой добавляется только в первый столбик , а в остальные не работает .

Во все можно добавлять.

Причина обращения: