Post by Walt Decker on Sept 19, 2022 12:24:09 GMT -5
In the course of updating the Liberty Basic version of the PV app I have come across a curious run-time error. The error is INVALID DEVICE HANDLE.
It seems that when defining controls base on certain criteria LB is discarding the handle of the first control while retaining the handles of following controls. I do not know whether this is related to LB's inability to correctly use variables for control placement or a combination of that and other factors. I can work around it, but it is a donkey tail pain.
Test code follows:
RetVal = FN.CreateMedData(Choice)
WAIT
'---------------------------------------------
'---------------------------------------------
FUNCTION FN.CreateMedData(Choice)
SS.CENTER = HEXDEC("&H00000001")
SS.CENTERIMAGE = HEXDEC("&H00000200")
ES.NUMBER = HEXDEC("&H2000")
DIM Ctly$(5, 9)
DIM Bits(4) '<--- simulate a 5-bit byte
Ctl$ = ""
Yp = 0
Xp = 0
Xw = 0
Yh = 0
Ubnd = 0
I = 0
Bits(0) = 1
Bits(1) = 1
Bits(2) = 1
STYLEBITS #ENTER.LBLDATE, SS.CENTER OR SS.CENTERIMAGE, 0, 0, 0
STYLEBITS #ENTER.LBLTIME, SS.CENTER OR SS.CENTERIMAGE, 0, 0, 0
STYLEBITS #ENTER.LBLEXER, SS.CENTER OR SS.CENTERIMAGE, 0, 0, 0
STATICTEXT #ENTER.LBLDATE, "DATE", 5, 7, 80, 15
STATICTEXT #ENTER.LBLTIME, "TIME", 5, 35, 80, 15
STATICTEXT #ENTER.LBLEXER, "EXERCISE Y/N", 5, 66, 80, 15
TEXTBOX #ENTER.TXBDATE, 86, 5, 68, 20
TEXTBOX #ENTER.TXBTIME, 86, 32, 68, 20
TEXTBOX #ENTER.TXBEXER, 86, 64, 68, 20
TRACE 2
Ubnd = -1
Yp = 72
FOR I = 0 TO 4
IF Bits(I) THEN
SELECT CASE I
CASE 0
Ubnd = Ubnd + 1
STYLEBITS #ENTER.LBLWEIGHT, SS.CENTER OR SS.CENTERIMAGE, 0, 0, 0
STATICTEXT #ENTER.LBWEIGHT, "WEIGHT", 5, Yp, 80, 15
TEXTBOX #ENTER.TXBWEIGHT, 86, Yp, 68, 20
Ctly$(Ubnd, 0) = "#ENTER.LBLWEIGHT"
Ctly$(Ubnd, 1) = "#ENTER.TXBWEIGHT"
Ctly$(Ubnd, 2) = "5"
Ctly$(Ubnd, 3) = STR$(Yp)
Ctly$(Ubnd, 4) = "80"
Ctly$(Ubnd, 5) = "15"
Ctly$(Ubnd, 6) = "86"
Ctly$(Ubnd, 7) = STR$(Yp)
Ctly$(Ubnd, 8) = "68"
Ctly$(Ubnd, 9) = "20"
Yp = Yp + 24
CASE 1
Ubnd = Ubnd + 1
STYLEBITS #ENTER.LBLO2, SS.CENTER OR SS.CENTERIMAGE, 0, 0, 0
STATICTEXT #ENTER.LBLO2, "%OXYGEN", 5, Yp, 80, 15
STYLEBITS #ENTER.TXBO2, ES.NUMBER, 0, 0, 0
TEXTBOX #ENTER.TXBO2, 86, Yp, 68, 20
Ctly$(Ubnd, 0) = "#ENTER.LBLO2"
Ctly$(Ubnd, 1) = "#ENTER.TXBO2"
Ctly$(Ubnd, 3) = STR$(Yp)
Ctly$(Ubnd, 2) = "5"
Ctly$(Ubnd, 4) = "80"
Ctly$(Ubnd, 5) = "15"
Ctly$(Ubnd, 6) = "86"
Ctly$(Ubnd, 7) = STR$(Yp)
Ctly$(Ubnd, 8) = "68"
Ctly$(Ubnd, 9) = "20"
Yp = Yp + 24
CASE 2
Ubnd = Ubnd + 1
STYLEBITS #ENTER.LBLHR, SS.CENTER OR SS.CENTERIMAGE, 0, 0, 0
STATICTEXT #ENTER.LBLHR, "HEART RATE", 5, Yp, 80, 15
STYLEBITS #ENTER.TXBHR, ES.NUMBER, 0, 0, 0
TEXTBOX #ENTER.TXBHR, 86, Yp, 68, 20
Ctly$(Ubnd, 0) = "#ENTER.LBLHR"
Ctly$(Ubnd, 1) = "#ENTER.TXBHR"
Ctly$(Ubnd, 3) = STR$(Yp)
Ctly$(Ubnd, 2) = "5"
Ctly$(Ubnd, 4) = "80"
Ctly$(Ubnd, 5) = "15"
Ctly$(Ubnd, 6) = "86"
Ctly$(Ubnd, 7) = STR$(Yp)
Ctly$(Ubnd, 8) = "68"
Ctly$(Ubnd, 9) = "20"
Yp = Yp + 24
CASE 3
Ubnd = Ubnd + 1
STYLEBITS #ENTER.LBLBR, SS.CENTER OR SS.CENTERIMAGE, 0, 0, 0
STATICTEXT #ENTER.LBLBR, "RESPIRATION", 5, Yp, 80, 15
STYLEBITS #ENTER.TXBBR, ES.NUMBER, 0, 0, 0
TEXTBOX #ENTER.TXBBR, 86, Yp, 68, 20
Ctly$(Ubnd, 0) = "#ENTER.LBLBR"
Ctly$(Ubnd, 1) = "#ENTER.TXBBR"
Ctly$(Ubnd, 3) = STR$(Yp)
Ctly$(Ubnd, 2) = "5"
Ctly$(Ubnd, 4) = "80"
Ctly$(Ubnd, 5) = "15"
Ctly$(Ubnd, 6) = "86"
Ctly$(Ubnd, 7) = STR$(Yp)
Ctly$(Ubnd, 8) = "68"
Ctly$(Ubnd, 9) = "20"
Yp = Yp + 24
CASE 4
Ubnd = Ubnd + 1
STYLEBITS #ENTER.LBLSY, SS.CENTER OR SS.CENTERIMAGE, 0, 0, 0
STATICTEXT #ENTER.LBLSY, "SYSTOLIC", 5, Yp, 80, 15
STYLEBITS #ENTER.TXBSY, ES.NUMBER, 0, 0, 0
TEXTBOX #ENTER.TXBSY, 86, Yp, 68, 20
Ctly$(Ubnd, 0) = "#ENTER.LBLSY"
Ctly$(Ubnd, 1) = "#ENTER.TXBSY"
Ctly$(Ubnd, 3) = STR$(Yp)
Ctly$(Ubnd, 2) = "5"
Ctly$(Ubnd, 4) = "80"
Ctly$(Ubnd, 5) = "15"
Ctly$(Ubnd, 6) = "86"
Ctly$(Ubnd, 7) = STR$(Yp)
Ctly$(Ubnd, 8) = "68"
Ctly$(Ubnd, 9) = "20"
Yp = Yp + 24
Ubnd = Ubnd + 1
STYLEBITS #ENTER.LBLDY, SS.CENTER OR SS.CENTERIMAGE, 0, 0, 0
STATICTEXT #ENTER.LBLDY, "SYSTOLIC", 5, Yp, 80, 15
STYLEBITS #ENTER.TXBDY, ES.NUMBER, 0, 0, 0
TEXTBOX #ENTER.TXBDY, 86, Yp, 68, 20
Ctly$(Ubnd, 0) = "#ENTER.LBLDY"
Ctly$(Ubnd, 1) = "#ENTER.TXBDY"
Ctly$(Ubnd, 3) = STR$(Yp)
Ctly$(Ubnd, 2) = "5"
Ctly$(Ubnd, 4) = "80"
Ctly$(Ubnd, 5) = "15"
Ctly$(Ubnd, 6) = "86"
Ctly$(Ubnd, 7) = STR$(Yp)
Ctly$(Ubnd, 8) = "68"
Ctly$(Ubnd, 9) = "20"
END SELECT
END IF
NEXT I
OPEN "ENTER" FOR WINDOW AS #ENTER
TRACE 2
PRINT "TRACING"
Ctl$ = Ctly$(1, 0)
H = HWND(#Ctl$)
PRINT "HANDLE OF Ctl$(1, 0) = ";Ctl$, H
Ctl$ = Ctly$(0, 0)
Copy Code
PRINT Ctl$
H = HWND(#Ctl$) '<--- error here; first ctrl tag discarded
EXIT FUNCTION
FOR I = 0 TO Ubnd
Ctl$ = Ctly$(I, 0)
Xp = VAL(Ctly$(I, 2))
Yp = VAL(Ctly$(I, 3))
Xw = VAL(Ctly$(I, 4))
Yh = VAL(Ctly$(I, 5))
PRINT #Ctl$, "!LOCATE ";Xp;" ";Yp;" ";Xw;" "; Yh
NEXT I
PRINT #ENTER, "REFRESH"
FN.CreateMedData = Ubnd
END FUNCTION