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.
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?
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.
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.
[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);
}
//+------------------------------------------------------------------+
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.
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.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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.
Fig. 1. Partes integrantes do controle combobox
Autor: Anatoli Kazharski