Discussão do artigo "Como criar um painel gráfico de qualquer nível de complexidade" - página 8
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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:
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á presenteComo 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).
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?
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?
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?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 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
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. 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
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