GUI Prozessbalken

  • Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <array.au3>
    #include <file.au3>
    #include <Process.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $szDrive, $szDir, $szFName, $szExt, $Progress1, $Group1, $Group2, $Button1, $Pic2
    Dim $StartPfad, $FileTyp, $Pic1, $Button2, $aFiles, $datei, $Datei_oE
    Dim $nMsg, $Label2, $TxtDatei, $bFileExists, $Array, $i_ShowOver4000, $Label1

    [/autoit] [autoit][/autoit] [autoit]

    $TxtDatei = FileOpen("test.txt", 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Konverter", 496, 424, 301, 346)
    GUISetBkColor(0xFFFFFF)
    $Pic1 = GUICtrlCreatePic("D:\firma\Bild.gif", 8, 0, 471, 123)
    $Group2 = GUICtrlCreateGroup("Beschreibung", 8, 136, 481, 225)
    $Button2 = GUICtrlCreateButton("Logfile", 24, 320, 65, 25, 0)
    GUICtrlSetColor(-1, 0xC0C0C0)
    $Label1 = GUICtrlCreateLabel("Es werden nach allen .tcd gesucht, dann werden diese nacheinander mit CAD6 geöffnet und in einem neuen Format (.dwg) gespeichert.", 16, 180, 460, 60)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    $Label2 = GUICtrlCreateLabel("Bitte arbeiten Sie nicht weiter, bis das Programm fertig ist.", 16, 240, 468, 73)
    GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("Start", 312, 384, 137, 25, 0)
    $Progress1 = GUICtrlCreateProgress(24, 384, 257, 25)
    GUICtrlSetColor(-1,0xff0000)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    $TxtDatei = FileOpen("test.txt", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $Button1

    $StartPfad = "D:\"

    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')

    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    $FileTyp = "tcd"
    $aFiles = _GetFilesFolder_Rekursiv($StartPfad, $FileTyp, 0)

    ;$Array = _ArrayDisplay ($aFiles, "Alle Dateien mit der Endung: " & $FileTyp, $i_ShowOver4000)

    For $i = 1 to _ArrayMax($aFiles)
    $datei = $aFiles[$i]
    $Datei_oE = StringTrimRight($datei, 3) & "dwg"

    If FileExists($Datei_oE) Then
    FileDelete($Datei_oE)
    ;MsgBox (0, "", "erste löschen")
    EndIf

    ProcessWaitClose ( "CAD6.exe")

    Sleep(1000)
    ShellExecute($datei, "", "", "open", @SW_HIDE)
    ; @SW_MINIMIZE
    ; @SW_HIDE
    ; @SW_MAXIMIZE

    WinWait("Technobox CAD6")
    sleep(2000)
    Controlsend("Technobox CAD6", "", "CAD4draw1", "{F12}")
    sleep(1000)
    Controlsend("Zeichnung speichern unter", "", "Edit1", $Datei_oE)
    sleep(1000)
    WinWait("Zeichnung speichern unter")
    Controlsend("Zeichnung speichern unter", "", "Edit1","{TAB}")
    sleep(1000)
    Controlsend("Zeichnung speichern unter", "", "ComboBox2","zdd")
    sleep(1000)
    Controlsend("Zeichnung speichern unter", "", "Button2","!s")
    sleep(1000)
    WinWait("DWG Export")
    Controlsend("DWG Export", "", "Button7", "{Enter}")
    $bFileExists = False
    While $bFileExists = False
    If FileExists($Datei_oE) Then
    $bFileExists = True
    FileWriteLine($TxtDatei, "000 || ")
    FileWriteLine($TxtDatei, "001 || " & $datei)
    FileWriteLine($TxtDatei, "002 || " & $Datei_oE & " erstellt!")
    EndIf
    Sleep(1000)
    WEnd

    Do
    Until $bFileExists = true
    ProcessClose ("CAD6.exe")

    Next

    [/autoit] [autoit][/autoit] [autoit]

    Case $Button2
    $TxtDatei = FileOpen("test.txt", 1)
    ShellExecute("test.txt")
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Das ist mein Programm (Script). Es läuft wunderbar. Ich möchte nun nur noch ein paar Schönheitskorrekturen machen, damit ich dann ganz zufrieden bin.
    Das Programm CAD6 wird ja versteckt ausgeführt. Damit ich meine schöne GUI sehe. ;)

    Nun möchte ich während das Script läuft meine GUI an verschiedenen Stellen vom Aussehen ändern.

    Zum Beispiel habe ich $Label1 und $Label2, wenn das Script dann starte (wenn ich auf $Button1 drücke) soll sich der Text vom $Label1 ändern.
    Von: "Es werden nach allen .tcd gesucht, dann werden diese nacheinander mit CAD6 geöffnet und in einem neuen Format (.dwg) gespeichert."
    In: "aktuelle Zeichnung, die bearbeitet wird: " & $datei
    + Prozessbalken

    Ich habe jetzt noch sowenig Ahnung, dass ich noch nichtmal weiß, wie ich meinen ersten Prozessbalken ($Progress1 = GUICtrlCreateProgress(24, 384, 257, 25)) machen soll. Das wär dann meine nächste Frage.

    Ist mein Vorhaben überhaupt möglich? Wo bekomme ich Hilfe her? Gibt es hilfreiche Links, die mir helfen?
    Im Bezug auf meinem Vorhaben finde ich nix in der Hilfedatei, an das ich mich klammern kann. Dort ist es zu "allgemein", für mein Wissen. Und/oder ich weiss nicht, wonach ich suchen soll (Befehle meine ich).

    Ich hoffe, ich komm mit euren Ideen und Vorschläge weiter. Auch wenn ihr mir vielleicht nur einen Befehl an den Kopf werft. Den schlag ich dann sofort nach, bis ich weiter "heule". ;)

    3 Mal editiert, zuletzt von Xethria (30. Oktober 2008 um 16:45)

  • Also:

    Spoiler anzeigen
    [autoit]

    GUICreate("Label" , 100, 100)
    $label = GUICtrlCreateLabel("Text1", 5, 5)
    GUISetState()
    Sleep(2000)
    GUICtrlSetData($label, "Text2")
    GUISetState(@SW_HIDE) ;fenster1 wieder zumachen

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(1000) ;sec warten

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Progress", 100, 100)
    $progress = GUICtrlCreateProgress(5, 5)
    GUICtrlSetState($progress, @SW_HIDE) ;erstmal unsichtbar machen
    GUISetState()
    Sleep(2000)
    GUICtrlSetState($progress, @SW_SHOW) ;sichtbar machen
    For $i = 1 To 100
    GUICtrlSetData($progress, $i) ;den progress laufen lassen
    Sleep(100) ;damits nicht zu schnell geht^^
    Next

    [/autoit]

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

    Einmal editiert, zuletzt von FireFlyer (28. Oktober 2008 um 12:02)

  • Vielen Dank für eure schnellen Antworten, dann gruschel ich mal rum. Ma gucken was rauskommt. Danke.

  • Es sieht so toll aus! Danke! mit GUICtrlSetData() konnt ich all meinen Blödsinn umsetzen. :thumbup:

    Nur..... :S
    Die Prozessbalken/leisten sind doof...
    Also. Eure Beispiele und auch das in der Hilfedatei habe ich verstanden. Aber diese Beispiele sind nicht das, was ich wollte.
    Ich möchte keinen Prozessbalken, der durchläuft und dann läuft das Script erst weiter. Sondern die Leiste steht in dem Zusammenhang mit dem Script.
    Mein Script erstellt ein Array mit allen Dateien, die es gefunden hat. Zum Beispiel 100 Dateien.

    siehe Zeile 81:

    Spoiler anzeigen

    ;$Array = _ArrayDisplay ($aFiles, "Alle Dateien mit der Endung: " & $FileTyp, $i_ShowOver4000)


    Ich möchte, dass ein Kästchen in der Leiste 5 Dateien entspricht. Also so, dass wenn er alle 100 Dateien abgearbeitete hat, der Balken voll ist.

    Dann habe ich einen zweiten Balken eingebaut. Der ist unabhängig vom ersten.
    Das Programm, mit dem ich die Dateien öffne hat eigene Prozessbalken. Das Programm lasse ich aber versteckt ausführen. Ich möchte mir den Balken herausnehmen und für meinen zweiten Balken ersetzen.

    Das ist das, was ich mit Window Info ausgelesen habe:

    Spoiler anzeigen

    >>>> Control <<<<
    Class: msctls_progress32
    Instance: 1
    ClassnameNN: msctls_progress321
    Advanced (Class): [CLASS:msctls_progress32; INSTANCE:1]
    ID: 1910
    Text: Progress1
    Position: 11, 41
    Size: 362, 23
    ControlClick Coords: 60, 15
    Style: 0x50000000
    ExStyle: 0x00020004
    Handle: 0x00500652

  • Es scheint nicht das zu sein, was ich meine. Es hatte wurderbar geklappt das Fenster zu verschieben (ControlMove). Das Fenster, was versteckt war, wird auch dann sichtbar.
    Aber ich möchte nur den Prozessbalken herausschneiden und in meine GUI packen. Nicht das ganze Fenster.
    Das Fenster, was versteckt war, wird auch dann sichtbar.

    Dann zum Verstandnis:

    Spoiler anzeigen
    [autoit]

    $NEXSTYLE = DllCall("user32.dll", "int", "GetWindowLong", "hwnd", $hChild, "int", 236)
    DllCall("user32.dll", "int", "SetWindowLong", "hwnd", $hChild, "int", 236, "int", BitOR($NEXSTYLE[0], $WS_EX_MDICHILD))
    DllCall("user32.dll", "int", "SetParent", "hwnd", $hChild, "hwnd", $MGUI)

    [/autoit]


    Was macht oder bewirkt das? Was steht in der User.dll?

    Bitte helft mir. Ich weiß definitiv nicht weiter. :(

  • Du kannst auch einfach die Progressbar in bestimmten Abständen auslesen und übertragen :)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <SendMessage.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)
    Example()
    Func Example()
    Local $progressbar1, $progressbar2, $button, $wait, $s, $msg, $m

    GUICreate("My GUI Progressbar", 220, 100, 100, 200)
    $progressbar1 = GUICtrlCreateProgress(10, 10, 200, 20)

    [/autoit] [autoit][/autoit] [autoit]

    $progressbar2 = GUICtrlCreateProgress(10, 40, 200, 20)
    $button = GUICtrlCreateButton("Start", 75, 70, 70, 20)
    GUISetState()

    Local $progressbarPOS, $progressbarPOSSaved, $ProgressHandle = ControlGetHandle("My GUI Progressbar","","msctls_progress321")

    Do
    $msg = GUIGetMsg()
    If $msg = $button Then
    GUICtrlSetData($progressbar1,Random(0,100,1))
    EndIf

    ; Prpgress auslesen
    $progressbarPOS = _SendMessage($ProgressHandle,$PBM_GETPOS)

    ; Wenn unterschied zu alter Position, dann aktualisieren
    If $progressbarPOS <> $progressbarPOSSaved Then
    ConsoleWrite($progressbarPOS & @CRLF)
    GUICtrlSetData($progressbar2,$progressbarPOS)
    $progressbarPOSSaved = $progressbarPOS
    EndIf
    Until $msg = $GUI_EVENT_CLOSE
    EndFunc ;==>Example

    [/autoit]
  • Du kannst im ProgressSet doch einfach mit Variablen arbeiten! Wenn die Gesamtzahl feststeht ist das doch ganz einfach.

    z.B. 25 Dateien verarbeiten

    [autoit]

    ProgressSet( $x*4, $x & "/ 25 files")

    [/autoit]

    Bastel Dir dir die Zähler so, dass es passt ;)

    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

  • Zitat

    ProgressSet

    ich wage zu behaupten, dass man ProgressSet bei einem GUICtrlCreateProgress knicken kann. oder ich bin zu doof, das eine mit dem anderen zu verbinden. :thumbdown:

    ich habe es nun geschafft, den einen balken so zu lösen (der, der mit meinem array im zusammenhang steht). ich weiß ja vorher nicht, wieviel gefunden wird, aber danach.
    und so kann ich einfach mathematische gleichungen nutzen, um auf meine 100% zu kommen.

    Spoiler anzeigen
    [autoit]


    For $i = 1 to _ArrayMax($aFiles)

    $s = $i
    If $s < _ArrayMax($aFiles) Then
    $e = 100/_ArrayMax($aFiles)*$s
    GUICtrlSetData ($Progress1,$e)
    EndIf
    ;Andere Funtionen
    next

    [/autoit]

    und das mit dem

    Zitat

    Du kannst auch einfach die Progressbar in bestimmten Abständen auslesen und übertragen

    ist noch eine harte nuss für mich. weil ich nicht meine eigene balken abfragen will sondern ein "fremdes". eins von einem anderen programm. dadran sitz ich gerade... :wacko:

  • Das fremde abfragen:
    ControlGetHandle("My GUI Progressbar","","msctls_progress321")
    einfach da das Fenster eintragen, das abgefragt werden soll ;)

    Progress
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <SendMessage.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)
    Example()
    Func Example()
    Local $progressbar1, $button, $msg

    GUICreate("My GUI Progressbar", 220, 100, 100, 200)

    [/autoit] [autoit][/autoit] [autoit]

    $progressbar1 = GUICtrlCreateProgress(10, 40, 200, 20)
    $button = GUICtrlCreateButton("Change",20, 80, 200, 20)
    GUISetState()

    Do
    $msg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    If $msg = $button Then GUICtrlSetData($progressbar1,Random(0,100,1))

    Until $msg = $GUI_EVENT_CLOSE
    EndFunc ;==>Example

    [/autoit]
    Empfänger
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <SendMessage.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)
    Example()
    Func Example()
    Local $progressbar1, $progressbar2, $button, $wait, $s, $msg, $m

    GUICreate("Progressbar Empfänger", 220, 100, 100, 200)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $progressbar2 = GUICtrlCreateProgress(10, 40, 200, 20)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    Local $progressbarPOS, $progressbarPOSSaved, $ProgressHandle = ControlGetHandle("My GUI Progressbar","","msctls_progress321")

    Do
    $msg = GUIGetMsg()

    ; Prpgress auslesen
    $progressbarPOS = _SendMessage($ProgressHandle,$PBM_GETPOS)

    ; Wenn unterschied zu alter Position, dann aktualisieren
    If $progressbarPOS <> $progressbarPOSSaved Then
    ConsoleWrite($progressbarPOS & @CRLF)
    GUICtrlSetData($progressbar2,$progressbarPOS)
    $progressbarPOSSaved = $progressbarPOS
    EndIf
    Until $msg = $GUI_EVENT_CLOSE
    EndFunc ;==>Example

    [/autoit]

    2 Mal editiert, zuletzt von progandy (14. Februar 2009 um 14:43)

  • Ich bin zu doof den fremden Prozessbalken auszulesen und in meiner GUI wiederzugeben. ;(:huh:X(:(

    Ich belasse es dabei. Und schließe das Thema, vielen Dank für die Hilfe.

  • Ähh, sorry.
    dei Progrssbar sollte das sein:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <SendMessage.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)
    Example()
    Func Example()
    Local $progressbar1, $button, $msg

    GUICreate("My GUI Progressbar", 220, 100, 100, 200)

    [/autoit] [autoit][/autoit] [autoit]

    $progressbar1 = GUICtrlCreateProgress(10, 40, 200, 20)
    $button = GUICtrlCreateButton("Change",20, 80, 200, 20)
    GUISetState()

    Do
    $msg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    If $msg = $button Then GUICtrlSetData($progressbar1,Random(0,100,1))

    Until $msg = $GUI_EVENT_CLOSE
    EndFunc ;==>Example

    [/autoit]


    Der Emüfänger wie im vorigen Post.
    eine fremde Progressbar wird so abgefragt:

    [autoit]

    #include <ProgressConstants.au3>
    #include <SendMessage.au3>
    $ProgressHandle = ControlGetHandle("Fenstertitel","","msctls_progress321") ; Handle zur 1. Progressbar des Fensters "Fenstertitel" holen
    $progressbarPOS = _SendMessage($ProgressHandle,$PBM_GETPOS) ; mit dem Handle kann dann mit _SendMessage die Position abgefragt werden.

    [/autoit]