Objeto de uma classe CEdit que aceite somente números ao digitar

 

Estou desenvolvendo uma boleta que atenda minhas necessidades de trade. Deparei com uma situação que parecia simples de resolver, mas não estou conseguindo ir em frente:

- preciso que, ao digitar um valor monetário em um campo do tipo CEdit, o mesmo somente aceite números e formate com vírgula os centavos, semelhante as boletas distribuídas no mercado pelas corretoras.

Se por ventura houver algum tópico que trate do assunto, me desculpem por abrir este tópico.

Agradeço a todos. E boas codificações.

 
Márcio Hermes:

Estou desenvolvendo uma boleta que atenda minhas necessidades de trade. Deparei com uma situação que parecia simples de resolver, mas não estou conseguindo ir em frente:

- preciso que, ao digitar um valor monetário em um campo do tipo CEdit, o mesmo somente aceite números e formate com vírgula os centavos, semelhante as boletas distribuídas no mercado pelas corretoras.

Se por ventura houver algum tópico que trate do assunto, me desculpem por abrir este tópico.

Agradeço a todos. E boas codificações.

Olá Márcio Hermes,

Crie um array com strings relativas a números e compare se os valores inputados pelo usuário são diferentes dos valores válidos.

Algo como:

string validNumbers[10] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};

Abraços,
Malacarne

 

Percebi que a "briga" não é com a parte da função de validação dos números e sim com a parte de eventos.

Gerando o evento, ou melhor, conseguindo gerar o evento durante a digitação em um campo CEdit, a função é o mais fácil. E a ideia de usar um array é perfeita e simples.

Me defendo bem com Java, e descobri que trabalhar com eventos em Java é para crianças. Eventos em C++ sim é para os fortes, mas não me entrego e já aprendi muita coisa com a ajuda de seus comentários mesmo não sendo minha a pergunta. Obrigado.

Me salvou um pouco o fato de programar Microcontroladores usando linguagem C. 

O câncer que estou tendo é justamente 'sacar' os detalhes de eventos no MQL5. Eventos em botões foi barbada. Eventos para campos de texto, senti que têm mais detalhes.

Tentei usar no mapa de eventos as opções ON_CHANGE, ON_START_EDIT, ON_END_EDIT, mas não deu certo. Acreditava que a opção ON_CHANGE faria mais sentido.

O problema está em algum evento que sirva durante a digitação, ou seja, o usuário vai digitando o valor monetário e o programa vai validando o mesmo.

Tem algum outro detalhe que não consegui entender ainda e que não deve ser nenhuma grande dificuldade. O problema deve estar na peça diante do PC.

 
Márcio Hermes:

Percebi que a "briga" não é com a parte da função de validação dos números e sim com a parte de eventos.

Gerando o evento, ou melhor, conseguindo gerar o evento durante a digitação em um campo CEdit, a função é o mais fácil. E a ideia de usar um array é perfeita e simples.

Me defendo bem com Java, e descobri que trabalhar com eventos em Java é para crianças. Eventos em C++ sim é para os fortes, mas não me entrego e já aprendi muita coisa com a ajuda de seus comentários mesmo não sendo minha a pergunta. Obrigado.

Me salvou um pouco o fato de programar Microcontroladores usando linguagem C. 

O câncer que estou tendo é justamente 'sacar' os detalhes de eventos no MQL5. Eventos em botões foi barbada. Eventos para campos de texto, senti que têm mais detalhes.

Tentei usar no mapa de eventos as opções ON_CHANGE, ON_START_EDIT, ON_END_EDIT, mas não deu certo. Acreditava que a opção ON_CHANGE faria mais sentido.

O problema está em algum evento que sirva durante a digitação, ou seja, o usuário vai digitando o valor monetário e o programa vai validando o mesmo.

Tem algum outro detalhe que não consegui entender ainda e que não deve ser nenhuma grande dificuldade. O problema deve estar na peça diante do PC.

Olá Márcio.
Acredito que nesse caso você deva trabalhar com o evento CHARTEVENT_KEYDOWN e dentro da função de verificação checar se a tecla pressionada é um número. Acredito também que vai precisar criar uma lista de exceção para teclas que não imputa nenhum valor como as teclas Alt, Caps Lock, Ctrl e Shift por exemplo

E depois usar o evento CHARTEVENT_OBJECT_ENDEDIT para armazenar o valor digitado.

https://www.mql5.com/pt/docs/constants/chartconstants/enum_chartevents

Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Constantes de Gráfico / Tipos de Eventos de Gráficos
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Constantes de Gráfico / Tipos de Eventos de Gráficos
  • www.mql5.com
Existem 11 tipos de eventos que podem ser processados usando a função pré-definida OnChartEvent(). Para eventos customizados 65535 identificadores são fornecidos na faixa de CHARTEVENT_CUSTOM a CHARTEVENT_CUSTOM_LAST inclusive. Para gerar um evento customizado, a função EventChartCustom() deve ser usada. Para cada tipo de evento, os parâmetros...
 

Desde já, obrigado a todos pela ajuda.

Seguindo a dica do Samuel Manoel De Souza, consegui gerar um evento ao pressionar uma tecla, e também entender um pouco mais sobre eventos no MQL5.

Demorei a dar um retorno pelo fato de estar pesquisando e fazendo testes para encontrar a solução para minha necessidade.

Consegui sim gerar um evento de teclado observando o link sugerido. O detalhe em questão é que uso interface gráfica, e eventos de teclado não são capturados quando digito em campos de texto que pertencem a este frame. Se colocar o cursor do mouse fora do frame, os eventos são capturados normalmente.

Pesquisei até em códigos de outros usuários que também usam GUI para seus EAs, porém todos que encontrei usam indicadores e os eventos são gerados para, por exemplo, mudar algum parâmetro de uma média móvel.

Pelo que percebi, uma GUI está 'descolada' do gráfico e não captura eventos de teclado. Provavelmente deve existir algum comando que solucione esta questão, que não consegui encontrar.

E o MQL5 não é difícil, só é bem diferente de JAVA!

Razão: