Discussão do artigo "Interfaces gráficas X: Seleção de texto na caixa de texto multilinha (build 13)" - página 8

 
Anatoli Kazharski:

Ainda não testei no testador, pois havia muitas restrições lá antes. É por isso que ele está temporariamente assim por enquanto.

Você já tentou testar a GUI no testador? Qual é o resultado? Os eventos funcionam? Todos os objetos gráficos são exibidos?


Sim, todos os objetos são exibidos, os eventos do mouse nos gráficos não funcionarão no testador, mas toda a interface está ativa e, na verdade, era assim antes

Em geral, provavelmente abandonarei o cronômetro embutido por enquanto, para não editar a biblioteca))

 

Não consigo descobrir como fazer com que o formulário seja criado com um determinado tamanho em X e esteja vinculado à borda direita do gráfico, ou seja, quando você altera o tamanho do gráfico em X, o formulário não altera o tamanho e se move para a direita/esquerda sem alterar seu tamanho.

Como uma opção para substituir o método ChartEventChartChange na classe CWndEvents, esse método está na seção privada, talvez faça sentido mover os métodos:

void ChartEventCustom(void);
void ChartEventClick(void);
void ChartEventMouseMove(void);
void ChartEventObjectClick(void);
void ChartEventEndEdit(void);
void ChartEventChartChange(void);

Move to the protected section, mas, novamente, os métodos da seção privada também são usados lá? Em geral, se alguém tiver se deparado com esse problema, sugira uma solução

 
Konstantin:

Não consigo descobrir como fazer com que o formulário seja criado com um determinado tamanho em X e esteja vinculado à borda direita do gráfico, ou seja, quando você altera o tamanho do gráfico em X, o formulário não altera o tamanho e se move para a direita/esquerda sem alterar seu tamanho.

Como uma opção para substituir o método ChartEventChartChange na classe CWndEvents, esse método está na seção privada, talvez faça sentido mover os métodos:

Move to the protected section, mas, novamente, os métodos da seção privada também são usados lá? Em geral, se alguém tiver se deparado com esse problema, sugira uma solução

Mais ou menos assim:

//+------------------------------------------------------------------+
//|| Cria um formulário para os controles.
//+------------------------------------------------------------------+
bool CProgram::CreateWindow(const string caption_text)
  {
//--- Adicione o ponteiro da janela à matriz de janelas
   CWndContainer::AddWindow(m_window);
//--- Dimensões
   int x_size =200;
   int y_size =200;
//--- Coordenadas
   int x =m_chart.WidthInPixels()-(x_size+1);
   int y =1;
//--- Propriedades
...
//--- Criação de formulário
   if(!m_window.CreateWindow(m_chart_id,m_subwin,caption_text,x,y))
      return(false);
//---
   return(true);
  }

//---

No manipulador de eventos da classe de usuário do aplicativo MQL ao processar o evento CHARTEVENT_CHART_CHANGE:

//+------------------------------------------------------------------+
//| Manipulador de eventos|
//+------------------------------------------------------------------+
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_CHART_CHANGE)
     {
      m_window.X(m_chart.WidthInPixels()-(m_window.XSize()+1));
     }
  }

//---

Resultado:

//---

Você também pode adicionar uma verificação se o tamanho (largura) da janela do gráfico foi alterado, porque o evento CHARTEVENT_CHART_CHANGE é gerado em diferentes casos. Por exemplo, ao rolar o gráfico.

 
Anatoli Kazharski:

É mais ou menos assim:

//---

No manipulador de eventos de uma classe de aplicativo MQL personalizada ao processar um evento CHARTEVENT_CHART_CHANGE:

//---

Result:

//---

Você também pode adicionar uma verificação se o tamanho (largura) da janela do gráfico foi alterado, porque o evento CHARTEVENT_CHART_CHANGE é gerado em diferentes casos. Por exemplo, ao rolar o gráfico.


oops, funcionou ))
 

Como obter na tabela o índice da linha em que o botão esquerdo do mouse foi clicado, se SelectableRow(false) foi definido ao criar a tabela? Analisar o parâmetro sparam em OnEvent não parece elegante. É claro que é possível usar SelectableRow(true) e SelectedItem(), mas a tarefa é não selecionar linhas na tabela.

 
Konstantin:

Como obter na tabela o índice da linha em que o botão esquerdo do mouse foi clicado, se SelectableRow(false) foi definido ao criar a tabela? Analisar o parâmetro sparam em OnEvent não parece elegante. É claro que podemos usar SelectableRow(true) e SelectedItem(), mas a tarefa é não selecionar linhas na tabela.

Até o momento, apenas isso, mas adicionarei esse recurso.
 
Como diferenciar entre o evento de seleção de uma linha em uma tabela e a seleção de um item em uma caixa de combinação? Pelo código, posso ver que eles usam o mesmo evento ON_CLICK_LIST_ITEM.
 
Konstantin:
Como diferenciar entre o evento de seleção de uma linha em uma tabela e a seleção de um item em uma caixa de combinação? Pelo código, fica claro que eles usam o mesmo evento ON_CLICK_LIST_ITEM.
Por quê? O que exatamente o está impedindo de fazer isso?
 

Eu exibo uma tabela em um formulário, seleciono uma linha nela, seleciono um valor em uma caixa de combinação e os dados da linha da tabela e o valor da caixa de combinação devem ser gravados em uma entidade separada. Agora, os eventos não são delimitados e é necessário criar muletas que realizem a tarefa:


Talvez você possa sugerir algum outro mecanismo?

Basicamente, a tabela é uma matriz de pares de tickers, a caixa de combinação contém tipos de sinais, uma entidade separada são os objetos da matriz de sinais. Os objetos em si não são um único campo, mas tipos de dados personalizados complexos, um par de tickers da tabela e um tipo de sinal são registrados neles e, em seguida, outro processamento é feito.

 
Konstantin:

...

você consegue pensar em algum outro mecanismo?

...

Não tenho certeza do que exatamente não está funcionando.

Há um identificador de evento (id) e há um identificador de elemento (lparam), o que permite diferenciar os eventos. Isso não é suficiente?