Index: /cpp/frams/param/param.cpp
===================================================================
--- /cpp/frams/param/param.cpp	(revision 795)
+++ /cpp/frams/param/param.cpp	(revision 796)
@@ -422,4 +422,22 @@
 }
 
+void SimpleAbstractParam::messageOnExceedRangeExtValue(int i, int setflags, ExtValue& valuetoset) ///< prints a warning when setflags indicates that allowed param range has been exceeded during set
+{
+	if (setflags & (PSET_HITMIN | PSET_HITMAX))
+	{
+		SString svaluetoset = valuetoset.getString(); //converts any type to SString
+		SString actual = get(i);
+		bool s_type = type(i)[0] == 's';
+		bool show_length = valuetoset.getType() == TString;
+		const char* quote = (valuetoset.getType() == TString) ? "\"" : "'";
+		logPrintf("Param", "set", LOG_WARN, "Setting %s.%s = %s exceeded allowed range (too %s). %s to %s.",
+			getName(), id(i),
+			::sstringDelimitAndShorten(svaluetoset, 30, show_length, quote, quote).c_str(),
+			(setflags&PSET_HITMAX) ? (s_type ? "long" : "big") : "small", s_type ? "Truncated" : "Adjusted",
+			::sstringDelimitAndShorten(actual, 30, show_length, quote, quote).c_str()
+			);
+	}
+}
+
 int ParamInterface::load(FileFormat format, VirtFILE* f, LoadOptions *options)
 {
@@ -526,5 +544,5 @@
 						fileinfo += SString::sprintf(" (line %d)", *options.linenum);
 				}
-				logPrintf("ParamInterface", "load", LOG_WARN, "Multiple '%s.%s' fields found%s", getName(), id(i), fileinfo.c_str());
+				logPrintf("ParamInterface", "load", LOG_WARN, "Multiple '%s.%s' properties found%s", getName(), id(i), fileinfo.c_str());
 			}
 			else
@@ -564,5 +582,5 @@
 		{
 			SString name(p0, p_len);
-			logPrintf("ParamInterface", "load", LOG_WARN, "Ignored unknown property '%s' while reading object '%s'", name.c_str(), getName());
+			logPrintf("ParamInterface", "load", LOG_WARN, "Ignored unknown property '%s.%s'", getName(), name.c_str());
 		}
 
@@ -640,5 +658,5 @@
 	case 'o':	ret.setObject(getObject(i)); break;
 	case 'x':	ret = getExtValue(i); break;
-	default: logPrintf("ParamInterface", "get", LOG_ERROR, "'%s.%s' is not a field", getName(), id(i));
+	default: logPrintf("ParamInterface", "get", LOG_ERROR, "'%s.%s' is not a property", getName(), id(i));
 	}
 }
@@ -710,5 +728,5 @@
 		break;
 	case 'x': return setExtValue(i, v);
-	default: logPrintf("ParamInterface", "set", LOG_ERROR, "'%s.%s' is not a field", getName(), id(i));
+	default: logPrintf("ParamInterface", "set", LOG_ERROR, "'%s.%s' is not a property", getName(), id(i));
 	}
 	return 0;
@@ -1267,5 +1285,5 @@
 			{
 				SString name(t, (int)(equals_sign - t));
-				logPrintf("Param", "load2", LOG_WARN, "Unknown property '%s' while reading object '%s' (ignored)", name.c_str(), getName());
+				logPrintf("Param", "loadSingleLine", LOG_WARN, "Unknown property '%s.%s' (ignored)", getName(), name.c_str());
 			}
 			t = equals_sign + 1; // t=value
@@ -1278,7 +1296,7 @@
 			{
 			if (id(i))
-				logPrintf("Param", "load2", LOG_WARN, "Missing property name in '%s' (assuming '%s')", getName(), id(i));
+				logPrintf("Param", "loadSingleLine", LOG_WARN, "Missing property name in '%s' (assuming '%s')", getName(), id(i));
 			else
-				logPrintf("Param", "load2", LOG_WARN, "Value after the last property of '%s'", getName());
+				logPrintf("Param", "loadSingleLine", LOG_WARN, "Value after the last property of '%s'", getName());
 			}
 #endif
@@ -1300,7 +1318,4 @@
 			ret = setFromString(i, value, true);
 			fields_loaded++;
-			if (ret&(PSET_HITMAX | PSET_HITMIN))
-				logPrintf("Param", "load2", LOG_WARN, "Adjusted '%s' in '%s' (was too %s)",
-				id(i), getName(), (ret&PSET_HITMAX) ? "big" : "small");
 			if (ret&PSET_PARSEFAILED)
 				parse_failed = true;
Index: /cpp/frams/param/param.h
===================================================================
--- /cpp/frams/param/param.h	(revision 795)
+++ /cpp/frams/param/param.h	(revision 796)
@@ -252,9 +252,4 @@
 };
 
-template<typename T> struct quote_in_messages { constexpr static const char* value = "'"; };
-template<> struct quote_in_messages < SString > { constexpr static const char* value = "\""; };
-template<typename T> struct length_in_messages { static const bool value = false; };
-template<> struct length_in_messages < SString > { static const bool value = true; };
-
 class SimpleAbstractParam : public virtual ParamInterface
 {
@@ -300,15 +295,9 @@
 		if (setflags & (PSET_HITMIN | PSET_HITMAX))
 		{
-			SString svaluetoset = SString::valueOf(valuetoset); //converts any type to SString
-			SString actual = get(i);
-			bool s_type = type(i)[0] == 's';
-			logPrintf("Param", "set", LOG_WARN, "Setting %s.%s = %s exceeded allowed range (too %s). %s to %s.",
-				getName(), id(i),
-				::sstringDelimitAndShorten(svaluetoset, 30, length_in_messages<T>::value, quote_in_messages<T>::value, quote_in_messages<T>::value).c_str(),
-				(setflags&PSET_HITMAX) ? (s_type ? "long" : "big") : "small", s_type ? "Truncated" : "Adjusted",
-				::sstringDelimitAndShorten(actual, 30, length_in_messages<T>::value, quote_in_messages<T>::value, quote_in_messages<T>::value).c_str()
-				);
+			ExtValue v(valuetoset);
+			messageOnExceedRangeExtValue(i, setflags, v);
 		}
 	}
+	void messageOnExceedRangeExtValue(int i, int setflags, ExtValue& valuetoset); ///< used by messageOnExceedRange() internally
 
 	int setInt(int, paInt);
