C++ (Qt)bool AcceptData( std::vector <CData> & data ){ for( size_t i = 0; i < data.size(); ++i ) { QWidget * w = GetWidget(i); // берем UI элемент int type = GetWidgetType(w); switch( data[ i ].rmp_Type ) { case TYPE_SFLOAT: assert( type == edit_Text ); // Тип виджета должен быть однозначно QLineEdit if (data[i].rmp_Flag & FLAG_BIT_LIMITED) { // проверка диапазона } // запись в выходную структуру break; } }}
C++ (Qt)for (size_t i = 0; i < data.size(); ++i) { ... if (!ValidRange(data[i], currentValue)) return false;
C++ (Qt)template <class T>bool ValidRange( const CData & param, T & value ){ if (!param.rmp_Flag & FLAG_BIT_LIMITED) return true; // нет ограничений на диапазон switch (param.rmp_Type) { case TYPE_SFLOAT: case TYPE_UFLOAT: if (value >= param.valReal.rmp_Minimum && value <= param.valReal.rmp_Maximum) return true; return DoModalDialog(value, param.valReal.rmp_Minimum, param.valReal.rmp_Maximum, param.valReal.rmp_Value> MODE_REAL); case TYPE_SLONG: case TYPE_ULONG: if (value >= param.valLong.rmp_Minimum && value <= param.valLong.rmp_Maximum) return true; return DoModalDialog(value, param.valLong.rmp_Minimum, param.valLong.rmp_Maximum, param.valLong.rmp_Value, MODE_LONG); default: return true; } }
C++ (Qt)typedef quint64 FlagType; class Field{public: explicit Field( const QString &name, FlagType flags ) : m_name( name ), m_flags( flags ) {} virtual void setData( QWidget *w ) = 0; virtual void getData( QWidget *w ) = 0; private: QString m_name; FlagType m_flags;}; class LongField : public Field{public: explicit Field( const QString &name, FlagType flags, long value, long min, long max, bool sign ) : Field( name, flags ), m_value( value ), m_min( min ), m_max( max ), m_sign( sign ) {} virtual void setData( QWidget *w ) { } virtual void getData( QWidget *w ) { // Проверили, что ввел пользователь и выдали диалог } private: long m_value; long m_min; long m_max; bool m_sign;};
C++ (Qt)typedef long TYPE_SLONG;typedef unsigned long TYPE_ULONG;typedef float TYPE_FLOAT; template<class T, class Container>class RangeValidator{}; template <class Container>class RangeValidator<TYPE_ULONG, Container>{public: RangeValidator(const Container & container) : _container(container) {} template <class T> bool isValid(const T & value) const { typedef typename Container::value_type value_type; auto it = std::find_if(_container.begin(), _container.end(), [&](const value_type & param) -> bool { return (value >= param.valLong.rmp_Minimum && value <= param.valLong.rmp_Maximum); } ); if (it != _container.end()) { // Сообщаем о проблемах.. и выходим.. } return true; } private: const Container & _container;};
C++ (Qt)СParam <double> param(CData[i]);