1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • Wie organisiert ihr eure AutoIt-Projektverzeichnisse?

    • Oscar
    • 5. März 2018 um 09:34

    Ich, als Hobbyprogrammierer, muss (zum Glück) keine Rücksicht auf andere Mitprogrammierer (gibt es nicht) Rücksicht nehmen.

    Dementsprechend sehen meine Projekte bei Beginn immer ziemlich chaotisch aus. Ich lege zwar einen eigenen Ordner für jedes Projekt an, aber da landet dann erstmal alles unsortiert drin.

    Im fortgeschrittenen Stadium lege ich meist aber noch Unterverzeichnisse an ("gfx", "snd", "includes", "dlls", je nach Projekt).

    Ich habe mir aber angewöhnt, den Code als solches von Anfang an etwas "aufgeräumter" zu gestalten. Das nutzen von Regionen (#Region...#EndRegion in AutoIt) beispielsweise erleichtert das wiederfinden von Codeabschnitten. Sie lassen sich dann auch schnell ein-/ausblenden.

    Funktionen, die komplett unabhängig vom Projekt funktionieren, werden in externe Dateien (UDFs in "includes") ausgelagert oder auch Ressourcen (Icons, MP3s, Fonts, etc.), die ich in letzter Zeit öfter (mit dem "File to Base64 String Code Generator" von UEZ) direkt aus dem Speicher nutze, lagere ich in extra Dateien aus.

    Bei wichtigen Entscheidungen/Weichenstellungen innerhalb des Codes lege ich auch schonmal extra Backups an, damit ich zur Urfassung zurückkehren kann, wenn sich der eingeschlagene Weg als Sackgasse erweist.

    Manche Probleme, die sich im Laufe der Programmierung ergeben, versuche ich oft erstmal "im kleinen" zu lösen, bevor sie tatsächlich ins Projekt einfliessen. Dementsprechend gibt es in meinen Projektverzeichnissen oft diverse "test.au3". :)

  • Such Sources zu einem bestimmten Tutorial von AutoIT96

    • Oscar
    • 4. März 2018 um 19:48
    Zitat von alpines

    move den Thread doch mal bitte nach Talk/OT, das hier ist kein Tutorial.

    Erledigt! :)

  • Treeview Icons einzeln ändern

    • Oscar
    • 3. März 2018 um 18:11
    Zitat von mirko2002

    Btw - Du erwähntest schwere Lesbarkeit meines Codes. Hast Du Tipps was ich anders machen sollte?

    Peter hat diverse Dinge bereits genannt. Und Kommentare auf keinen Fall löschen. Wenn Du nach ein paar Monaten Deinen Code nochmal ansiehst, wirst Du über jede Kommentarzeile froh sein.

    "Best coding practices" ist auch immer zu empfehlen. Zusätzlich kann man Regionen verwenden, um zusammengehörige Teile besser lesbar zu machen. Ich habe mal den Anfang von Deinem Script etwas bearbeitet (das sieht hier im Forum nicht so gut aus, musst Du in SciTE anschauen):

    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=artifacter.ico
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    #Region Includes
    #include <GuiTreeView.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <guiconstants.au3>
    ;~ #include <Restart.au3>
    #EndRegion Includes
    
    #Region Globale Variablen
    Global $sPath = @ScriptDir & '\Mailer\'
    Global $iWidth = 800, $iHeight = 600
    Global $bFiles = True
    #EndRegion Globale Variablen
    
    #Region Hauptfenster erstellen
    Global $hGui = GUICreate('OSC Mailer 1.0', $iWidth, $iHeight, -1, -1)
    GUISetFont(9, 600, 0, 'Verdana')
    #EndRegion Hauptfenster erstellen
    
    #Region Gruppe OSC Tickets
    GUICtrlCreateGroup("OSC Tickets", 5, 20, 275, 555)
    GUICtrlSetFont(-1, 8, 600, 0, "Verdana")
    Global $idTreeView = GUICtrlCreateTreeView(10, 35, $iWidth - 540, $iHeight - 70, BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES), $WS_EX_STATICEDGE)
    GUICtrlSetFont(-1, 10, 400, 0, 'Arial')
    GUICtrlSetBkColor(-1, 0xF8F8F8)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    #EndRegion Gruppe OSC Tickets
    
    #Region Gruppe OSC Infos
    GUICtrlCreateGroup("OSC Infos", 290, 20, 500, 125)
    GUICtrlSetFont(-1, 8, 600, 0, "Verdana")
    GUICtrlCreateLabel("Markt:", 300, 40)
    Global $aidOSCinfos[4]
    ;~ $aidOSCinfos[0] = GUICtrlCreateInput("", 360, 38, 150, 18)
    $aidOSCinfos[0] = GUICtrlCreateCombo("", 360, 38, 150, 18, $CBS_DROPDOWNLIST)
    GUICtrlSetData($aidOSCinfos[0], "MM Alex|MM Biesdorf|MM Brandenburg|MM Charlottenburg|MM Eiche|MM Gropius|MM HBF|MM HSH|MM Neukölln|MM Potsdam|MM Prenz'l Berg|MM Schöneweide|MM Schwedt|MM Spandau|MM Steglitz|MM Tegel|MM Tempelhof|MM Waltersdorf|MM Wedding", "")
    GUICtrlCreateLabel("Name KD:", 540, 40)
    $aidOSCinfos[1] = GUICtrlCreateInput("", 600, 38, 150, 18)
    GUICtrlCreateLabel("Abteilung:", 300, 70)
    ;~ $aidOSCinfos[2] = GUICtrlCreateInput("", 360, 68, 150, 18)
    $aidOSCinfos[2] = GUICtrlCreateCombo("", 360, 68, 150, 18, $CBS_DROPDOWNLIST)
    GUICtrlSetData($aidOSCinfos[2], "BW TV|BW HiFi|BW Foto|BW Henkelware|BW Zubehör|BW Car-HiFi|Neue Medien|Computer|Zubehör|GSM|Bürokom|Navi, Outdoor|WW Großgeräte|WW Kleingeräte|Enternainment|Tonträger|Software|Service|eBay|Lager|Sicherheit", "")
    GUICtrlCreateLabel("Telefon#:", 540, 70)
    $aidOSCinfos[3] = GUICtrlCreateInput("", 600, 68, 150, 18)
    GUICtrlCreateLabel("Belegnummer/Auftragsnummer/Bestellnummer:", 425, 100, 250, 15)
    Global $idInput = GUICtrlCreateInput("", 470, 120, 135, 18)
    Global $idReservierung = GUICtrlCreateCheckbox("Reservierung", 670, 110)
    GUICtrlCreateGroup("Anliegen", 290, 150, 500, 80)
    GUICtrlSetFont(-1, 8, 600, 0, "Verdana")
    Global $idFallErstellen = GUICtrlCreateButton("OSC Fall erstellen", 480, 240, 120, 20)
    GUICtrlSetFont(-1, 7, 600, 0, "Verdana")
    ;~ $button_refreshtree = GUICtrlCreateButton("", 440, 270, 25, 25, $BS_ICON)
    ;~ GUICtrlSetImage(-1, "wmploc.dll", -138,0)
    ;~ GUICtrlSetImage(-1, "shell32.dll", -239,0)
    ;~ GUICtrlSetTip(-1, "Aktualisiert die OSC Ticket Ansicht")
    #EndRegion Gruppe OSC Infos
    
    #Region Gruppe 0815
    GUICtrlCreateGroup("", 450, 270, 180, 50)
    GUICtrlCreateLabel("Nur für den OSC'ler", 492, 270, 92, 15)
    Global $idFileDelete = GUICtrlCreateButton("", 475, 285, 25, 25, $BS_ICON)
    ;~ GUICtrlSetImage(-1, "shell32.dll", -132,0)
    GUICtrlSetImage(-1, "shell32.dll", -145, 0)
    GUICtrlSetTip(-1, "Schließt das ausgewählte OSC Ticket")
    Global $idUpdate = GUICtrlCreateButton("Update OSC Fall", 510, 287, 95, 20)
    Global $idUpdateEdit = GUICtrlCreateEdit("", 300, 165, 480, 55, BitOR($WS_VSCROLL, $ES_MULTILINE, $ES_AUTOVSCROLL, $ES_WANTRETURN))
    GUICtrlCreateGroup("Notizen", 290, 320, 500, 255)
    GUICtrlSetFont(-1, 8, 600, 0, "Verdana")
    Global $idNotizenEdit = GUICtrlCreateEdit("", 300, 335, 480, 230, BitOR($WS_VSCROLL, $ES_MULTILINE, $ES_READONLY))
    ;~ GUICtrlSetBkColor(-1, 0xF8F8F8)
    Global $hStatus1 = GUICtrlCreateLabel('', 0, $iHeight - 16, $iWidth / 2, 16, -1, $WS_EX_STATICEDGE)
    Global $hStatus2 = GUICtrlCreateLabel('', $iWidth / 2 + 1, $iHeight - 16, $iWidth / 2, 16, -1, $WS_EX_STATICEDGE)
    #EndRegion Gruppe 0815
    Alles anzeigen

    Wenn Du SciTE benutzt, ist Tidy (STRG & T) auch gut geeignet, um Code-Einrückungen zu automatisieren.

  • Countdown mit Minuten:Sekunden

    • Oscar
    • 3. März 2018 um 14:57

    So:

    AutoIt
    #include <AutoItConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    
    Global $iSeconds = 20 * 1
    Global $hGui = GUICreate('Zeitgesteuertes Ausschalten', 365,75, 192, 124, BitOR($WS_CAPTION,$WS_POPUP,$WS_BORDER,$WS_CLIPSIBLINGS))
    
    Global $Label1 = GUICtrlCreateLabel('Der PC fährt in', 20, 10, 105, 20)
    GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
    Global $idTime = GUICtrlCreateLabel('', 140, 6, 70, 40)
    GUICtrlSetFont(-1, 16, 700, 0, 'Arial')
    Global $Label2 = GUICtrlCreateLabel('Minuten runter ...', 210, 10, 205, 20)
    GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
    $Button1 = GUICtrlCreateButton("  automatisches Ausschalten abbrechen  ",20, 35)
    
    AdlibRegister('_CountDown', 1000)
    _CountDown()
    GUISetState(@SW_SHOW)
    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case $Button1
                AdlibUnRegister('_CountDown')
        EndSwitch
    WEnd
    
    
    
    Func _CountDown()
        Local $iMin, $iSec
        $iSeconds -= 1
        If $iSeconds < 0 Then
    ;~         Shutdown($SD_SHUTDOWN) ; Rechner herunterfahren
            Exit ; Programm beenden
        EndIf
        $iMin = Int($iSeconds / 60)
        $iSec = Mod($iSeconds, 60)
        GUICtrlSetData($idTime, StringFormat('%02i:%02i', $iMin, $iSec))
    EndFunc
    Alles anzeigen
  • Countdown mit Minuten:Sekunden

    • Oscar
    • 3. März 2018 um 14:17

    Genau genommen ist das Int in Zeile 22 gar nicht nötig, weil die Ausgabe mit StringFormat das Ergebnis bereits ins Integerformat umwandelt.

    Ich hatte es nur mit eingebaut, damit Du Dich beim "weiterbasteln" nicht plötzlich über Kommazahlen wunderst.

  • Treeview Icons einzeln ändern

    • Oscar
    • 3. März 2018 um 14:11

    Dein Code ist nicht leicht zu lesen und ohne Beispieldaten nur schwer nachzuvollziehen, aber ich denke, Du hast Deine Abfrage an der falschen Stelle (und mit falschen Daten) gemacht.

    Versuch's mal so:

    AutoIt
    Func _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles = False)
        Local $hFileItem, $FolderColor = 0x0000FF, $Folder, $aCount[2] = [0, 0]
        If Not StringInStr(FileGetAttrib($sPath), 'D') Then Return SetError(1, 0, 0)
        $sPath = FileGetLongName($sPath)
        Local $oFSO = ObjCreate('Scripting.FileSystemObject')
        If @error Then Return SetError(2, 0, 0)
        _GUICtrlTreeView_BeginUpdate($hTreeView)
        _GUICtrlTreeView_DeleteAll(GUICtrlGetHandle($hTreeView))
        Local $hTreeViewItem = GUICtrlCreateTreeViewItem($sPath, $hTreeView)
        GUICtrlSetColor(-1, $FolderColor)
        _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 134) ;Icon 111
        $Folder = $oFSO.GetFolder($sPath)
        _CreateDirectoryRecursive($hTreeView, $Folder, $hTreeViewItem, $bFiles, $aCount)
        If $bFiles Then
            For $Files In $Folder.Files
                $hFileItem = GUICtrlCreateTreeViewItem($Files.Name, $hTreeViewItem)
                $read_reservierung = FileReadLine($sPath & $Files.Name,5)
                If $read_reservierung = 4 then
                    _GUICtrlTreeView_SetIcon($hTreeView, $hFileItem, 'shell32.dll', 111) ;Icon 111
                Else
                    _GUICtrlTreeView_SetIcon($hTreeView, $hFileItem, 'shell32.dll', 77)
                EndIf
                $aCount[1] += 1
            Next
        EndIf
        _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 3, 2)
        _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 110, 4)
        _GUICtrlTreeView_EndUpdate($hTreeView)
        GUICtrlSetState($hTreeViewItem, $GUI_EXPAND)
        $oFSO = ''
        Return $aCount
    EndFunc   ;==>_GUICtrlTreeView_CreateDirectory
    Alles anzeigen
  • Treeview Icons einzeln ändern

    • Oscar
    • 3. März 2018 um 09:23

    Hier muss ich doch mal etwas Kritik üben.

    mirko2002: Du bist seit 2011 hier angemeldet und dann kannst Du Dein Problem nicht mal mit einem funktionierenden Beispiel beschreiben (nicht jeder hat die Lust, daraus erstmal ein Beispielscript zu basteln)?

    Außerdem verwendest Du hier eine fremde UDF (Meine! Nicht dass ich etwas dagegen habe, aber Du solltest sie auch komplett mitgeben: _CreateDirectoryRecursive fehlt).

    Der Inhalt der Textdatei ist für das Problem auch nicht ganz unwichtig. Wenn Du also ein funktionierendes Beispiel schreiben würdest, bei dem man das Problem nachvollziehen kann, dann würdest Du sicher auch kompetente Hilfe bekommen.

  • Countdown mit Minuten:Sekunden

    • Oscar
    • 2. März 2018 um 18:11

    So:

    AutoIt
    #include <AutoItConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    
    Global $iSeconds = 60 * 5
    Global $hGui = GUICreate('CountDown', 200, 80)
    Global $idTime = GUICtrlCreateLabel('', 40, 20, 120, 40, $SS_CENTER)
    GUICtrlSetFont(-1, 24, 400, 0, 'Arial')
    AdlibRegister('_CountDown', 1000)
    _CountDown()
    GUISetState()
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    
    Func _CountDown()
        Local $iMin, $iSec
        $iSeconds -= 1
        If $iSeconds < 0 Then
    ;~         Shutdown($SD_SHUTDOWN) ; Rechner herunterfahren
            Exit ; Programm beenden
        EndIf
        $iMin = Int($iSeconds / 60)
        $iSec = Mod($iSeconds, 60)
        GUICtrlSetData($idTime, StringFormat('%02i:%02i', $iMin, $iSec))
    EndFunc
    Alles anzeigen
  • Progressbar für Countdown rückwärtslaufen lassen

    • Oscar
    • 27. Februar 2018 um 19:52

    Wenn Du mit dem klassischen Stil auskommst, dann so:

    AutoIt
    #include <ProgressConstants.au3>
    
    Global $iProgress = 100
    Global $iTimer = TimerInit()
    Global $hGui = GUICreate('Test', 640, 100)
    DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 0) ; auf den klassischen Style umschalten
    Global $idProgress = GUICtrlCreateProgress(20, 30, 600, 20)
    GUICtrlSetData(-1, $iProgress)
    GUICtrlSetBkColor(-1, 0xCCCCCC)
    GUICtrlSetColor(-1, 0x6666DD)
    DllCall('uxtheme.dll', 'none', 'SetThemeAppProperties', 'int', 7) ; zurück zum Standard-Windowsstyle
    GUISetState()
    Do
        If TimerDiff($iTimer) > 50 Then
            $iTimer = TimerInit()
            $iProgress -= 1
            GUICtrlSetData($idProgress, $iProgress)
        EndIf
    Until GUIGetMsg() = -3 Or  $iProgress < 0
    Alles anzeigen
  • Turnierspiel Kombinationen

    • Oscar
    • 26. Februar 2018 um 19:45
    Zitat von Mars

    Die 36 Spiele kommen von den 9 Teilnehmern im Test. (9^2-9)/2

    Oh, stimmt! Hab ich übersehen. Sorry!

  • Turnierspiel Kombinationen

    • Oscar
    • 26. Februar 2018 um 18:44

    Dein Script ist aber nicht korrekt. Erstmal können es gar keine 36 Spiele sein, denn wenn jeder einmal gegen jeden spielt, dann sind es maximal 28 Spiele (bei 8 Spielern): 7 + 6 + 5 + 4 + 3 + 2 + 1 = 28

    Und bei Dir treten einige Partien doppelt und dreifach auf:

    Code
    Row|Col 0|Col 1
    [0]|Tamara|Gabi 
    [1]|Werner|Heinrich
    ->[2]|Oliver|Doris
    [3]|Kathrin|Heinrich
    [4]|Johnson|Helmut
    [5]|Tamara|Gabi 
    [6]|Kathrin|Johnson
    [7]|Doris|Heinrich
    [8]|Helmut|Gabi 
    [9]|Tamara|Kathrin
    [10]|Gabi |Helmut
    [11]|Tamara|Werner
    [12]|Gabi |Helmut
    [13]|Kathrin|Tamara
    [14]|Gabi |Helmut
    [15]|Oliver|Johnson
    [16]|Heinrich|Tamara
    [17]|Gabi |Werner
    [18]|Kathrin|Heinrich
    ->[19]|Oliver|Doris
    [20]|Helmut|Johnson
    ->[21]|Doris|Oliver
    [22]|Gabi |Tamara
    [23]|Werner|Helmut
    [24]|Tamara|Doris
    [25]|Kathrin|Helmut
    [26]|Heinrich|Oliver
    [27]|Werner|Johnson
    [28]|Oliver|Heinrich
    [29]|Johnson|Doris
    [30]|Werner|Heinrich
    [31]|Johnson|Doris
    [32]|Werner|Oliver
    [33]|Kathrin|Johnson
    [34]|Oliver|Werner
    [35]|Kathrin|Doris
    Alles anzeigen

    Aber die Idee mit dem Zufall habe ich mal aufgegriffen und das in mein Script mit eingebaut:

    AutoIt
    #include <Array.au3>
    Global $aPlayerNames[] = ['Kathrin', 'Doris', 'Tamara', 'Gabi ', 'Oliver', 'Heinrich', 'Helmut', 'Werner']
    ;~ Global $aPlayerNames[] = ['Kathrin', 'Doris', 'Tamara', 'Gabi ', 'Oliver', 'Heinrich', 'Helmut', 'Werner', 'Bernd', 'Peter']
    ;~ Global $aPlayerNames[] = ['Kathrin', 'Doris', 'Tamara', 'Gabi', 'Helga', 'Barbara', 'Oliver', 'Heinrich', 'Helmut', 'Werner', 'Stefan', 'Bernd']
    Global $iPlayerCount = UBound($aPlayerNames)
    Global $aNr[$iPlayerCount], $aGroupA[$iPlayerCount][2]
    For $i = 0 To $iPlayerCount - 1
        $aNr[$i] = $i
    Next
    Global $aCombo = _ArrayCombinations($aNr, 2, '#')
    _ArrayDelete($aCombo, 0)
    $aCombo = _SortCombinations($aCombo)
    _ArrayDisplay($aCombo)
    
    Func _SortCombinations($aCombo)
        Local $sMatch, $sRound = '', $iRound = 0, $aPlayer[2], $iCnt = -1, $iGames = 0, $aNew[UBound($aCombo)][2]
        Do
            $iCnt += 1 ; den Zaehler fuer die Kombinationen um eins erhoehen
            If $iCnt > UBound($aCombo) - 1 Then ; wenn alle Kombinationen durch sind (eine Runde vorbei), dann von vorne beginnen
                $iCnt = 0 ; Zaehler auf Null
                $sRound = '' ; eine neue Runde
                If $iGames >= $iPlayerCount * 2 Then _ArrayShuffle($aCombo) ; ab der dritten Runde das Array zufällig sortieren lassen (bessere Verteilung)
            EndIf
            $sMatch = $aCombo[$iCnt] ; das Match aus den Kombinationen lesen
            If $sMatch = '' Then ContinueLoop ; wenn bereits gespielt, dann das naechste Match holen
            $aPlayer = StringSplit($sMatch, '#', 2) ; die beiden Spieler aus dem Match
            If StringInStr($sRound, $aPlayer[0] & '|') Or StringInStr($sRound, $aPlayer[1] & '|') Then ContinueLoop ; wenn einer der beiden Spieler in dieser Runde bereits dran war, dann das naechste Match holen
            $sRound &= $aPlayer[0] & '|' & $aPlayer[1] & '|' ; ansonsten die beiden Spieler fuer diese Runde eintragen
            $aNew[$iGames][0] = $aPlayer[0] & ' ' & $aPlayerNames[$aPlayer[0]] ; dieses Match ins Rueckgabe-Array uebernehmen
            $aNew[$iGames][1] = $aPlayer[1] & ' ' & $aPlayerNames[$aPlayer[1]] ; dieses Match ins Rueckgabe-Array uebernehmen
            $aCombo[$iCnt] = '' ; das Match als gespielt kennzeichnen
            $iGames += 1 ; Anzahl der gesamten Spiele erhoehen
        Until $iGames = UBound($aCombo) ; weitermachen bis alle Kombinationen gespielt wurden
        Return $aNew
    EndFunc
    Alles anzeigen

    Damit ist die Verteilung schon nahe am Optimum. Es passiert zwar manchmal noch, dass ein Spieler 2x hintereinander dran kommt, aber das ist sehr selten.

  • Fileopendialog + 2te Funktion öffnen

    • Oscar
    • 25. Februar 2018 um 15:10

    Was soll das für einen Sinn haben?

    FileOpenDialog ist dazu da, die Auswahl dem Anwender zu überlassen.

    Wenn Du hingegen sowieso alle Dateien einlesen willst, dann nimm _FileListToArray mit entsprechenden Filter.

  • GUI-Stil

    • Oscar
    • 25. Februar 2018 um 07:45

    Als Style muss $WS_MAXIMIZEBOX eingetragen sein:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    Global $hGui = GUICreate('Test', 800, 600, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_MAXIMIZE)) ; wichtig ist $WS_MAXIMIZEBOX
    GUISetState()
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
  • Turnierspiel Kombinationen

    • Oscar
    • 24. Februar 2018 um 19:15

    Ich habe mir jetzt etwas programmiert, was nicht ganz perfekt ist (es gibt ein paar Spiele, wo ein Spieler 2x hintereinander drankommt), aber was zumindest ungefähr hinkommt.

    AutoIt
    #include <Array.au3>
    ;~ Global $aPlayerNames[] = ['Kathrin', 'Doris', 'Tamara', 'Gabi ', 'Oliver', 'Heinrich', 'Helmut', 'Werner']
    ;~ Global $aPlayerNames[] = ['Kathrin', 'Doris', 'Tamara', 'Gabi ', 'Oliver', 'Heinrich', 'Helmut', 'Werner', 'Bernd', 'Peter']
    Global $aPlayerNames[] = ['Kathrin', 'Doris', 'Tamara', 'Gabi', 'Helga', 'Barbara', 'Oliver', 'Heinrich', 'Helmut', 'Werner', 'Stefan', 'Bernd']
    Global $iCount = UBound($aPlayerNames)
    Global $aNr[$iCount], $aGroupA[$iCount][2]
    For $i = 0 To $iCount - 1
        $aNr[$i] = $i
        $aGroupA[$i][0] = 'A' & $i + 1
        $aGroupA[$i][1] = $aPlayerNames[$i]
    Next
    Global $aCombo = _ArrayCombinations($aNr, 2, '#')
    _ArrayDelete($aCombo, 0)
    _ArrayDisplay($aCombo)
    Global $sMatch, $sRound = '', $aPlayer[2], $iCnt = -1, $iGames = 0
    Do
        $iCnt += 1 ; den Zaehler fuer die Kombinationen um eins erhoehen
        If $iCnt > UBound($aCombo) - 1 Then ; wenn alle Kombinationen durch sind (eine Runde vorbei), dann von vorne beginnen
            $sRound = '' ; eine neue Runde
            $iCnt = 0 ; Zaehler auf Null
        EndIf
        $sMatch = $aCombo[$iCnt] ; das Match aus den Kombinationen lesen
        If $sMatch = '' Then ContinueLoop ; wenn bereits gespielt, dann das naechste Match holen
        $aPlayer = StringSplit($sMatch, '#', 2) ; die beiden Spieler aus dem Match
        If StringInStr($sRound, $aPlayer[0] & '|') Or StringInStr($sRound, $aPlayer[1] & '|') Then ContinueLoop ; wenn einer der beiden Spieler in dieser Runde bereits dran war, dann das naechste Match holen
        $sRound &= $aPlayer[0] & '|' & $aPlayer[1] & '|' ; ansonsten die beiden Spieler fuer diese Runde eintragen
        $aCombo[$iCnt] = '' ; das Match als gespielt kennzeichnen
        $iGames += 1 ; Anzahl der gesamten Spiele erhoehen
        ConsoleWrite(StringFormat('%03i. (%-8s)%3s <-> %-3s(%-8s)\r\n', $iGames, $aGroupA[$aPlayer[0]][1], $aGroupA[$aPlayer[0]][0], $aGroupA[$aPlayer[1]][0], $aGroupA[$aPlayer[1]][1]))
    Until $iGames = UBound($aCombo) ; weitermachen bis alle Kombinationen gespielt wurden
    Alles anzeigen

    Falls noch jemanden eine bessere "Formel" einfällt, dann nur zu. Ich bin für jeden Vorschlag zu haben (wenn er sich in AutoIt umsetzen lässt).

    Ich hatte oben noch vergessen dazuzuschreiben, dass die Berechnung für unterschiedliche Anzahlen an Spieler funktionieren muss. Es sind aber min. 4, max. 12 und die Anzahl kann gerade oder ungerade sein.

  • Turnierspiel Kombinationen

    • Oscar
    • 24. Februar 2018 um 12:40

    Ich schreibe gerade an einem Programm zum verwalten eines Turniers.

    Jetzt brauche ich eine Funktion, um die Spiele "anzusagen". Nehmen wir mal an, es sind 8 Spieler innerhalb einer Gruppe. Jeder soll einmal gegen jeden aus dieser Gruppe spielen.

    Es soll aber so sein, dass reihum alle dran kommen und nicht ein Spieler mehrere Spiele hintereinander macht. Und genau da komme ich nicht weiter.

    Die erste und die zweite "Runde" klappt ja noch, aber wie geht's weiter?

    Oder kann man das nicht berechnen und muss die Reihenfolge manuell festlegen?

    Hier mal ein Testscript:

    AutoIt
    #include <Array.au3>
    Global $aPlayerNames[8] = ['Kathrin', 'Doris', 'Tamara', 'Gabi ', 'Oliver', 'Heinrich', 'Helmut', 'Werner']
    Global $iCount = UBound($aPlayerNames)
    Global $aGroupA[$iCount][2]
    For $i = 0 To $iCount - 1
        $aGroupA[$i][0] = 'A' & $i + 1
        $aGroupA[$i][1] = $aPlayerNames[$i]
    Next
    ;~ _ArrayDisplay($aGroupA)
    
    For $i = 0 To $iCount - 1 Step 2
        ConsoleWrite(StringFormat('%s %s\t-\t%s %s\r\n', $aGroupA[$i][0], $aGroupA[$i][1], $aGroupA[$i + 1][0], $aGroupA[$i + 1][1]))
    Next
    ConsoleWrite(@CRLF)
    For $i = 1 To $iCount - 1 Step 2
        ConsoleWrite(StringFormat('%s %s\t-\t%s %s\r\n', $aGroupA[$i][0], $aGroupA[$i][1], $aGroupA[Mod($i + 1, $iCount)][0], $aGroupA[Mod($i + 1, $iCount)][1]))
    Next
    ConsoleWrite(@CRLF)
    For $i = 0 To $iCount - 1 + 2 Step 1
        If Not Mod($i, 3) Then
            ConsoleWrite(StringFormat('%s %s\t-\t%s %s\r\n', $aGroupA[Mod($i, $iCount)][0], $aGroupA[Mod($i, $iCount)][1], $aGroupA[Mod($i + 2, $iCount)][0], $aGroupA[Mod($i + 2, $iCount)][1]))
        EndIf
    Next
    Alles anzeigen
  • 32bit oder 64bit

    • Oscar
    • 17. Februar 2018 um 08:59

    Bei reinem AutoIt-Code bleibe ich auch bei der 32-Bit-Version. Die AutoIt-Limits (siehe Hilfe) treffen sowieso auch auf die X64-Version zu (bis auf MAXCALLRECURSE).

    In Assembler ist das etwas anderes, aber bei reinem AutoIt-Code sehe ich keine gravierenden Vorteile bei der X64-Version.

  • Mit ftp:// Daten kopieren

    • Oscar
    • 16. Februar 2018 um 12:34

    Poste doch bitte mal Dein ganzes Script. Mit diesen Schnipseln kann man nichts anfangen.

    Vielleicht hast Du ein _FTP_Close vergessen und es existiert noch eine Verbindung (wird vom Server erst beim Timeout geschlossen).

  • Hilfiker / MobaTime Schweizer Bahnhofsuhr build 2019-07-07

    • Oscar
    • 15. Februar 2018 um 17:54

    Erstmal: Die Uhr sieht klasse aus! Schönes Script! :klatschen:

    Allerdings läuft die Uhr schon beim Minutenbeginn um eine Sekunde zu schnell.

    Ich weiß jetzt nicht, ob die Schweizer Bahnhofsuhren wirklich so laufen, aber aus dem Wikipedia-Artikel würde ich eher herauslesen, dass der Synchronmotor aufgrund der Netzfrequenz-Schwankungen nicht ganz genau läuft.

    Das hätte aber IMHO ein allmähliches Vorgehen des Sekundenzeigers zur Folge, sodass sich das erst im Laufe der Minute zu einer Sekunde (bzw. 1.5 sek.) addiert und dieses dann beim Minuten umschalten ausgeglichen wird.

    Edit: Ich muss auch auf #AutoIt3Wrapper_UseX64=n umschalten, ansonsten stürzt das Script ab.

  • Providerwechsel aber wohin? [Gelöst]

    • Oscar
    • 10. Februar 2018 um 09:12

    Ich bin bei http://all-inkl.com und bin damit sehr zufrieden (dort bekommst Du auch Let's Encrypt-SSL-Zertifikate kostenlos).

    Zitat von bazii

    Ich benötige:


    7 FTP Zugänge

    4 Domains

    10 Datenbanken

    20 GB Webspace

    Bei den Anforderungen wäre das PrivatPlus-Paket wohl das Richtige: https://all-inkl.com/webhosting/privatplus/

  • Diskussion zum Thema GOTO in der Shoutbox - Zusammenfassung

    • Oscar
    • 2. Februar 2018 um 18:57
    Zitat von Peter S. Taler

    Nur ehrlich - wo steht das? Nicht dass ich Deine Aussage bezweifeln möchte! Aber es währe nett wenn das im Handbuch stünde.

    Da musste ich jetzt selbst mal nachsehen. Nein, das steht nicht wirklich im Hilfe.

    Man lernt das wohl erst mit der Zeit. Vor allem, wenn man sich mit rekursiven Funktionen beschäftigt.

    Denn generell kann man Funktionen auch rekursiv aufrufen, nur muss man für klare Abbruchbedingungen und eine Rückkehr aus den Rekursionen sorgen.

    Außerdem muss man die maximale Rekursionstiefe beachten: 3900 bei x64 und 1900 bei x86 (das steht in der Hilfe unter: AutoIt3 Limits/defaults).

    Rekursive Funktionen werden gern benutzt, um eine Ordnerstruktur (inkl. Unterordner) einzulesen oder beim erstellen von Treeviews.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™