Index: /cpp/frams/param/param.cpp
===================================================================
--- /cpp/frams/param/param.cpp	(revision 573)
+++ /cpp/frams/param/param.cpp	(revision 574)
@@ -72,19 +72,31 @@
 int ParamInterface::getMinMax(int prop, paInt& minumum, paInt& maximum, paInt &def)
 {
-	const char* t = type(prop) + 1;
+	return getMinMax(type(prop),minumum,maximum,def);
+}
+
+int ParamInterface::getMinMax(int prop, double& minumum, double& maximum, double& def)
+{
+	return getMinMax(type(prop),minumum,maximum,def);
+}
+
+int ParamInterface::getMinMax(int prop, int& minumum, int& maximum, SString& def)
+{
+	return getMinMax(type(prop),minumum,maximum,def);
+}
+
+int ParamInterface::getMinMax(const char* t, paInt& minumum, paInt& maximum, paInt &def)
+{
 	while (*t) if (*t == ' ') break; else t++;
 	return sscanf(t, PA_INT_SCANF " " PA_INT_SCANF " " PA_INT_SCANF, &minumum, &maximum, &def);
 }
 
-int ParamInterface::getMinMax(int prop, double& minumum, double& maximum, double& def)
-{
-	const char* t = type(prop) + 1;
+int ParamInterface::getMinMax(const char* t, double& minumum, double& maximum, double& def)
+{
 	while (*t) if (*t == ' ') break; else t++;
 	return sscanf(t, "%lg %lg %lg", &minumum, &maximum, &def);
 }
 
-int ParamInterface::getMinMax(int prop, int& minumum, int& maximum, SString& def)
-{
-	const char* t = type(prop) + 1;
+int ParamInterface::getMinMax(const char* t, int& minumum, int& maximum, SString& def)
+{
 	while (*t) if (*t == ' ') break; else t++;
 	int ret = sscanf(t, "%d %d", &minumum, &maximum);
@@ -138,5 +150,5 @@
 	{
 		double mn = 0, mx = 0, def = 0;
-		if (getMinMax(i, mn, mx, def) < 3) def = mn;
+		if (getMinMax(t, mn, mx, def) < 3) def = mn;
 		setDouble(i, def);
 	}
@@ -145,5 +157,5 @@
 	{
 		paInt mn = 0, mx = 0, def = 0;
-		if (getMinMax(i, mn, mx, def) < 3) def = mn;
+		if (getMinMax(t, mn, mx, def) < 3) def = mn;
 		setInt(i, def);
 	}
@@ -152,5 +164,5 @@
 	{
 		int mn, mx; SString def;
-		getMinMax(i, mn, mx, def);
+		getMinMax(t, mn, mx, def);
 		if (*t == 's')
 			setString(i, def);
@@ -175,5 +187,5 @@
 	{
 		double mn = 0, mx = 0, def = 0;
-		getMinMax(i, mn, mx, def);
+		getMinMax(t, mn, mx, def);
 		setDouble(i, mn);
 	}
@@ -182,5 +194,5 @@
 	{
 		paInt mn = 0, mx = 0, def = 0;
-		getMinMax(i, mn, mx, def);
+		getMinMax(t, mn, mx, def);
 		setInt(i, mn);
 	}
@@ -198,5 +210,5 @@
 	{
 		double mn = 0, mx = 0, def = 0;
-		getMinMax(i, mn, mx, def);
+		getMinMax(t, mn, mx, def);
 		setDouble(i, mx);
 	}
@@ -205,5 +217,5 @@
 	{
 		paInt mn = 0, mx = 0, def = 0;
-		getMinMax(i, mn, mx, def);
+		getMinMax(t, mn, mx, def);
 		setInt(i, mx);
 	}
@@ -678,5 +690,5 @@
 		paInt mn, mx, def;
 		int value = getInt(i);
-		if (getMinMax(i, mn, mx, def) >= 2)
+		if (getMinMax(t, mn, mx, def) >= 2)
 		{
 			if (value > mx)
@@ -715,4 +727,13 @@
 if (*t==0) return false;
 if (strchr("dfsoxp", *t)==NULL) return false;
+switch(*t)
+	{
+	case 'd':
+		{paInt a,b,c; if (getMinMax(t,a,b,c)==1) return false;}
+		break;
+	case 'f':
+		{double a,b,c; if (getMinMax(t,a,b,c)==1) return false;}
+		break;
+	}
 return true;
 }
@@ -858,9 +879,7 @@
 	if (pe->flags&PARAM_READONLY) return PSET_RONLY;
 	paInt xcopy = x; //only needed for messageOnExceedRange(): retain original, requested value of x because it may be changed below
-	paInt mn = 0, mx = 0;
+	paInt mn = 0, mx = 0, de = 0;
 	int result = 0;
-	const char* t = pe->type + 1;
-	while (*t) if (*t == ' ') break; else t++;
-	if (sscanf(t, PA_INT_SCANF " " PA_INT_SCANF, &mn, &mx) == 2)
+	if (getMinMax(pe->type,mn,mx,de)>=2)
 		if (mn <= mx) // else if mn>mx then the min/max constraint makes no sense and there is no checking
 		{
@@ -894,9 +913,7 @@
 	if (pe->flags&PARAM_READONLY) return PSET_RONLY;
 	double xcopy = x; //only needed for messageOnExceedRange(): retain original, requested value of x because it may be changed below
-	double mn = 0, mx = 0;
+	double mn = 0, mx = 0, de = 0;
 	int result = 0;
-	const char* t = pe->type + 1;
-	while (*t) if (*t == ' ') break; else t++;
-	if (sscanf(t, "%lg %lg", &mn, &mx) == 2)
+	if (getMinMax(pe->type,mn,mx,de)>=2)
 		if (mn <= mx) // else if mn>mx then the min/max constraint makes no sense and there is no checking
 		{
Index: /cpp/frams/param/param.h
===================================================================
--- /cpp/frams/param/param.h	(revision 573)
+++ /cpp/frams/param/param.h	(revision 574)
@@ -144,4 +144,7 @@
 	int getMinMax(int prop, double& minumum, double& maximum, double& def);
 	int getMinMax(int prop, int& minumum, int& maximum, SString& def);
+	static int getMinMax(const char* type, paInt& minumum, paInt& maximum, paInt& def);
+	static int getMinMax(const char* type, double& minumum, double& maximum, double& def);
+	static int getMinMax(const char* type, int& minumum, int& maximum, SString& def);
 
 	virtual void setDefault();
