Discussão do artigo "Interfaces Gráficas V: O Controle Combobox (Capítulo 3)"

 

Novo artigo Interfaces Gráficas V: O Controle Combobox (Capítulo 3) foi publicado:

Nos dois primeiros capítulos da quinta parte da série, nós desenvolvemos as classes para criar uma barra de rolagem e uma lista. Neste capítulo, nós falaremos sobre a criação de uma classe para o controle combobox. Este é também um controle composto que contém, entre outros, os elementos considerados nos capítulos anteriores desta quinta parte.

A seguir estão os objetos primitivos para compor o controle combobox.

  1. O elemento de fundo
  2. Rótulo (descrição do elemento)
  3. Botão
  4. Indicação de uma lista suspensa


Fig. 1. Partes integrantes do controle combobox

Autor: Anatoli Kazharski

 

Coisas legais e úteis que você está fazendo ;)

Anatol, acho que há algumas melhorias que poderiam ser feitas. Por exemplo, quando o cursor está sobre qualquer uma das listas, minha mão alcança a roda para rolar a lista, mas, infelizmente, rolamos o gráfico. E você tem o rastreamento da rolagem do gráfico. Talvez seja melhor não remover a lista, mas rolá-la, desativando temporariamente a rolagem do gráfico, o que você acha?

E mais uma coisa: não percebi que há uma opção para não exibir a descrição da lista, que fica à esquerda do botão da lista? Ela nem sempre é necessária.

 

Bem, ou, de modo geral, cardinalmente - se a janela principal do programa estiver em foco, desative a rolagem do gráfico, e já esteja no local para determinar se é necessário rolar algo a partir da roda, ou não reagir a ela....

Por exemplo, no 3D Studio MAX, por exemplo, há uma reação ao botão esquerdo do mouse apertado e seu movimento para cima e para baixo na forma de aumento/diminuição de qualquer valor. Clique na seta para cima ou para baixo e, sem soltar o botão, leve o mouse para cima ou para baixo, e o valor na janela do formulário aumenta ou diminui, dependendo da direção do movimento do mouse.

 
Artyom Trishkin:

Anatol, acho que há algumas melhorias que poderiam ser feitas. Por exemplo, quando o cursor está sobre qualquer uma das listas, a mão alcança a roda para rolar a lista, mas, infelizmente, rolamos o gráfico. E você tem o rastreamento da rolagem do gráfico. Talvez seja melhor não remover a lista, mas rolá-la desativando temporariamente a rolagem do gráfico, não acha?

Agora, até onde sei, as ferramentas MQL podem rastrear se o botão do meio do mouse está pressionado ou não. Mas ainda é impossível rastrear se a rolagem está sendo feita ou não.

E mais uma coisa: não percebi se há uma opção para não exibir a descrição da lista, que fica à esquerda do botão da lista? Ela nem sempre é necessária.

Sim, é possível. Ao criar um item, passe uma string vazia ("") para o método CComboBox::LabelText().

Por exemplo, no 3D Studio MAX, por exemplo, há uma reação ao botão esquerdo do mouse apertado e seu movimento para cima e para baixo na forma de aumento/diminuição de algum valor. Clique na seta para cima ou para baixo e, sem soltar o botão, leve o mouse para cima ou para baixo, e o valor no formulário de caixa aumenta ou diminui, dependendo da direção do movimento do mouse.

O próximo artigo apresentará vários controles, incluindo o elemento "Input Field". Na implementação atual, há uma rolagem acelerada. Ou seja, manter o botão esquerdo do mouse sobre os botões de aumento/diminuição e manter o cursor na área desses botões resulta em rolagem acelerada dos valores.

 
//+------------------------------------------------------------------+

