Discussão do artigo "Interfaces Gráficas VI: Os Controles Caixa de Seleção, Campo de Edição e seus Tipos Combinados (Capítulo 1)"
Mas "piscar" ao atingir valores extremos não funcionará nos indicadores - Sleep() ...
Anatoly, escreva mais uma solicitação de melhoria: o atraso deve ser organizado por meio de um cronômetro, especialmente porque você já tem quase tudo para isso.
Anatoly, a biblioteca criada por você está em um alto grau de prontidão e decidi tentar criar um pequeno projeto para mim mesmo usando-a. Estou escrevendo neste tópico para que fique claro a qual elemento a pergunta se refere. Para o campo de entrada (SpinEdit), é necessário inserir valores com uma precisão de dois décimos. Eu defini as propriedades correspondentes (StepValue e StepDigits) no procedimento de criação do campo (veja o código abaixo):
... m_spin_edit_Depo.MaxValue(10000000); m_spin_edit_Depo.MinValue(0); m_spin_edit_Depo.StepValue(0,01); m_spin_edit_Depo.SetDigits(2); m_spin_edit_Depo.SetValue(v); ...
E, após a compilação, recebi um erro: 'StepValue' - nenhuma das sobrecargas pode ser aplicada à chamada de função.
Logicamente, se o número de caracteres de um valor for menor que 1, o incremento do valor da etapa também poderá ser menor que um. Ao mesmo tempo, no código da classe, a verificação do valor inserido é feita apenas para não negatividade.
...
//--- Шаг значения
double StepValue(void) const { return(m_step_value); }
void StepValue(const double value) { m_step_value=(value<=0)? 1 : value; }
...
A questão é que não está claro para mim de onde vem o erro.
Então, tenho uma pergunta ou um desejo. E se não precisarmos controlar o valor mínimo/máximo e ele for limitado apenas pelo tamanho da variável do tipo double usada para armazená-lo? Pelo que entendi do código, a definição dos valores mínimo e máximo é obrigatória. É possível adicionar meu desejo à lista de aprimoramentos? Ou seja, se os valores mínimo/máximo de um campo não forem especificados, o controle dos valores inseridos será realizado somente quando ele entrar no intervalo da variável do tipo double.
E, após a compilação, recebi o seguinte erro: 'StepValue' - nenhuma das sobrecargas pode ser aplicada à chamada de função.
...
A questão é que não está claro para mim de onde vem o erro.
Você tem um erro de digitação. Use um ponto "." como separador. :
m_spin_edit_Depo.StepValue(0. 01);//---
Em seguida, tenho uma pergunta ou um desejo. E se eu não precisar controlar o valor mínimo/máximo e ele for limitado apenas pelo tamanho da variável do tipo doubleusada para seu armazenamento ? Pelo que entendi do código, a definição dos valores mínimo/máximo é obrigatória. É possível adicionar meu desejo à lista de aprimoramentos? Ou seja, se os valores mínimo/máximo de um campo não forem especificados, o controle dos valores inseridos será realizado somente quando eles entrarem no intervalo da variável do tipo double.
Por enquanto, você pode definir o máximo e o mínimo à força. Assim:
m_spin_edit_Depo.MaxValue(DBL_MAX); m_spin_edit_Depo.MinValue(-DBL_MAX);
Você cometeu um erro de digitação. Use um ponto final "." como separador. :
//---
Você pode forçar o máximo e o mínimo por enquanto. Aqui está:
Foi publicado o novo artigo Graphical Interfaces VI: the Checkbox Control, the Edit Control and their Mixed Types (Capítulo 1):
Autor: Anatoli Kazharski
Olá, senhor, estou interessado em seu artigo, mas ainda sou novato em GUI e mql,
. Por favor, diga-me como obter o valor do Spin edit para que ele possa ser lido no EA.
Atenciosamente
Olá, senhor, estou interessado em seu artigo, mas ainda sou novato em GUI e mql,
. Por favor, diga-me como obter o valor do Spin edit para que ele possa ser lido no EA.
Atenciosamente
Por exemplo, de um artigo no manipulador de eventos CProgram::OnEvent():
void CProgram::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { //--- Событие нажатия на текстовой метке if(id==CHARTEVENT_CUSTOM+ON_CLICK_LABEL) { ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam); //--- Если нажали на первом чекбоксе if(lparam==m_checkbox1.Id()) { m_checkbox2.CheckBoxState(m_checkbox1.CheckButtonState()); m_spin_edit1.SpinEditState(m_checkbox1.CheckButtonState()); Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue()); } if(lparam==m_checkbox3.Id()) { m_checkboxedit1.CheckBoxEditState(m_checkbox3.CheckButtonState()); Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue()); } if(lparam==m_checkbox4.Id()) { m_checkcombobox1.CheckComboBoxState(m_checkbox4.CheckButtonState()); } if(lparam==m_checkbox5.Id()) { m_slider1.SliderState(m_checkbox5.CheckButtonState()); m_dual_slider1.SliderState(m_checkbox5.CheckButtonState()); Print("m_slider1.GetValue(): ",m_slider1.GetValue()); Print("m_dual_slider1.GetLeftValue(): ",m_dual_slider1.GetLeftValue()); Print("m_dual_slider1.GetRightValue(): ",m_dual_slider1.GetRightValue()); } } if(id==CHARTEVENT_CUSTOM+ON_END_EDIT) { ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam); if(lparam==m_spin_edit1.Id()) { Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue()); } if(lparam==m_checkboxedit1.Id()) { Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue()); } if(lparam==m_slider1.Id()) { Print("m_slider1.GetValue(): ",m_slider1.GetValue()); } if(lparam==m_dual_slider1.Id()) { Print("m_dual_slider1.GetLeftValue(): ",m_dual_slider1.GetLeftValue()); Print("m_dual_slider1.GetRightValue(): ",m_dual_slider1.GetRightValue()); } } if(id==CHARTEVENT_CUSTOM+ON_CLICK_INC || id==CHARTEVENT_CUSTOM+ON_CLICK_DEC) { ::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam); if(lparam==m_spin_edit1.Id()) { Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue()); } if(lparam==m_checkboxedit1.Id()) { Print("m_checkboxedit1.GetValue(): ",m_checkboxedit1.GetValue()); } } }
Por exemplo, de um artigo no manipulador de eventos CProgram::OnEvent():
Caro Anatoli Kazharski, muito obrigado por essa excelente biblioteca!
Adoro a aparência e a sensação das interfaces resultantes.
Ao começar a adaptar a Test Library 10.mq5 às minhas necessidades pessoais, achei que valia a pena mencionar que me ajudou muito adicionar o método
void CSpinEdit::LabelText(const string new_text)
à classe CSpinEdit que não faz nada além de adiar qualquer chamada para CLabel::Description(const string new_text). O motivo é que estou usando um CSpinEdit para diferentes tipos de valores, dependendo do estado de um CComboBox. Depois de alterar o rótulo com LabelText(text) e escolher o formato de edição apropriado, os valores são exibidos conforme desejado depois de chamar
void CSpinEdit::ChangeValue(const double value)
Mais uma vez, obrigado e cumprimentos
- 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 VI: Os Controles Caixa de Seleção, Campo de Edição e seus Tipos Combinados (Capítulo 1) foi publicado:
Este artigo é o começo da sexta parte da série dedicada ao desenvolvimento da biblioteca para a criação de interfaces gráficas nos terminais MetaTrader. No primeiro capítulo, nós vamos discutir o controle caixa de seleção, o controle campo de edição e seus tipos combinados.
Este elemento será composto por três objetos gráficos. Eles são:
Fig. 1. Partes integrantes do controle caixa de seleção.
Autor: Anatoli Kazharski