Rhazz Posted October 31, 2015 Posted October 31, 2015 (edited) Hello again, my second post in 24 hs! It's my first GUI... and my first progress bar also! Sorry if I make a newbie mistake.I want to configure a GUI Progress Bar by a double "for" loop.Here is my code with a specific annotation with what I want to do:Edit: new problem, I have no idea how can I continue with the next $a as if the current $a, I do not skip it because the line is an element less (I need help with both problems):expandcollapse popup#include <GUIConstantsEx.au3> #include <EditConstants.au3> #include <WinAPI.au3> #include <File.au3> #include <String.au3> #include <Array.au3> Local $idGUI = GUICreate("ProgressBar", 220, 130, 100, 200) Opt("GUIOnEventMode", 1) GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEButton") Local $idInput = GUICtrlCreateInput("",80,20,60,20,$ES_NUMBER) Local $idProgressBar = GUICtrlCreateProgress(10, 60, 200, 20) Local $idButton1 = GUICtrlCreateButton("Start",85,100,50) GUICtrlSetOnEvent($idButton1, "StartProgressBar") Local $aFileOpen = _WinAPI_GetOpenFileName("Open a text file", "Text Files (*.txt)") Local $idCountLines = _FileCountLines($aFileOpen[2]) Local $idInputValue, $idSomething, $aFileResult, $idStringBetween GUISetState(@SW_SHOW, $idGUI) While 1 Sleep(20000) WEnd Func StartProgressBar() If StringInStr($aFileOpen[2], ".txt") = True Then $idInputValue = Int(GUICtrlRead($idInput)) If IsFloat($idCountLines/$idInputValue) = 1 Then $idStringBetween = _StringBetween(String($idCountLines/$idInputValue),"", ".") $idSomething = Number($idStringBetween[0]) + 1 Else $idSomething = $idCountLines/$idInputValue EndIf For $i = 1 To $idSomething $aFileResult = @ScriptDir & "\result-" & $i & ".txt" _FileCreate($aFileResult) FileOpen($aFileResult,2) For $a = ( ( ( $i - 1 ) * $idInputValue ) + 1 ) To ( $i * $idInputValue ) If FileReadLine($aFileOpen[2], $a) = "" Then ; Here I have no idea how can I continue with the next $a as if the current $a, I do not skip it because the line is an element less EndIf FileWrite($aFileResult,FileReadLine($aFileOpen[2], $a) & " - ") ;Here I want to set the progress bar value = current percentage (line that it is currently reading) of the 100% (total of lines in the file opened) Next FileClose($aFileResult) Next MsgBox(0,"Done","Done") GUICtrlSetData($idProgressBar,0) Else MsgBox(0,"Hello :)","Please open a file :D") EndIf EndFunc Func CLOSEButton() Exit EndFunc Thanks in advance. Edited October 31, 2015 by Rhazz New problem added
Danyfirex Posted November 1, 2015 Posted November 1, 2015 (edited) First you need to get the percentage based on the multiplication of loop ($i*$a) real loops. then divide progressbar size by that multiplication.100/($i*$a) that will result that number of necessary movement that you will use on loop. Finally you will get something like this.expandcollapse popup#include <GUIConstantsEx.au3> #include <ProgressConstants.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 374, 115, 192, 124) $Progress1 = GUICtrlCreateProgress(16, 24, 345, 49) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### Local $i=300-100 Local $a=200 Local $imove=100/($i*$a) Local $itemp=0 For $i= 100 to 300 For $a=1 to 200 $itemp+=$imove GUICtrlSetData($Progress1,$itemp) ;for continue with the next $a just use ContinueLoop Next $itemp+=$imove GUICtrlSetData($Progress1,$itemp) Next ConsoleWrite($itemp & @CRLF) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Saludos Edited November 1, 2015 by Danyfirex Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut
Rhazz Posted November 3, 2015 Author Posted November 3, 2015 First you need to get the percentage based on the multiplication of loop ($i*$a) real loops. then divide progressbar size by that multiplication.100/($i*$a) that will result that number of necessary movement that you will use on loop. Finally you will get something like this.expandcollapse popup#include <GUIConstantsEx.au3> #include <ProgressConstants.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Form1", 374, 115, 192, 124) $Progress1 = GUICtrlCreateProgress(16, 24, 345, 49) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### Local $i=300-100 Local $a=200 Local $imove=100/($i*$a) Local $itemp=0 For $i= 100 to 300 For $a=1 to 200 $itemp+=$imove GUICtrlSetData($Progress1,$itemp) ;for continue with the next $a just use ContinueLoop Next $itemp+=$imove GUICtrlSetData($Progress1,$itemp) Next ConsoleWrite($itemp & @CRLF) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd SaludosSpanish: Veo que hablás español, así que hola! "ContinueLoop" salta la linea del primer archivo y no la agrega a la linea del segundo archivo, ejemplo:Línea 1 - Línea 2 - Línea 3 -Línea 5 - Línea 6 - Línea 7- Línea 8 -Si te fijas, saltó la línea 4 (suponiendo que está vacía). Igualmente tengo que mirarlo con detenimiento para ver qué puedo hacer, pero no he tenido tiempo. English: Hi, with ContinueLoop the script skips the empty line (of the first file) and therefore there is an element less in the line of the second file (the empty line of the first file becomes into empty space in the second file). e.g. the user wants four lines (of the 1st file) per line (of the 2nd file) and the fourth line (of the 1st file) is empty:Line 1 - Line 2 - Line 3 -Line 5 - Line 6 - Line 7 - Line 8In the first line there is an element less.Whatever, I have to try it again, these days I didn't have much time.
Danyfirex Posted November 3, 2015 Posted November 3, 2015 Si fijate en la ayuda y notaras un ejemplo que continueloop esquiva un determinado loop.Yes look into help file and you will notice an example that continuwloop avoid a determined loop. Saludos Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut
Rhazz Posted November 3, 2015 Author Posted November 3, 2015 Si fijate en la ayuda y notaras un ejemplo que continueloop esquiva un determinado loop.Yes look into help file and you will notice an example that continuwloop avoid a determined loop. SaludosI said that ContinueLoop doesn't work, I want to skip a line, not skip a loop. Sorry if I didn't explain me well. Here are another example with the code:expandcollapse popup#include <GUIConstantsEx.au3> #include <EditConstants.au3> #include <WinAPI.au3> #include <File.au3> #include <String.au3> #include <Array.au3> Local $idGUI = GUICreate("ProgressBar", 220, 130, 100, 200) Opt("GUIOnEventMode", 1) GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEButton") Local $idInput = GUICtrlCreateInput("",80,20,60,20,$ES_NUMBER) Local $idProgressBar = GUICtrlCreateProgress(10, 60, 200, 20) Local $idButton1 = GUICtrlCreateButton("Start",85,100,50) GUICtrlSetOnEvent($idButton1, "StartProgressBar") Local $aFileOpen = _WinAPI_GetOpenFileName("Open a text file", "Text Files (*.txt)") Local $idCountLines = _FileCountLines($aFileOpen[2]) Local $idInputValue, $idSomething, $aFileResult, $idStringBetween GUISetState(@SW_SHOW, $idGUI) While 1 Sleep(20000) WEnd Func StartProgressBar() If StringInStr($aFileOpen[2], ".txt") = True Then $idInputValue = Int(GUICtrlRead($idInput)) If IsFloat($idCountLines/$idInputValue) = 1 Then $idStringBetween = _StringBetween(String($idCountLines/$idInputValue),"", ".") $idSomething = Number($idStringBetween[0]) + 1 Else $idSomething = $idCountLines/$idInputValue EndIf For $i = 1 To $idSomething $aFileResult = @ScriptDir & "\result-" & $i & ".txt" _FileCreate($aFileResult) FileOpen($aFileResult,2) For $a = ( ( ( $i - 1 ) * $idInputValue ) + 1 ) To ( $i * $idInputValue ) If FileReadLine($aFileOpen[2], $a) = "" Then ; ContinueLoop ; Here I have no idea how can I continue with the next $a as if the current $a, I do not skip it because the line is an element less EndIf GUICtrlSetData($idProgressBar, (100/($i*$a))) MsgBox(0,"",(100/($i*$a))) FileWrite($aFileResult,FileReadLine($aFileOpen[2], $a) & " - ") ; Here I want to set the progress bar value = current percentage (line that it is currently reading) of the 100% (total of lines in the file opened) Next FileClose($aFileResult) Next MsgBox(0,"Done","Done") Sleep(5000) GUICtrlSetData($idProgressBar,0) Else MsgBox(0,"Hello :)","Please open a file :D") EndIf EndFunc Func CLOSEButton() Exit EndFuncWith a first text file that contains:Line1Line2Line3Line4Line6Line7Line8Line9Line10Line11Line12And if the user introduces "6" the result is:result-1.txt --> Line1 - Line2 - Line3 - Line4 - Line6 - (five lines, the user wants six)result-2.txt --> Line7 - Line8 - Line9 - Line10 - Line11 - Line12 - (six lines, great)I have been reading the Help File and I think that there are two options that might work:Read the text file and create a temporary file without blank lines, and use it to create the final text file.Try to use _FileReadToArrayWhat do you think about it? What is most effectively? Are there a better option?And with that code, the progress bar works wrong :s I didn't find the correct operation, I think that might it works with _FileReadToArray (the total of it would be 100% and the current row/position would be the current percentage).PS: I also think maybe using _FileReadToArray might be too much work for big text files... I'm wrong?
Danyfirex Posted November 4, 2015 Posted November 4, 2015 Simply check for a not empty line. also create a variable counter to plus one every time that is not emply line instead using $i. Saludos Danysys.com AutoIt... UDFs: VirusTotal API 2.0 UDF - libZPlay UDF - Apps: Guitar Tab Tester - VirusTotal Hash Checker Examples: Text-to-Speech ISpVoice Interface - Get installed applications - Enable/Disable Network connection PrintHookProc - WINTRUST - Mute Microphone Level - Get Connected NetWorks - Create NetWork Connection ShortCut
Rhazz Posted November 4, 2015 Author Posted November 4, 2015 (edited) Simply check for a not empty line. also create a variable counter to plus one every time that is not emply line instead using $i. SaludosThat doesn't work because I need to exclude the empty lines, but what you say will return the numbers of non-empty lines and the script will read that numbers of lines but without skip the blank lines.A good news: Finally I could set the progress bar! It works now! I used "Total Of Lines" / ("Current Line" * 100)Finally I got the solution!!!!I created another variable to set what line have to read the script. Here is my full code, I hope be helpful for somebody expandcollapse popup#include <GUIConstantsEx.au3> #include <EditConstants.au3> #include <WinAPI.au3> #include <File.au3> #include <String.au3> #include <Array.au3> Local $idGUI = GUICreate("ProgressBar", 220, 130, 100, 200) Opt("GUIOnEventMode", 1) GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEButton") Local $idInput = GUICtrlCreateInput("",80,20,60,20,$ES_NUMBER) Local $idProgressBar = GUICtrlCreateProgress(10, 60, 200, 20) Local $idButton1 = GUICtrlCreateButton("Start",85,100,50) GUICtrlSetOnEvent($idButton1, "StartProgressBar") Local $aFileOpen = _WinAPI_GetOpenFileName("Open a text file", "Text Files (*.txt)") Local $idCountLines = _FileCountLines($aFileOpen[2]) Local $idInputValue, $idSomething, $aFileResult, $idStringBetween, $LineToRead, $totalNonEmptyLines For $y = 1 To $idCountLines If FileReadLine($aFileOpen[2],$y) <> "" Then $totalNonEmptyLines += 1 Next GUISetState(@SW_SHOW, $idGUI) While 1 Sleep(20000) WEnd Func StartProgressBar() If StringInStr($aFileOpen[2], ".txt") = True Then $idInputValue = Int(GUICtrlRead($idInput)) If IsFloat($totalNonEmptyLines/$idInputValue) = 1 Then $idStringBetween = _StringBetween(String($totalNonEmptyLines/$idInputValue),"", ".") $idSomething = Number($idStringBetween[0]) + 1 Else $idSomething = $totalNonEmptyLines/$idInputValue EndIf For $i = 1 To $idSomething $aFileResult = @ScriptDir & "\result-" & $i & ".txt" _FileCreate($aFileResult) FileOpen($aFileResult,2) For $a = ( ( ( $i - 1 ) * $idInputValue ) + 1 ) To ( $i * $idInputValue ) $LineToRead += 1 While FileReadLine($aFileOpen[2], $LineToRead) = "" $LineToRead += 1 If $a = $idCountLines Then ExitLoop WEnd GUICtrlSetData($idProgressBar, (($LineToRead*100)/$totalNonEmptyLines)) FileWrite($aFileResult,FileReadLine($aFileOpen[2], $LineToRead) & " - ") Next FileClose($aFileResult) Next MsgBox(0,"Done","Done") GUICtrlSetData($idProgressBar,0) Else MsgBox(0,"Hello :)","Please open a file :D") EndIf EndFunc Func CLOSEButton() Exit EndFunc Edited November 4, 2015 by Rhazz Finally solved!
alien4u Posted March 13, 2016 Posted March 13, 2016 This is an Old post but anyways here an Advise: Why you dont use Round(), you will avoid unnecessary call to _StringBetween? Your Code: If IsFloat($totalNonEmptyLines/$idInputValue) = 1 Then $idStringBetween = _StringBetween(String($totalNonEmptyLines/$idInputValue),"", ".") $idSomething = Number($idStringBetween[0]) + 1 What I would probably do: If IsFloat($totalNonEmptyLines/$idInputValue) = 1 Then $id = Round($totalNonEmptyLines/$idInputValue),0) $idnum = Number($id + 1) This is just an Idea but I think is more efficient. Kind Regards Alien
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now