Discussão do artigo "Como criar um painel de informações para exibir dados em indicadores e Expert Advisors" - página 2

 
Artyom Trishkin #:

Olá.

Então.

uma variável de ponteiro para um futuro objeto novo e criado dinamicamente da classe é declarada e imediatamente inicializada com o valor NULL.


Uma instância simples de uma classe é declarada da seguinte forma:

Mas, nesse caso, não é possível declarar e criar uma instância dessa forma - a classe não tem um construtor sem parâmetros formais.

Portanto, ao declarar uma instância dessa forma, é necessário especificar todos os parâmetros necessários do objeto da classe, que devem ser passados para o construtor da classe:

------------------------

No exemplo de trabalho com a classe, primeiro um ponteiro vazio para o objeto futuro é criado no indicador e, em seguida, em OnInit(), o objeto do painel é criado, onde o ponteiro para o objeto criado é gravado na variável do ponteiro:


Em seguida, em OnDeinit(), o objeto é excluído da memória por esse ponteiro:

Se você simplesmente criasse um novo objeto por meio do operador new sem gravar um ponteiro para o objeto criado em uma variável, não seria possível excluí-lo posteriormente, o que resultaria em um vazamento de memória.

Portanto, em resumo, no exemplo do artigo

  1. declare um ponteiro de variável para o objeto de classe futuro e inicialize-o com o valor NULL,
  2. criamos um novo objeto de classe e gravamos o ponteiro para ele na variável de painel criada anteriormente,
  3. ao acessar o objeto criado, usamos a variável ponteiro e um ponto ( dashboard.AnyMethod() )
  4. no final do trabalho, exclua o objeto de classe criado dinamicamente pelo ponteiro para ele.

Se a instância necessária da classe (dashboard CDashboard) tivesse sido criada imediatamente, não seriam necessários ponteiros para ela - ela teria sido acessada da mesma forma usando o operador "point". E não haveria necessidade de excluí-lo quando o trabalho estivesse concluído - o subsistema do terminal faz isso sozinho. Mas essa seria a única instância da classe no programa.

A criação dinâmica permite que você crie novos objetos da classe necessária em tempo real e faça referência a eles por meio de um ponteiro. É por isso que a criação dinâmica de um objeto de classe foi usada no exemplo. Simplificado, sem cobrir alguns pontos.

Obrigado pela resposta abrangente! Portanto, para cada objeto, seu próprio construtor, em outro caso, objeto com argumentos solicitados da classe, em qualquer estágio, você pode criar objetos diferentes! (Nus fica um pouco mais claro).

Na verdade, é interessante criar um painel de informações, pois isso é uma consequência do DPI do monitor, no meu caso 168. Comment(); é muito pequeno!

Há o TerminalInfoInteger(TERMINAL_SCREEN_DPI) que quero criar levando em conta a resolução... e quero criar por grupo de cores, por conveniência.

Talvez você tenha essa solução? Seu código é bom, legível... Eu, por outro lado, é longo, incompreensível e, como resultado, tenho que reescrever tudo várias vezes! Obrigado por seu apoio!

 
Igor Bakhrushen #:

Obrigado pela resposta abrangente! Assim, cada objeto tem seu próprio construtor; no outro caso, o objeto com os argumentos solicitados da classe, em qualquer estágio, você pode criar objetos diferentes! (Nous ficou um pouco mais claro).

Na verdade, o interesse em criar um painel de informações é uma consequência do monitor DPI, no meu caso 168. Comment(); é muito pequeno!

Há o TerminalInfoInteger(TERMINAL_SCREEN_DPI) que quero criar levando em conta a resolução... e quero criar por grupo de cores, por conveniência.

Talvez você tenha essa solução? Seu código é bom, legível... Eu, por outro lado, é longo, incompreensível e, como resultado, tenho que reescrever tudo várias vezes! Obrigado por seu apoio!

A solução está nos exemplos da ajuda:

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Galeria de UIs escritas em MQL

Artyom Trishkin, 2024.05.31 10:33 AM

Aqui(TERMINAL_SCREEN_DPI):

Exemplo de cálculo do fator de escala:

//--- crie um botão de 1,5 polegada de largura na tela
int screen_dpi = TerminalInfoInteger(TERMINAL_SCREEN_DPI); // obter o DPI do monitor do usuário
int base_width = 144;                                      // largura de base em pontos de tela para monitores padrão com DPI=96
int width      = (button_width * screen_dpi) / 96;         // calcular a largura do botão para o monitor do usuário (levando em conta o DPI)
...
 
//--- cálculo do fator de escala em porcentagem
int scale_factor=(TerminalInfoInteger(TERMINAL_SCREEN_DPI) * 100) / 96;
//--- usando o fator de zoom
width=(base_width * scale_factor) / 100;

Quando usado dessa forma, um recurso gráfico terá o mesmo tamanho a olho nu em monitores com resoluções diferentes. Ao mesmo tempo, os tamanhos dos elementos de controle (botões, janelas de diálogo, etc.) corresponderão às configurações de personalização.


 
Infelizmente, não tenho um monitor 4K, portanto não posso verificar e, pelo mesmo motivo, ainda não inseri esse recálculo na biblioteca - não é sério fazer isso aleatoriamente, sem verificar.
 
Artyom Trishkin #:
Infelizmente, não tenho um monitor 4K, então não posso verificar e, pelo mesmo motivo, ainda não inseri esse recálculo na biblioteca - não é sério fazer isso aleatoriamente, sem verificar.
Entendo... Obrigado! Vamos resolver isso aos poucos!
 
Artyom Trishkin #:
Infelizmente, não tenho um monitor 4K, então não posso verificar e, pelo mesmo motivo, ainda não inseri esse recálculo na biblioteca - não é sério fazer isso aleatoriamente, sem verificar.

Artem, oi! Aqui está a construção levando em conta o dpi.... Mas, na verdade, você pode seguir outro caminho. Digamos que você defina o tamanho do cabeçalho, calcule o tamanho do painel, a altura da linha e a altura do texto com base no tamanho do cabeçalho. Você especifica dois parâmetros... e qualquer que seja o dpi. Ou há algum problema com isso? Não tenho certeza. Qual é a sua opinião sobre essa solução?

 
Igor Bakhrushen #:

Artem oi! Aqui está uma compilação baseada em dpi..... Mas, basicamente, você pode seguir outro caminho. Digamos que você defina o tamanho do cabeçalho, calcule o tamanho da altura da linha do painel e a altura do texto com base no tamanho do cabeçalho. Você especifica dois parâmetros... e qualquer que seja o dpi. Ou há algum problema com isso? Não tenho certeza. Qual é a sua opinião sobre essa solução?

Tudo tem que ser testado. Não posso fazer isso sem um monitor. Portanto, não tenho nada a dizer, infelizmente.
 
Legal, obrigado por esse código :)
 

Boa ideia sobre o painel. Mas notei que o painel cai espontaneamente para a parte inferior do gráfico quando se alterna para ele a partir de outro gráfico. Exemplo:


 
Denis Kirichenko #:

Boa ideia sobre o painel. Mas notei que o painel cai espontaneamente para a parte inferior do gráfico quando se alterna para ele a partir de outro gráfico. Exemplo:

Fenômeno interessante. Terei que dar uma olhada nisso em meu tempo livre. O motivo mais provável é o redimensionamento do gráfico inativo.

 
Até o momento, descobri que é assim que o evento CHARTEVENT_CHART_CHANGE(9) é tratado.