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

 

Компиляция ExampleEAF.mq5 помогла.

Я полагал, что мне нужно компилировать библиотеку, когда я хочу создавать с ее помощью собственные вещи.

Тем не менее, спасибо большое!

О, и я натыкался на эту строку кода в верхней части большинства файлов библиотек:

class CWindow;

Является ли создание "поддельного класса" каким-то трюком, чтобы избежать кошмара #include? Как впоследствии компилятор может связать правильный класс, который действительно используется?

 

Сначала бы довести до ума то что имеется... Ведь там ещё полно недоработок.

У меня вот есть замечания по архитектуре.  Задаваемые свойства объектов и отображаемая картинка живут своими жизнями, независимо друг от друга.  И требуется обязательный вызов Update(), иначе они так и останутся жить в параллельных реальностях.  Считаю, это неправильно, учитывая что у нас событийная модель.  Ручное обновление (перерисовка) не должно быть обязательным условием.  Оно лишь позволяет отобразить изменения немедленно, но все изменения в любом случае должны быть отображены.  Для этого должно отсылаться сообщение (событие) на перерисовку данного объекта, которое будет обработано позднее. 

Т.е. примерно так:

class CSomeControl
{
  int  m_property;
  bool m_changed;
  bool m_event_sent;
 public:
  void Property(int value)  { m_property= value;  m_changed=true;  if (!m_event_sent) m_event_sent= EventChartCustom(m_chart_id, ON_CHANGE, m_id, 0, 0); }  

  void Update()             { /*...Перерисовка...*/  m_changed=false; }

  void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {  
    if (id==CHARTEVENT_CUSTOM+ON_CHANGE) { m_event_sent=false;  if (m_changed) Update(); }
  }                       
};
 

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

 
Alexey Navoykov:

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

Нужно переписывать метод CWindow::UpdateWindowXY(). Он сейчас реализован таким образом, что края окна не могут выйти за пределы графика при перемещении окна.

 

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

   m_window1.ChangeWindowWidth(NEW_WIDTH);
   m_window1.Update(true);

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

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

 
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() не нахожу.

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