Discussão do artigo "Como criar um painel gráfico de qualquer nível de complexidade" - página 8

 
Alexander:

Olá!

Tenho uma dúvida: gostaria de criar várias guias no painel de negociação, ou seja, ao pressionar um botão, aparece um conjunto de itens e, ao pressionar outro botão, aparece outro conjunto de itens. Para ocultar elementos de uma guia, apliquei a propriedade Hide() para esse elemento no manipulador de eventos onClick do botão da guia, e o elemento não fica mais visível no painel, mas não perde suas propriedades e, se você clicar no local onde esse elemento estava, o onEvent() do painel aceitará esse evento. Pergunta - como fazer com que o elemento oculto também não reaja a nenhuma ação do usuário. Tentei ativar a propriedade Element.Disable() novamente no método onClick da guia do botão, mas nada acontece, o elemento reagiu ao clique do botão, portanto ainda reage, embora esteja invisível. Como desativá-lo programaticamente ao clicar em uma guia e ativá-lo programaticamente ao clicar em outra guia?

Tente corrigir a biblioteca de controle: há uma linha faltando no início do método OnMouseEvent no arquivo Wnd.mqh:

if(!IS_ENABLED || !IS_VISIBLE) return false;

Os detalhes estão descritos no artigo(Application of OLAP in Trading (Part 2) - o artigo é sobre OLAP, mas há uma seção sobre GUI em que o problema acima é abordado):

No estado minimizado, o botão "redimensionar" fica oculto e inativo. O problema está no método CWnd::OnMouseEvent. Ele não tem essa verificação:

  // if(!IS_ENABLED || !IS_VISIBLE) return false; - essa linha não está presente

Como resultado, até mesmo os "controles" desativados e invisíveis interceptam eventos. Obviamente, o problema poderia ser resolvido com a definição da ordem Z apropriada dos controles. Entretanto, mesmo aqui encontramos uma falha: a biblioteca não leva em conta a ordem Z dos elementos. Em particular, se você observar o método CWndContainer::OnMouseEvent, verá um simples loop em ordem inversa por todos os elementos subordinados, sem tentar determinar sua prioridade pela ordem Z.

Portanto, é necessário outro "patch" da biblioteca ou algum "truque" em uma classe derivada.

Em princípio, há muita coisa que precisa ser corrigida na biblioteca de controle padrão. É por isso que uma implementação alternativa, já corrigida, do ControlsPlus foi escrita - você pode obtê-la na íntegra no artigo MQL como um meio de marcar a interface gráfica dos programas MQL. Parte 2 (se você estiver interessado, há as partes 1 e 3).

Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
Язык MQL как средство разметки графического интерфейса MQL-программ. Часть 2
  • www.mql5.com
В первой части публикации мы рассмотрели базовые принципы описания раскладки графического интерфейса MQL-программ на языке MQL. Для их реализации потребовалось создать несколько классов, отвечающих непосредственно за инициализацию интерфейсных элементов, их объединение в общую иерархию и настройку свойств. Сейчас мы готовимся перейти к более...
 
Stanislav Korotky:

Tente corrigir a biblioteca de controle: o arquivo Wnd.mqh está sem uma linha no início do método OnMouseEvent:

Os detalhes estão descritos no artigo(Application of OLAP in Trading (Part 2) - o artigo é sobre OLAP, mas há uma seção sobre GUI, onde o problema acima é abordado):

Basicamente, há muitas coisas na biblioteca de controle padrão que precisariam ser ajustadas. É por isso que uma implementação alternativa, já corrigida, do ControlsPlus foi escrita - você pode obtê-la na íntegra no artigo MQL como um meio de marcar a GUI dos programas MQL. Parte 2 (se você estiver interessado, há as partes 1 e 3).

Obrigado, vamos tentar.

 

Como escrever/transmitir texto para o CLabel a partir do OnTick?

class CControlsDialog : public CAppDialog
{
private:
CLabel m_label;// Objeto CLabel

.....

void OnTick()
{

m_label.Text(DoubleToString(Ask,4));

....

Recebo um erro

'm_label' - identificador não declarado ...

o que está errado?

Документация по MQL5: Стандартная библиотека / Панели и диалоги / CLabel
Документация по MQL5: Стандартная библиотека / Панели и диалоги / CLabel
  • www.mql5.com
//|                                                ControlsLabel.mq5 | //|                        Copyright 2017, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| defines                                                          |  INDENT_LEFT                         (11)      ...
 
Renat Akhtyamov:

Como escrever/transmitir texto para o CLabel a partir do OnTick?

Recebo o erro

'm_label' - identificador não declarado ...

o que está errado?

Você fez a vinculação ao gráfico, às coordenadas etc., como na função CreateLabel() mostrada aqui na ajuda?

 
Vasiliy Pushkaryov:

E a vinculação ao gráfico, às coordenadas etc., como em CreateLabel(), é mostrada aqui na ajuda.

Sim

Se você escrever texto no objeto ali mesmo, tudo estará bem.

Mas se eu tentar escrevê-lo no OnTick, ele falhará.

Você não precisa recriar o objeto a cada tick, precisa?
 
Renat Akhtyamov:

sim

Se você escrever texto no objeto ali mesmo, tudo estará bem.

Mas se eu tentar escrevê-lo no OnTick, ele falhará.

Você não precisa recriar o objeto a cada tique, precisa?
E se m_label for movido para a seção pública ?
 
Vasiliy Pushkaryov:
E se o m_label for movido para a seção pública ?

Tentei isso e o erro foi o mesmo.

O problema é que estou fazendo isso no 4pc.

Acho que esse é o problema.

Além disso, este não funciona, embora seja compilado.

m_scroll_v1. Disable(); (Estou tentando trocar os botões de rádio, é interessante mudar a interface). Destroy() funciona, mas Disable não quer fazer isso

 
Renat Akhtyamov:

experimentado

O problema é que estou fazendo isso em um 4RK.

Acho que esse é o problema.

Além disso, este não funciona, embora seja compilado.

m_scroll_v1. Disable(); (Estou tentando trocar os botões de rádio, é interessante mudar a interface). Destroy() funciona, mas Disable não quer fazer isso

Tudo funciona no 4. E o objeto que você definiu. A chamada a partir dele deve ser feita, como Panel.m_label.Text( "Max.Margin").
 
Vasiliy Pushkaryov:
Tudo funciona no 4. E o objeto que você definiu. Deve ser feita uma chamada a partir dele, como Panel.m_label.Text( "Max.Margin").

Funciona assim.

Obrigado!

Eu adicionei o pai primeiro, depois o movi para público e funciona.

e este é o m_scroll_v1. Disable(); ainda não funciona

 
Renat Akhtyamov:

Funciona da seguinte forma

Obrigado!

Adicionei o pai primeiro, depois o movi para público e funciona

e este m_scroll_v1. Disable(); ainda não funciona

Ainda não encontrei esse problema. Não sei. Stanislav responde a uma das perguntas na 27ª postagem deste tópico. A desativação da biblioteca padrão também é abordada lá, dê uma olhada.