On 24-11-2010 12:28, Benoît Minisini wrote: >> On 24-11-2010 12:08, Benoît Minisini wrote: >>> Hi, >>> >>> I'm currently thinking about modifying/removing all IsXXXX() functions in >>> Gambas 3. >>> >>> They mainly test the datatype of their expression. So, either the >>> datatype is known at compile time, and there should be no need of >>> testing it ; either you are using a Variant, and you can use TypeOf() to >>> get the datatype of the value. >>> >>> I will replace them by some functions that will test if a value can be >>> converted safely from a string by using localization. This is what most >>> users expected from these functions. >>> >>> For exemple, in french localization: >>> IsDate("13/2/20") -> True >>> IsNumber("3,34") -> True >>> IsInteger("3,34") -> False >>> IsNumber("3.34") -> False >>> >>> Internally, they will use Val() and see if the conversion works. >>> >>> I will kept most of the name, so there will be a big incompatibility >>> between Gambas 2, current Gambas 3, and final Gambas 3. >>> >>> What do you think about that? >>> >>> Who is using the IsXXXX() functions, and in which context? >> I use these in my project, a lot less than expected at first: >> >> Bluetooth.module: IF IsInteger(Val(sRSSI)) THEN >> Bluetooth.module: iRSSI = IsInteger(Val(sRSSI)) >> Events.module: IF rResult!rerunenabled = TRUE AND IF >> IsDate(rResult!lastrun) THEN >> Events.module: IF IsBoolean(sValue) THEN sValue = Main.DisplayBool(sValue) >> Events.module: IF IsBoolean(sCond) THEN sCond = Main.DisplayBool(sCond) >> Events.module: ELSE IF IsBoolean(vResult) THEN >> JSON.module: IF NOT IsLetter(sCar) THEN RETURN sCar >> JSON.module: IF NOT IsLetter(sCar) THEN >> JSON.module: IF IsNull(vNumber) THEN Error.Raise("Incorrect number") >> JSON.module: ELSE IF sCar = "-" OR IF IsDigit(sCar) THEN >> Mail.module: IF IsString(Main.GlobalVar["Minute"]) THEN >> Main.GlobalVar["Minute"] = Val(Main.GlobalVar["Minute"]) >> Main.module: IF NOT IsNull(vValue) THEN >> Main.module: IF IsNumber(Val(tv[k, col].Text)) THEN >> Main.module: IF IsNumber(Val(gv[k, col].Text)) THEN >> Main.module:PUBLIC FUNCTION IsTime(sString AS String) AS Boolean >> Main.module:PUBLIC FUNCTION IsBool(sStr AS String) AS Boolean >> CDenon.class: IF IsInteger(sValue) THEN >> CDenon.class: IF IsInteger(sValue) THEN >> CDenon.class: IF IsNull(Val(sZonecat)) THEN >> CRFXComRX.class: IF IsDigit(Hex(RecBuf[4])) AND IF >> IsDigit(Hex(Lsr(RecBuf[3], 4))) THEN >> CSqueezeServer.class: ELSE IF IsLetter(sCar) OR IF IsDigit(sCar) OR >> IF InStr("*-._", sCar) THEN >> FConditionEditor.class: IF NOT >> (Main.IsBool(Events.EvalFormula(taFormula.Text))) THEN >> FConditionEditor.class: IF IsBoolean(vVal) THEN >> FDebug.class: IF IsBoolean(vValue) THEN >> FTriggerEditor.class: IF IsBoolean(Main.GlobalVar[cmbVariables.Text]) >> THEN >> FTriggerEditor.class: ELSE IF NOT >> IsNumber(Main.GlobalVar[cmbVariables.Text]) THEN >> FTriggerEditor.class: IF IsNumber(Val(txtDeviceValue.Text)) THEN >> >> Regards, >> Ron_2nd. >> > When you do IsNumber(Val(...)), you actually want the new behaviour I want to > implement: checking if a string can be safely converted to what you want. In > the new syntax, you will directly do IsNumber(...). > > The IsDigit(), IsLetter()... functions are not concerned by the change. > > IsNull() will be kept unchanged. > > Then, please tell me what you are testing exactly with these lines: > > Events.module: IF rResult!rerunenabled = TRUE AND IF > IsDate(rResult!lastrun) THEN
It appears to be just a test if the db record field has a date value in it, instead of an empty value. > Events.module: IF IsBoolean(sValue) THEN sValue = Main.DisplayBool(sValue) > Events.module: IF IsBoolean(sCond) THEN sCond = Main.DisplayBool(sCond) > Events.module: ELSE IF IsBoolean(vResult) THEN --- PUBLIC SUB CheckCondition(sValue AS Variant, sOperand AS String, sCond AS Variant, OPTIONAL bMute AS Boolean) AS Boolean DIM bReturn AS Boolean IF IsBoolean(sValue) THEN sValue = Main.DisplayBool(sValue) IF IsBoolean(sCond) THEN sCond = Main.DisplayBool(sCond) --- CheckConditions(), has variants as arguments. If the variant sValue is a Boolean, then change it to a string value with "True" "False" as content, so that conversion and compare tests (below) after that can be more generic. --- SELECT sOperand CASE "=" IF Comp(sValue, sCond) = 0 THEN bReturn = TRUE CASE "<>" IF sValue <> sCond THEN bReturn = TRUE CASE ">" IF CFloat(Replace(sValue, ",", ".", gb.String)) > CFloat(Replace(sCond, ",", ".", gb.String)) THEN bReturn = TRUE CASE "<" IF CFloat(Replace(sValue, ",", ".", gb.String)) < CFloat(Replace(sCond, ",", ".", gb.String)) THEN bReturn = TRUE CASE ELSE IF Main.bEventsDebug THEN Main.WriteDebugLog(("[Events] 2c. Unsupported operand '" & sOperand & "' found!")) END SELECT IF Main.bEventsDebug AND IF NOT bMute THEN Main.WriteDebugLog(("[Events] 2c. Check condition '") & sValue & " " & sOperand & " " & sCond & "' = " & Main.DisplayBool(bReturn)) RETURN bReturn CATCH IF Main.bEventsDebug THEN Main.WriteDebugLog(("[Events] 2c. Invalid comparison in CheckCondition() routine!")) RETURN FALSE END --- > Mail.module: IF IsString(Main.GlobalVar["Minute"]) THEN > Main.GlobalVar["Minute"] = Val(Main.GlobalVar["Minute"]) Just seems to be checks to see if the variant value from that collection isn't empty, to prevent errors. > CDenon.class: IF IsInteger(sValue) THEN > CDenon.class: IF IsInteger(sValue) THEN TRY sValue = Val(sValue) IF IsInteger(sValue) THEN sValue = sValue + 80 ELSE IF UCase(sValue) = "OFF" THEN sValue = 99 ENDIF To see if sValue contains a decibel value -18...80 , or on/off/up/down. > FConditionEditor.class: IF IsBoolean(vVal) THEN TRY vVal = Main.GlobalVar[Right(tvVariables.Current.Key, Len(tvVariables.Current.Key) - 4)] IF IsBoolean(vVal) THEN sVal = Main.DisplayBool(vVal) ELSE sVal = vVal ENDIF vVal can be strings, numbers or booleans, if its a boolean, change it to "True", "False", otherwise just a T or nothing is shown in TableView. > FDebug.class: IF IsBoolean(vValue) THEN Same here. > FTriggerEditor.class: IF IsBoolean(Main.GlobalVar[cmbVariables.Text]) > THEN > FTriggerEditor.class: ELSE IF NOT > IsNumber(Main.GlobalVar[cmbVariables.Text]) THEN > If value is a boolean, disable compare checkboxes <, > , on form, just have = and <> enabled, if it's a number allow, < and > too as operand for trigger rules in my event/trigger editor. Regards, Ron_2nd. ------------------------------------------------------------------------------ Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! Tap into the largest installed PC base & get more eyes on your game by optimizing for Intel(R) Graphics Technology. Get started today with the Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. http://p.sf.net/sfu/intelisp-dev2dev _______________________________________________ Gambas-user mailing list Gambas-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gambas-user