Обсуждение статьи "Как создать графическую панель любой сложности и как это работает" - страница 5

 
Vladimir Karputov:

Нужно чтобы все элементы панели были перерисованы - таким образом они займут самое "верхнее" положение.

Ясно, спасибо! А есть ли у класса CAppDialog встроенный метод перерисовки всех элементов? Если нет, будет ли правильной такая реализация у класса-наследника:

void CControlsDialog::Redraw(void)
  {
   this.Visible(false);
   this.Visible(true);
  }

На практике это работает, я проверил.

 
Janis Ozols:

Ясно, спасибо! А есть ли у класса CAppDialog встроенный метод перерисовки всех элементов? Если нет, будет ли правильной такая реализация у класса-наследника:

На практике это работает, я проверил.

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

 
Janis Ozols:

Ясно, спасибо! А есть ли у класса CAppDialog встроенный метод перерисовки всех элементов? Если нет, будет ли правильной такая реализация у класса-наследника:

На практике это работает, я проверил.

Насколько помню, метод Run() перерисовывает график.
 
Vasiliy Pushkaryov:
Насколько помню, метод Run() перерисовывает график.

Да, он перерисовывает график. Спасибо, попробую!

bool CAppDialog::Run(void)
  {
//--- redraw chart for dialog invalidate
   m_chart.Redraw();
//--- here we begin to assign IDs to controls
   if(Id(m_subwin*CONTROLS_MAXIMUM_ID)>CONTROLS_MAXIMUM_ID)
     {
      Print("CAppDialog: too many objects");
      return(false);
     }
//--- succeed
   return(true);
  }

UPD: Попробовал. Увы, не помогло. Видимо, этот метод перерисовывет сам график, но не панель. 
 

Пытаюсь создать вертикальную полосу прокрутки без привязки к панели, просто на графике, но она почему-то не работает.

Например, с чекбоксом такой код дает реакцию на клик мыши. Галочка появляется и исчезает.

#include <Controls\CheckBox.mqh>
CCheckBox Chbox;
//+------------------------------------------------------------------+
void OnInit()
{
  Chbox.Create(0, "MyCheckBox", 0, 20, 20, 100, 40);
  ChartRedraw();
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Chbox.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+


А с вертикальным скролом - никакой реакции на нажатия кнопок мыши.

#include <Controls\Scrolls.mqh>
CScrollV Scroll;

void OnInit()
{
  Scroll.Create(0, "MyScrollV", 0, 20, 20, 40, 200);
  ChartRedraw();
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
  Scroll.OnEvent(id, lparam, dparam, sparam);
}
//+------------------------------------------------------------------+

Подскажите, пожалуйста, кто знает, как заставить работать этот комбинированный элемент на графике?

 

Подскажите, как вызвать диалоговое окно?
Например, я создал панель, где есть кнопка "Закрыть все позиции". При нажатии на эту кнопку, должно возникать окошко "Вы уверены?" Да/Нет. Как это реализовать?

На данный момент унаследовался от CAppDialog, создал небольшую форму с кнопками Ok/Cancel. При нажатии на кнопку "Ок" добавил строку 

gDialogForm.Destroy();
ChartRedraw();

Но диалоговая форма всё равно остается на экране.
Как исправить?

 
Nextor #:

Подскажите, как вызвать диалоговое окно?
Например, я создал панель, где есть кнопка "Закрыть все позиции". При нажатии на эту кнопку, должно возникать окошко "Вы уверены?" Да/Нет. Как это реализовать?

На данный момент унаследовался от CAppDialog, создал небольшую форму с кнопками Ok/Cancel. При нажатии на кнопку "Ок" добавил строку 

Но диалоговая форма всё равно остается на экране.
Как исправить?

void OnChartEvent(const int id,         // Event ID
                  const long& lparam,   // Parameter of type long event
                  const double& dparam, // Parameter of type double event
                  const string& sparam  // Parameter of type string events
                 )
{
  // Close All Account
  if(id==CHARTEVENT_OBJECT_CLICK && StringFind(sparam,"ClosePos",0)!=-1)) {
    int MB=MessageBox("Close All Positions\nAccount Profit= "+DoubleToString(AccountInfoDouble(ACCOUNT_PROFIT),2),
                      "Close All Positions?", MB_OKCANCEL|MB_ICONQUESTION);
    if(MB==1)
      ClosePosSortProfit("", -1, -1, clrGray);
  }
}
 
Nextor #:

Подскажите, как вызвать диалоговое окно?
Например, я создал панель, где есть кнопка "Закрыть все позиции". При нажатии на эту кнопку, должно возникать окошко "Вы уверены?" Да/Нет. Как это реализовать?

На данный момент унаследовался от CAppDialog, создал небольшую форму с кнопками Ok/Cancel. При нажатии на кнопку "Ок" добавил строку 

Но диалоговая форма всё равно остается на экране.
Как исправить?

Может еще этот комментарий поможет
 
Nextor #:

Подскажите, как вызвать диалоговое окно?
Например, я создал панель, где есть кнопка "Закрыть все позиции". При нажатии на эту кнопку, должно возникать окошко "Вы уверены?" Да/Нет. Как это реализовать?

На данный момент унаследовался от CAppDialog, создал небольшую форму с кнопками Ok/Cancel. При нажатии на кнопку "Ок" добавил строку 

Но диалоговая форма всё равно остается на экране.
Как исправить?

Возьмите пример панели Close On Chart Panel и в обработчики клика вставьте вызов 'MessageBox'.

В файле 'Close On Chart Panel Dialog.mqh' внесите такие изменения:

//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton1(void)
  {
   int answer=MessageBox("Close all Sell?","Close all Sell",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.ClosePositions(POSITION_TYPE_SELL);
     }
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton2(void)
  {
   int answer=MessageBox("Close all Buy?","Close all Buy",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.ClosePositions(POSITION_TYPE_BUY);
     }
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton3(void)
  {
   int answer=MessageBox("Close all Profit?","Close all Profit",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.CloseProfitPositions();
     }
  }
//+------------------------------------------------------------------+
//| Event handler                                                    |
//+------------------------------------------------------------------+
void CControlsDialog::OnClickButton4(void)
  {
   int answer=MessageBox("Close all Loss?","Close all Loss",MB_OKCANCEL|MB_ICONQUESTION);
   if(answer==IDOK)
     {
      Print(__FUNCTION__);
      m_trading_engine.CloseLossPositions();
     }
  }


Результат:


Close On Chart Panel
Close On Chart Panel
  • www.mql5.com
Советник-утилита. Панель на базе класса CDialog. Кнопки на базе класса СButton. Четыре кнопки для закрытия BUY, SELL, всех прибыльных, всех убыточных. Работа по текущему символу
 

Здравствуйте!

Подскажите пожалуйста, почему ваша панель прекрасно работает на реальном графике, но не работает в тестере стратегий?

То есть события нажатий кнопок, к примеру, не обрабатываются.

Как исправить?

Заранее спасибо!