Обсуждение статьи "Графические интерфейсы VI: Элементы "Чекбокс", "Поле ввода" и их смешанные типы (Глава 1)"
А ведь "подмигивание" при достижении крайних значений не будет работать в индикаторах - Sleep() же ...
Анатоль, записывай ещё одно пожелание к доработке: задержку организовывать через таймер, тем более, что почти всё для этого у тебя уже есть.
Анатолий, созданная Вами библиотека в высокой степени готовности и вот решил попробовать создать на ней не большой проект для себя. Пишу в эту тем, так чтобы было понятно к какому элементу относится вопрос. Для поля ввода (SpinEdit) необходим ввод значений с точностью до двух десятых. Выставил соответствующие свойства (StepValue и StepDigits) в процедуре создания поля (см. код ниже):
... 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); ...
И после компиляции получил ошибку: 'StepValue' - no one of the overloads can be applied to the function call.
По логике если количество знаков для значения меньше 1, то и шаг приращения значения тоже может быть меньше единицы. При этом в коде класса, проверка введенного значения идет только на не отрицательность.
...
//--- Шаг значения
double StepValue(void) const { return(m_step_value); }
void StepValue(const double value) { m_step_value=(value<=0)? 1 : value; }
...
Вопрос в том, что мне не ясно, откуда взялась ошибка.
Далее у меня возник вопрос или пожелание. А если не требуется контролировать минимальное/максимальное значение и оно ограничено только размером используемой для его хранения переменной типа double? Из кода как я понял выставление минимальное/максимальное значений обязательно. Можно ли дописать мое пожелание в список доработок? Т.е. Если минимальное/ максимальное значения для поля не указаны, контроль введенных значений осуществлялся лишь на вхождение его в границы диапазона переменной типа double.
И после компиляции получил ошибку: 'StepValue' - no one of the overloads can be applied to the function call.
...
Вопрос в том, что мне не ясно, откуда взялась ошибка.
У вас опечатка. В качестве разделителя используйте точку "." :
m_spin_edit_Depo.StepValue(0.01);
//---
Далее у меня возник вопрос или пожелание. А если не требуется контролировать минимальное/максимальное значение и оно ограничено только размером используемой для его хранения переменной типа double? Из кода как я понял выставление минимальное/максимальное значений обязательно. Можно ли дописать мое пожелание в список доработок? Т.е. Если минимальное/ максимальное значения для поля не указаны, контроль введенных значений осуществлялся лишь на вхождение его в границы диапазона переменной типа double.
Можете пока принудительно установить максимальное и минимальное. Вот так:
m_spin_edit_Depo.MaxValue(DBL_MAX); m_spin_edit_Depo.MinValue(-DBL_MAX);
У вас опечатка. В качестве разделителя используйте точку "." :
//---
Можете пока принудительно установить максимальное и минимальное. Вот так:
в ваших примерах всегда присутствует вывод id, lparam, dparam, sparam.
if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{
::Print(__FUNCTION__," > id: ",id,"; lparam: ",lparam,"; dparam: ",dparam,"; sparam: ",sparam);
//Print(m_spin_edit1.GetValue());
}
получаем следующее
TestLibrary (NZDUSD,H1) CProgram::OnEvent > id: 1020; lparam: 12; dparam: -1.0; sparam: Spin Edit 1:
id - индификатор элемента
lparam - ?
dparam - ?
sparam - название элемента
мы рассматриваем поле ввода - конечно же интересно получить введенное значение, как это сделать максимально быстро?
в ваших примерах всегда присутствует вывод id, lparam, dparam, sparam.
...
id - индификатор элемента
lparam - ?
dparam - ?
sparam - название элемента
Элементы управления генерируют сообщения и параметры в большинстве случаев означают следующее:
- id - идентификатор события.
- lparam - идентификатор элемента.
- dparam - индекс элемента.
- sparam - отображаемый текст заданный пользователем библиотеки (название элемента).
Я подготовлю потом таблицу, где будет показан набор параметров события от каждого элемента.
...
мы рассматриваем поле ввода - конечно же интересно получить введенное значение, как это сделать максимально быстро?
Как раз с помощью метода CSpinEdit::GetValue() и можно получить текущее значение в поле ввода.
Пример:
if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{
//--- Если идентификатор элемента от первого поля ввода
if(lparam==m_spin_edit1.Id())
{
//--- Выведем его значение
Print("m_spin_edit1.GetValue(): ",m_spin_edit1.GetValue());
}
//---
return;
}
а если мы не знаем название или у нас сотня полей, может есть метод по id посмотреть что там или что то типа this.GetValue()
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Графические интерфейсы VI: Элементы "Чекбокс", "Поле ввода" и их смешанные типы (Глава 1):
С этой статьи начинается шестая часть серии о разработке библиотеки для создания графических интерфейсов в терминалах MetaTrader. В первой главе речь пойдёт о таких элементах управления, как «чекбокс», «поле ввода», а также о смешанных типах этих элементов.
Элемент «Чекбокс»
Элемент управления «чекбокс» предназначен для управления параметрами, у которых может быть только два состояния. Чтобы понять, в каком состоянии сейчас находится параметр, к которому привязан элемент, используется кнопка с двумя изображениями. Изображение с символом «галочка» обозначает состояние «включено» (on). Изображение без этого символа «галочка» обозначит состояние «выключено» (off). Рядом с кнопкой располагается краткое описание параметра.
Собирать этот элемент будем из трёх графических объектов. Перечислим их.
Рис. 1. Составные части элемента управления «Чекбокс».
Автор: Anatoli Kazharski