//|ComboBox.mqh
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com
//+------------------------------------------------------------------+
#include "Element.mqh"
#include "Window.mqh"
#include "ListView.mqh"
//+------------------------------------------------------------------+
//| Êëàññ äëÿ ñîçäàíèÿ êîìáèíèðîâàííîãî ñïèñêà                      |
//+------------------------------------------------------------------+
class CComboBox : public CElement
  {
private:
   //--- Óêàçàòåëü íà ôîðìó, ê êîòîðîé ýëåìåíò ïðèñîåäèí¸í
   CWim_buttonndow          *m_wnd;
   //--- Îáúåêòû äëÿ ñîçäàíèÿ êîìáî-áîêñà
   CRectLabel        m_area;
Há algum motivo pelo qual os comentários não estão mais em inglês?
 
Amir Yacoby:
Há algum motivo pelo qual os comentários não estão mais em inglês?

Eu vi a mesma coisa e acho que atualmente há duas coisas.


1. Alguns problemas ainda precisam ser corrigidos (especialmente no MT4!)
2. Atualmente, não há ninguém que possa traduzi-los para o inglês. Para mim, também não está claro por que os principais comentários não estão em inglês. Mas, desde que as funções sejam declaradas em inglês e a maioria dos exemplos acima esteja disponível em inglês, isso não importa.


 
MetaQuotes Software Corp.:

Foi publicado o novo artigo Graphical Interfaces V: The Combobox Control (Capítulo 3):

Autor: Anatoli Kazharski

Bom trabalho com os artigos. Estou gostando da próxima série de artigos. Você pode verificar a linha 90 do SplitButton.mqh? Estou recebendo o erro

return - cannot convert from const pointer to nonconst pointer.

Removi o "const" para que funcionasse.
 
Kaleem Haider:

return - não é possível converter de ponteiro constante para ponteiro não constante.

Removi o "const" para que funcionasse.

Sim. É necessário remover o const sempre que você receber esse erro. Mais tarde, atualizarei os arquivos em todos os artigos.

 

[WIN7 64bits - MetaTrader5 build 1472]

Comportamento estranho do SplitString com ComboBox.

Criei uma combobox para controlar o sl e o tp de uma ordem, mas quando tentei obter o item selecionado, houve um problema.
Quando o usuário clica nos botões de compra ou venda, o programa obtém o item selecionado da combobox e calcula o sl e o tp da ordem.
Quando o executo no modo de depuração (F5), não há problema. Mas quando eu o arrasto da lista de EAs e solto no gráfico, o problema aparece.
Parece que a biblioteca EasyAndFast substitui de alguma forma as funções SplitString, PrintFormat ou StringToDouble, ou algo do gênero. Mas não tenho certeza disso.
Aqui está meu exemplo:

//+------------------------------------------------------------------+
//| Cria o combobox TP:SL|
//+------------------------------------------------------------------+
bool CProgram::CreateTPSLComboBox(const int x_gap, const int y_gap, const string text) {
  // Número total de itens da visualização de lista
  #define ITEMS_TOTAL1 4

  // Passar o objeto do painel
  _tpslCombobox.WindowPointer(_mainWindow);
  
  // Anexar à primeira guia
  _mainTabs.AddToElementsArray(0, _tpslCombobox);  
  
  // Coordenadas
  int x = _mainWindow.X() + x_gap;
  int y = _mainWindow.Y() + y_gap;
  
  // Matriz dos valores de item na exibição de lista
  string items_text[ITEMS_TOTAL1] = {"2:4", "2:3", "3:4", "0:0"};
  
  // Definir propriedades antes da criação
  _tpslCombobox.XSize(90);
  _tpslCombobox.YSize(18);
  _tpslCombobox.LabelText(text);
  _tpslCombobox.ButtonXSize(45);
  _tpslCombobox.ItemsTotal(ITEMS_TOTAL1);
  _tpslCombobox.VisibleItemsTotal(4);
  _tpslCombobox.AreaColor(clrWhite);

  // Armazenar os valores dos itens na exibição de lista da caixa de combinação
  for(int i = 0; i < ITEMS_TOTAL1; i++)
    _tpslCombobox.ValueToList(i, items_text[i]);
  
  // Obter o ponteiro de exibição de lista
  CListView *lv = _tpslCombobox.GetListViewPointer();
  
  // Definir as propriedades da visualização de lista
  lv.LightsHover(true);
  lv.SelectedItemByIndex(lv.SelectedItemIndex() == WRONG_VALUE ? 0 : lv.SelectedItemIndex());
  
  // Criar controle
  if(!_tpslCombobox.CreateComboBox(m_chart_id, m_subwin, x, y))
    return(false);

  // Adicionar o objeto à matriz comum de grupos de objetos
  CWndContainer::AddToElementsArray(0, _tpslCombobox);
  return(true);
}

...

//+------------------------------------------------------------------+
//| Função de venda |
//+------------------------------------------------------------------+
void CProgram::Sell() {
  string sep = ":";
  ushort usep;
  usep = StringGetCharacter(sep, 0);
  string s[];
  double tp = 0.0;
  double sl = 0.0;
  if(StringSplit(_tpslCombobox.ButtonText(), usep, s) == 2) {
    PrintFormat("s01: %s - s02: %s", s[0], s[1]); // output: s01: 2 - s02: 4 
    tp = StringToDouble(s[0]);
    sl = StringToDouble(s[1]);
  }
  PrintFormat("tp: %.2f - sl: %.2f", tp, sl); // output: tp: 2.00 - sl: 2.00
...

A saída: "tp:2.00 - sl: 2.00" deveria ser "tp:2.00 - sl: 4.00".
Mas, novamente, o problema só aparece quando arrasto e solto no gráfico. Quando o executo no modo de depuração, tudo está ok.
Algum conselho?

------
ATUALIZAÇÃO:
Parece ser um problema no MetaTrader 5, não na biblioteca EasyAndFast especificamente.
Aqui está um teste:
//+------------------------------------------------------------------+
//|teste.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    string sep = ":";
    ushort usep;
    usep = StringGetCharacter(sep, 0);
    string s[];
    double tp = 0.0;
    double sl = 0.0;
    if(StringSplit("2:4", usep, s) == 2) {
      tp = StringToDouble(s[0]);
      sl = StringToDouble(s[1]);
    }
    PrintFormat("tp: %.2f - sl: %.2f", tp, sl);
  }
//+------------------------------------------------------------------+
Output: "tp: 2.00 - sl: 4.00" no modo Debug (F5).
Saída: "tp: 2.00 - sl: 2.00" quando você arrasta e solta o script no gráfico.

Se alguém mais confirmar isso, informarei ao ServiceDesk.
Obrigado.

[WIN7 64bits - MetaTrader5 build 1472]
 

Copiei tudo para a pasta mql4, o Expert Advisor TestLibrary está cinza e não abre. Ele diz "cannot open file" (não é possível abrir o arquivo) no Expert Advisors.

Ele funciona no modo de teste? Há algum motivo para investigar por que ele não inicia, pois é muito importante que funcione no modo de teste.

 
Evgeniy Scherbina:

Copiei tudo para a pasta mql4, o Expert Advisor TestLibrary está cinza e não abre. Ele diz "cannot open file" (não é possível abrir o arquivo) no Expert Advisors.

Ele funciona no modo de teste? Faz sentido investigar por que ele não é executado, pois é muito importante que funcione no modo de teste.

A versão MT4 da biblioteca não é mais suportada por mim.

A versão mais recente para MT5 no momento pode ser baixada neste artigo: GUIs X: Time Element, Checkbox List Element e Table Sorting (build 6).

Os testes de testador não foram realizados no estágio atual de desenvolvimento e não serão realizados por um longo tempo.