PowerCat 0 Posted August 2, 2011 I made a simple script to calculate my time card for work. For some reason, the GUICtrlSetData at the end returns error 0 every time and the $var doesn't get updated. $var is a "dynamically" generated variable that points to one of the $diff "Label" Apart from being really unoptimized and redundant, what am I doing wrong to get this error? Thanks. expandcollapse popup#include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <array.au3> #Include <Date.au3> $Form1 = GUICreate("Time card", 251, 217, 192, 124) $Label1 = GUICtrlCreateLabel("Time card calculator", 40, 8, 126, 20, BitOR($SS_CENTER,$SS_CENTERIMAGE)) $Label2 = GUICtrlCreateLabel("Jeudi", 24, 40, 29, 17) $Label3 = GUICtrlCreateLabel("Vendredi", 8, 64, 46, 17) $Label4 = GUICtrlCreateLabel("Lundi", 24, 88, 30, 17) $Label5 = GUICtrlCreateLabel("Mardi", 24, 112, 30, 17) $Label6 = GUICtrlCreateLabel("Mercredi", 8, 136, 45, 17) $Input1 = GUICtrlCreateInput("", 56, 40, 41, 21) $Input2 = GUICtrlCreateInput("", 56, 64, 41, 21) $Input3 = GUICtrlCreateInput("", 56, 88, 41, 21) $Input4 = GUICtrlCreateInput("", 56, 112, 41, 21) $Input5 = GUICtrlCreateInput("", 56, 136, 41, 21) $Label7 = GUICtrlCreateLabel("à", 104, 40, 10, 17) $Label8 = GUICtrlCreateLabel("à", 104, 64, 10, 17) $Label9 = GUICtrlCreateLabel("à", 104, 88, 10, 17) $Label10 = GUICtrlCreateLabel("à", 104, 112, 10, 17) $Label11 = GUICtrlCreateLabel("à", 104, 136, 10, 17) $Input6 = GUICtrlCreateInput("", 120, 40, 41, 21) $Input7 = GUICtrlCreateInput("", 120, 64, 41, 21) $Input8 = GUICtrlCreateInput("", 120, 88, 41, 21) $Input9 = GUICtrlCreateInput("", 120, 112, 41, 21) $Input10 = GUICtrlCreateInput("", 120, 136, 41, 21) $Button1 = GUICtrlCreateButton("Calculate", 56, 168, 105, 33) $diff1 = GUICtrlCreateLabel("", 176, 40, 41, 21, $SS_BLACKFRAME) $diff2 = GUICtrlCreateLabel("", 176, 64, 41, 21, $SS_BLACKFRAME) $diff3 = GUICtrlCreateLabel("", 176, 112, 41, 21, $SS_BLACKFRAME) $diff4 = GUICtrlCreateLabel("", 176, 88, 41, 21, $SS_BLACKFRAME) $diff5 = GUICtrlCreateLabel("", 176, 136, 41, 21, $SS_BLACKFRAME) GUISetState(@SW_SHOW) GUICtrlSetData($input1, "7h30") GUICtrlSetData($input2, "7h30") GUICtrlSetData($input3, "7h30") GUICtrlSetData($input4, "7h30") GUICtrlSetData($input5, "7h30") GUICtrlSetData($input6, "16h00") GUICtrlSetData($input7, "16h00") GUICtrlSetData($input8, "16h00") GUICtrlSetData($input9, "16h00") GUICtrlSetData($input10, "16h00") While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Exit Case $msg = $Button1 GetTime() ;~ Exit EndSelect WEnd Func GetTime() Dim $times[10] $times[0] = GUICtrlRead($input1, 1) $times[1] = GUICtrlRead($input2, 1) $times[2] = GUICtrlRead($input3, 1) $times[3] = GUICtrlRead($input4, 1) $times[4] = GUICtrlRead($input5, 1) $times[5] = GUICtrlRead($input6, 1) $times[6] = GUICtrlRead($input7, 1) $times[7] = GUICtrlRead($input8, 1) $times[8] = GUICtrlRead($input9, 1) $times[9] = GUICtrlRead($input10, 1) ;~ _ArrayDisplay($times) #cs compare 0 to 5 1 to 6 2 to 7 3 to 8 4 to 9 #ce For $i = 0 to 9 $times[$i] = StringReplace($times[$i], "h", ":") $times[$i] = $times[$i] & ":00" $times[$i] = _NowCalcDate() & " " & $times[$i] Next ;~ _ArrayDisplay($times) Dim $diff[5] For $i = 0 to 4 $h = $i + 5 $diff[$i] = _DateDiff('n', $times[$i], $times[$h]) $diff[$i] = $diff[$i] - 60 $diff[$i] = $diff[$i] / 60 Next For $i = 0 to 4 $j = $i + 1 $var = "$diff" & $j ConsoleWrite($var & " val " & $diff[$i] & " err ") GUICtrlSetData($var, $diff[$i]) ConsoleWrite(@error & @CRLF) Next EndFunc Share this post Link to post Share on other sites
UEZ 1,295 Posted August 2, 2011 GUICtrlSetData($var, $diff[$i]) is wrong because $var is not a control!To which controls you want to write a value? $diff1 - $diff5?Br,UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Share this post Link to post Share on other sites
sleepydvdr 8 Posted August 2, 2011 I can think of a few better ways to do things, but I saw two problems with your code: 1. After calculating, you did not set the data to the output blocks. 2. You were using $SS_BLACKFRAME on a label. When I tried to set data to that, the block remained empty. I changed it to a read-only input box. Below are some modifications to your script that get it working. expandcollapse popup#include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <array.au3> #Include <Date.au3> $Form1 = GUICreate("Time card", 251, 217, 192, 124) $Label1 = GUICtrlCreateLabel("Time card calculator", 40, 8, 126, 20, BitOR($SS_CENTER,$SS_CENTERIMAGE)) $Label2 = GUICtrlCreateLabel("Jeudi", 24, 40, 29, 17) $Label3 = GUICtrlCreateLabel("Vendredi", 8, 64, 46, 17) $Label4 = GUICtrlCreateLabel("Lundi", 24, 88, 30, 17) $Label5 = GUICtrlCreateLabel("Mardi", 24, 112, 30, 17) $Label6 = GUICtrlCreateLabel("Mercredi", 8, 136, 45, 17) $Input1 = GUICtrlCreateInput("", 56, 40, 41, 21) $Input2 = GUICtrlCreateInput("", 56, 64, 41, 21) $Input3 = GUICtrlCreateInput("", 56, 88, 41, 21) $Input4 = GUICtrlCreateInput("", 56, 112, 41, 21) $Input5 = GUICtrlCreateInput("", 56, 136, 41, 21) $Label7 = GUICtrlCreateLabel("à", 104, 40, 10, 17) $Label8 = GUICtrlCreateLabel("à", 104, 64, 10, 17) $Label9 = GUICtrlCreateLabel("à", 104, 88, 10, 17) $Label10 = GUICtrlCreateLabel("à", 104, 112, 10, 17) $Label11 = GUICtrlCreateLabel("à", 104, 136, 10, 17) $Input6 = GUICtrlCreateInput("", 120, 40, 41, 21) $Input7 = GUICtrlCreateInput("", 120, 64, 41, 21) $Input8 = GUICtrlCreateInput("", 120, 88, 41, 21) $Input9 = GUICtrlCreateInput("", 120, 112, 41, 21) $Input10 = GUICtrlCreateInput("", 120, 136, 41, 21) $Button1 = GUICtrlCreateButton("Calculate", 56, 168, 105, 33) $diff1 = GUICtrlCreateInput("", 176, 40, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY)) $diff2 = GUICtrlCreateInput("", 176, 64, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY)) $diff3 = GUICtrlCreateInput("", 176, 112, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY)) $diff4 = GUICtrlCreateInput("", 176, 88, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY)) $diff5 = GUICtrlCreateInput("", 176, 136, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY)) GUISetState(@SW_SHOW) GUICtrlSetData($input1, "7h30") GUICtrlSetData($input2, "7h30") GUICtrlSetData($input3, "7h30") GUICtrlSetData($input4, "7h30") GUICtrlSetData($input5, "7h30") GUICtrlSetData($input6, "16h00") GUICtrlSetData($input7, "16h00") GUICtrlSetData($input8, "16h00") GUICtrlSetData($input9, "16h00") GUICtrlSetData($input10, "16h00") While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Exit Case $msg = $Button1 GetTime() ;~ Exit EndSelect WEnd Func GetTime() Dim $times[10] $times[0] = GUICtrlRead($input1, 1) $times[5] = GUICtrlRead($input6, 1) GUICtrlSetData($diff1, _CalcDiff($times[0], $times[5])) $times[1] = GUICtrlRead($input2, 1) $times[6] = GUICtrlRead($input7, 1) GUICtrlSetData($diff2, _CalcDiff($times[1], $times[6])) $times[2] = GUICtrlRead($input3, 1) $times[7] = GUICtrlRead($input8, 1) GUICtrlSetData($diff3, _CalcDiff($times[2], $times[7])) $times[3] = GUICtrlRead($input4, 1) $times[8] = GUICtrlRead($input9, 1) GUICtrlSetData($diff4, _CalcDiff($times[3], $times[8])) $times[4] = GUICtrlRead($input5, 1) $times[9] = GUICtrlRead($input10, 1) GUICtrlSetData($diff5, _CalcDiff($times[4], $times[9])) EndFunc Func _CalcDiff($time1, $time2) $time1 = StringReplace($time1, "h", ":") $time1 = $time1 & ":00" $time1 = _NowCalcDate() & " " & $time1 $time2 = StringReplace($time2, "h", ":") $time2 = $time2 & ":00" $time2 = _NowCalcDate() & " " & $time2 $diff = _DateDiff('n', $time1, $time2) $diff = $diff - 60 $diff = $diff / 60 Return ($diff) EndFunc #include <ByteMe.au3> Share this post Link to post Share on other sites
sleepydvdr 8 Posted August 2, 2011 Also, you could cut out 10 lines from your code by doing this: $Input1 = GUICtrlCreateInput("7h30", 56, 40, 41, 21) ; <--- Set the data here so you do not need the next line GUICtrlSetData($input1, "7h30") #include <ByteMe.au3> Share this post Link to post Share on other sites
PowerCat 0 Posted August 2, 2011 GUICtrlSetData($var, $diff[$i]) is wrong because $var is not a control! To which controls you want to write a value? $diff1 - $diff5? Br, UEZ So using (in the for loop) $j = $i + 1 $var = "$diff" & $j Doesn't make $var into a variable of that control? Share this post Link to post Share on other sites
PowerCat 0 Posted August 2, 2011 I can think of a few better ways to do things, but I saw two problems with your code: 1. After calculating, you did not set the data to the output blocks. 2. You were using $SS_BLACKFRAME on a label. When I tried to set data to that, the block remained empty. I changed it to a read-only input box. Below are some modifications to your script that get it working. expandcollapse popup#include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <array.au3> #Include <Date.au3> $Form1 = GUICreate("Time card", 251, 217, 192, 124) $Label1 = GUICtrlCreateLabel("Time card calculator", 40, 8, 126, 20, BitOR($SS_CENTER,$SS_CENTERIMAGE)) $Label2 = GUICtrlCreateLabel("Jeudi", 24, 40, 29, 17) $Label3 = GUICtrlCreateLabel("Vendredi", 8, 64, 46, 17) $Label4 = GUICtrlCreateLabel("Lundi", 24, 88, 30, 17) $Label5 = GUICtrlCreateLabel("Mardi", 24, 112, 30, 17) $Label6 = GUICtrlCreateLabel("Mercredi", 8, 136, 45, 17) $Input1 = GUICtrlCreateInput("", 56, 40, 41, 21) $Input2 = GUICtrlCreateInput("", 56, 64, 41, 21) $Input3 = GUICtrlCreateInput("", 56, 88, 41, 21) $Input4 = GUICtrlCreateInput("", 56, 112, 41, 21) $Input5 = GUICtrlCreateInput("", 56, 136, 41, 21) $Label7 = GUICtrlCreateLabel("à", 104, 40, 10, 17) $Label8 = GUICtrlCreateLabel("à", 104, 64, 10, 17) $Label9 = GUICtrlCreateLabel("à", 104, 88, 10, 17) $Label10 = GUICtrlCreateLabel("à", 104, 112, 10, 17) $Label11 = GUICtrlCreateLabel("à", 104, 136, 10, 17) $Input6 = GUICtrlCreateInput("", 120, 40, 41, 21) $Input7 = GUICtrlCreateInput("", 120, 64, 41, 21) $Input8 = GUICtrlCreateInput("", 120, 88, 41, 21) $Input9 = GUICtrlCreateInput("", 120, 112, 41, 21) $Input10 = GUICtrlCreateInput("", 120, 136, 41, 21) $Button1 = GUICtrlCreateButton("Calculate", 56, 168, 105, 33) $diff1 = GUICtrlCreateInput("", 176, 40, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY)) $diff2 = GUICtrlCreateInput("", 176, 64, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY)) $diff3 = GUICtrlCreateInput("", 176, 112, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY)) $diff4 = GUICtrlCreateInput("", 176, 88, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY)) $diff5 = GUICtrlCreateInput("", 176, 136, 41, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY)) GUISetState(@SW_SHOW) GUICtrlSetData($input1, "7h30") GUICtrlSetData($input2, "7h30") GUICtrlSetData($input3, "7h30") GUICtrlSetData($input4, "7h30") GUICtrlSetData($input5, "7h30") GUICtrlSetData($input6, "16h00") GUICtrlSetData($input7, "16h00") GUICtrlSetData($input8, "16h00") GUICtrlSetData($input9, "16h00") GUICtrlSetData($input10, "16h00") While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Exit Case $msg = $Button1 GetTime() ;~ Exit EndSelect WEnd Func GetTime() Dim $times[10] $times[0] = GUICtrlRead($input1, 1) $times[5] = GUICtrlRead($input6, 1) GUICtrlSetData($diff1, _CalcDiff($times[0], $times[5])) $times[1] = GUICtrlRead($input2, 1) $times[6] = GUICtrlRead($input7, 1) GUICtrlSetData($diff2, _CalcDiff($times[1], $times[6])) $times[2] = GUICtrlRead($input3, 1) $times[7] = GUICtrlRead($input8, 1) GUICtrlSetData($diff3, _CalcDiff($times[2], $times[7])) $times[3] = GUICtrlRead($input4, 1) $times[8] = GUICtrlRead($input9, 1) GUICtrlSetData($diff4, _CalcDiff($times[3], $times[8])) $times[4] = GUICtrlRead($input5, 1) $times[9] = GUICtrlRead($input10, 1) GUICtrlSetData($diff5, _CalcDiff($times[4], $times[9])) EndFunc Func _CalcDiff($time1, $time2) $time1 = StringReplace($time1, "h", ":") $time1 = $time1 & ":00" $time1 = _NowCalcDate() & " " & $time1 $time2 = StringReplace($time2, "h", ":") $time2 = $time2 & ":00" $time2 = _NowCalcDate() & " " & $time2 $diff = _DateDiff('n', $time1, $time2) $diff = $diff - 60 $diff = $diff / 60 Return ($diff) EndFunc Wow, much more effective to write a function that way. Makes it much less redundant and probably uses less cpu time. I realise now that "$SS_BLACKFRAME" made my control unupdatable, thanks for the creative use of style to make it look good after! Also, you could cut out 10 lines from your code by doing this: $Input1 = GUICtrlCreateInput("7h30", 56, 40, 41, 21) ; <--- Set the data here so you do not need the next line GUICtrlSetData($input1, "7h30") Oh good point. I had set that just for testing purposes, so I'm obviously commenting them out for the "final" version. Share this post Link to post Share on other sites