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

  • FotoSort

    • Oscar
    • 14. April 2013 um 20:23

    Mit diesem Programm kann man seine Bildersammlung sichten und nach Wunsch in bis zu fünf Zielverzeichnisse kopieren.
    Ablauf ist dabei folgender: Quellverzeichnis auswählen. Dieses wird dann eingelesen und Bild für Bild angezeigt. Man kann dann mit den Sprungbuttons (+- 1/10/100) weiter-/zurückspringen oder durch Eingabe einer Nummer das jeweilige Bild direkt aufrufen. Das angezeigte Bild läßt sich in ein Zielverzeichnis kopieren. Fünf dieser Zielverzeichnisse kann man vorwählen. Für die Anzeige gibt es noch einen Button zum drehen des Bildes in 90 Grad Schritten. Bildname, -nummer und -format werden in der Statusleiste angezeigt. Die skalierte Größe steht in der Titelleiste.
    Man kann außerdem mehrere Einstellungen vornehmen:
    - Quellverzeichnis rekursiv (inkl. Unterverzeichnisse) einlesen.
    - Alle von GDI+ unterstützten Dateiformate stehen zur Auswahl (Checkboxen).
    - Beim kopieren hat man die Auswahl zwischen vorhandene Datei überschreiben oder umbenennen (Zähler anhängen).

    Update v1.1 16.04.13:
    - Man kann jetzt die Hintergrundfarbe verändern. Zur Auswahl stehen: Schachbrettmuster, Weiß und Schwarz.

    Update v1.2 16.04.13:
    - Schachbrettmuster wird jetzt schneller erstellt (bzw. nur einmal und dann nur noch kopiert). Danke UEZ!
    - Es gibt noch mehr Tastenbelegungen. Hier mal komplett:

    Code
    [ALT] + [1] ... [5] kopieren des angezeigten Bildes in das entsprechende Zielverzeichnis.
       [ALT] + [r] drehen des Bildes in 90-Grad-Schritten.
       [ALT] + [b] ändern der Hintergrundfarbe.
       [ALT] + [->] zum nächsten Bild springen.
       [ALT] + [<-] zum vorherigen Bild springen.

    Update v1.3 18.04.13:
    - Einige Funktionen optimiert.
    - Löschbutton hinzugefügt. Die Sicherheitsabfrage beim Löschen kann man durch gedrückthalten der [SHIFT]-Taste umgehen. Es wird dann das Bild sofort gelöscht.

    Update v1.4 20.04.13:
    - Es gibt jetzt einen Vollbildmodus. Ein Doppelklick auf das angezeigte Bild und das Bild wird im Vollbildmodus angezeigt. Die [ESC]-Taste beendet den Vollbildmodus wieder.

    Update v1.5 02.07.17:
    - "Fehler" im Script beseitigt, damit es auch mit der aktuellen Version von AutoIt funktioniert.


    Screenshot:
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Dateien

    FotoSort.png 358,17 kB – 0 Downloads FotoSort.au3 56,68 kB – 398 Downloads
  • "Best of" Bilder Script

    • Oscar
    • 6. April 2013 um 13:48

    Ich hatte gerade mal Lust sowas zu programmieren und weil ich einiges davon sowieso schonmal gebraucht hatte, ist bisher das hier fertig:

    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiStatusBar.au3>

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

    _GDIPlus_Startup()

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

    Global $iPreviewLeft = 10
    Global $iPreviewTop = 70
    Global $iPreviewMaxWidth = 800
    Global $iPreviewMaxHeight = 600
    Global $aPicFilenames[1] = [0], $iCount = 0, $pState = False, $aParts[3] = [$iPreviewMaxWidth / 2 + 100, $iPreviewMaxWidth / 2 + 250, $iPreviewMaxWidth / 2 + 350]
    Global $sSourcePath = '', $sDestPath = ''

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

    $hGui = GUICreate('Fotosortierer', $iPreviewMaxWidth + 20, $iPreviewMaxHeight + 140)
    GUISetFont(9, 400, 0, 'Verdana')
    GUICtrlCreateLabel('Quellverzeichnis:', 10, 12, 120, 25)
    GUICtrlSetFont(-1, 10, 400, 0, 'Verdana', 5)
    $ID_SourceDir = GUICtrlCreateInput('', 130, 10, $iPreviewMaxWidth - 170, 25, $ES_READONLY)
    GUICtrlSetBkColor(-1, 0xFFFFEE)
    $ID_SourceSel = GUICtrlCreateButton('...', $iPreviewMaxWidth - 38, 10, 32, 24)
    GUICtrlSetFont(-1, 10, 400, 0, 'Verdana', 5)

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

    GUICtrlCreateLabel('Zielverzeichnis:', 10, 42, 120, 25)
    GUICtrlSetFont(-1, 10, 400, 0, 'Verdana', 5)
    $ID_DestDir = GUICtrlCreateInput('', 130, 40, $iPreviewMaxWidth - 170, 25, $ES_READONLY)
    GUICtrlSetBkColor(-1, 0xFFFFEE)
    $ID_DestSel = GUICtrlCreateButton('...', $iPreviewMaxWidth - 38, 40, 32, 24)
    GUICtrlSetFont(-1, 10, 400, 0, 'Verdana', 5)

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

    $hPreviewGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)

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

    $ID_Prev = GUICtrlCreateButton('Vorheriges Bild', $iPreviewMaxWidth / 2 - 200, $iPreviewMaxHeight + 80, 110, 25)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $ID_Copy = GUICtrlCreateButton('Bild kopieren', $iPreviewMaxWidth / 2 - 60, $iPreviewMaxHeight + 76, 130, 32)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $ID_Next = GUICtrlCreateButton('Nächstes Bild', $iPreviewMaxWidth / 2 + 100, $iPreviewMaxHeight + 80, 110, 25)
    GUICtrlSetState(-1, $GUI_DISABLE)

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

    $hStatus = _GUICtrlStatusBar_Create($hGui)
    _GUICtrlStatusBar_SetParts($hStatus, $aParts)

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

    GUISetState()
    _GDIPlus_GraphicsFillRect($hPreviewGraphic, $iPreviewLeft, $iPreviewTop, $iPreviewMaxWidth, $iPreviewMaxHeight)

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    _GDIPlus_GraphicsDispose($hPreviewGraphic)
    _GDIPlus_Shutdown()
    Exit
    Case $ID_Prev
    $iCount -= 1
    _ShowStatus()
    _ShowImage($aPicFilenames[$iCount])
    $pState = False
    Case $ID_Next
    $iCount += 1
    _ShowStatus()
    _ShowImage($aPicFilenames[$iCount])
    $pState = False
    Case $ID_Copy
    GUICtrlSetState($ID_Copy, $GUI_DISABLE)
    _GUICtrlStatusBar_SetText($hStatus, 'Bitte Warten! Bild wird kopiert...', 0)
    If FileCopy($aPicFilenames[$iCount], $sDestPath) Then
    _GUICtrlStatusBar_SetText($hStatus, 'Das Bild wurde erfolgreich kopiert.', 0)
    Else
    _GUICtrlStatusBar_SetText($hStatus, 'Fehler beim kopieren!', 0)
    EndIf
    $pState = False
    Case $ID_SourceSel
    $sPath = FileSelectFolder('Bitte Quellverzeichnis auswählen', '', 6, $sSourcePath, $hGui)
    If $sPath <> '' Then
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $sSourcePath = $sPath
    GUICtrlSetData($ID_SourceDir, $sPath)
    _GUICtrlStatusBar_SetText($hStatus, 'Bitte Warten! Verzeichnis wird eingelesen...', 0)
    $aPicFilenames = _RecursiveFileListToArray($sPath, '(?i).+\.(jpg|jpeg|gif|bmp)', 1)
    If $aPicFilenames[0] > 0 Then
    $iCount = 1
    _ShowStatus()
    _ShowImage($aPicFilenames[$iCount])
    Else
    $iCount = 0
    _GUICtrlStatusBar_SetText($hStatus, 'Keine Bilder im Quellverzeichnis vorhanden!', 0)
    EndIf
    $pState = False
    EndIf
    Case $ID_DestSel
    $sPath = FileSelectFolder('Bitte Zielverzeichnis auswählen', '', 6, $sDestPath, $hGui)
    If $sPath <> '' Then
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $sDestPath = $sPath
    GUICtrlSetData($ID_DestDir, $sPath)
    $pState = False
    EndIf
    EndSwitch
    If Not $pState Then
    $pState = True
    If $aPicFilenames[0] > 0 Then
    If FileExists($sDestPath) Then
    If Not FileExists($sDestPath & StringRegExpReplace($aPicFilenames[$iCount], '.+\\(.+)', '$1')) Then
    GUICtrlSetState($ID_Copy, $GUI_ENABLE)
    Else
    GUICtrlSetState($ID_Copy, $GUI_DISABLE)
    EndIf
    Else
    GUICtrlSetState($ID_Copy, $GUI_DISABLE)
    EndIf
    If $iCount > 1 Then
    GUICtrlSetState($ID_Prev, $GUI_ENABLE)
    Else
    GUICtrlSetState($ID_Prev, $GUI_DISABLE)
    EndIf
    If $iCount < $aPicFilenames[0] Then
    GUICtrlSetState($ID_Next, $GUI_ENABLE)
    Else
    GUICtrlSetState($ID_Next, $GUI_DISABLE)
    EndIf
    Else
    GUICtrlSetState($ID_Prev, $GUI_DISABLE)
    GUICtrlSetState($ID_Copy, $GUI_DISABLE)
    GUICtrlSetState($ID_Next, $GUI_DISABLE)
    EndIf
    EndIf
    WEnd

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

    Func _ShowStatus()
    _GUICtrlStatusBar_SetText($hStatus, StringReplace($aPicFilenames[$iCount], $sSourcePath, '', 1), 0)
    _GUICtrlStatusBar_SetText($hStatus, StringFormat(' Bild %i von %i', $iCount, $aPicFilenames[0]), 1)
    EndFunc

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

    Func _ShowImage($sImgFile)
    Local $iVector, $iPreviewHeight, $iPreviewWidth, $aPixelFormat
    Local $hPreviewBitmap = _GDIPlus_BitmapCreateFromFile($sImgFile)
    If $hPreviewBitmap = 0 Then
    _GDIPlus_GraphicsFillRect($hPreviewGraphic, $iPreviewLeft, $iPreviewTop, $iPreviewMaxWidth, $iPreviewMaxHeight)
    _GDIPlus_BitmapDispose($hPreviewBitmap)
    Return
    EndIf
    $iPreviewWidth = _GDIPlus_ImageGetWidth($hPreviewBitmap)
    $iPreviewHeight = _GDIPlus_ImageGetHeight($hPreviewBitmap)
    $aPixelFormat = _GDIPlus_ImageGetPixelFormat($hPreviewBitmap)
    _GUICtrlStatusBar_SetText($hStatus, StringFormat(' %i x %i px , %i Bit', $iPreviewWidth, $iPreviewHeight, $aPixelFormat[1]), 2)
    If $iPreviewWidth > $iPreviewMaxWidth Or $iPreviewHeight > $iPreviewMaxHeight Then
    $iVector = $iPreviewWidth / $iPreviewHeight
    Do
    $iPreviewWidth -= $iVector
    $iPreviewHeight -= 1
    Until $iPreviewHeight <= $iPreviewMaxHeight And $iPreviewWidth <= $iPreviewMaxWidth
    EndIf
    _GDIPlus_GraphicsFillRect($hPreviewGraphic, $iPreviewLeft, $iPreviewTop, $iPreviewMaxWidth, $iPreviewMaxHeight)
    _GDIPlus_GraphicsDrawImageRect($hPreviewGraphic, $hPreviewBitmap, $iPreviewLeft + ($iPreviewMaxWidth - $iPreviewWidth) / 2, $iPreviewTop + ($iPreviewMaxHeight - $iPreviewHeight) / 2, $iPreviewWidth, $iPreviewHeight)
    _GDIPlus_BitmapDispose($hPreviewBitmap)
    EndFunc ;==>_PreviewShowImage

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

    Func _GuiCtrlSetPath($nID, $sPath, $iFit = 0)
    ;coded by funkey
    ;2011, Nov 24th
    Local $hCtrl = GUICtrlGetHandle($nID)
    Local $hDC = _WinAPI_GetDC($hCtrl)
    Local $tPath = DllStructCreate("char[260]")
    Local $pPath = DllStructGetPtr($tPath)
    DllStructSetData($tPath, 1, $sPath)
    Local $hFont = _SendMessage($hCtrl, 49, 0, 0, 0, "wparam", "lparam", "hwnd") ;WM_GETFONT
    Local $hFont_old = _WinAPI_SelectObject($hDC, $hFont)
    Local $aPos = ControlGetPos($hCtrl, "", "")
    DllCall("Shlwapi.dll", "BOOL", "PathCompactPath", "handle", $hDC, "ptr", $pPath, "int", $aPos[2] - $iFit)
    _WinAPI_SelectObject($hDC, $hFont_old)
    _WinAPI_DeleteDC($hDC)
    GUICtrlSetData($nID, DllStructGetData($tPath, 1))
    Return DllStructGetData($tPath, 1)
    EndFunc ;==>_GuiCtrlSetPath

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

    ;===============================================================================
    ; Function Name: _RecursiveFileListToArray($sPath[, $sPattern][, $iFlag][, $iFormat][, $fRecursion][, $sDelim])
    ; Description:: gibt Verzeichnisse (rekursiv) und/oder Dateien zurück, die einem RegExp-Pattern entsprechen
    ; Parameter(s): $sPath = Startverzeichnis
    ; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
    ; $iFlag = Auswahl
    ; 0 = Dateien & Verzeichnisse
    ; 1 = nur Dateien
    ; 2 = nur Verzeichnisse
    ; $iFormat = Rückgabeformat
    ; 0 = String
    ; 1 = Array mit [0] = Anzahl
    ; 2 = Nullbasiertes Array
    ; $fRecursion = Verzeichnisse rekursiv durchsuchen
    ; False = Nein
    ; True = Ja
    ; $sDelim = Trennzeichen für die String-Rückgabe
    ; Requirement(s): AutoIt 3.3.0.0
    ; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ; und: AspirinJunkie (http://www.autoit.de)
    ;===============================================================================
    Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $fRecursion = True, $sDelim = @CRLF, $fOpenDLL = True)
    Local $hSearch, $sFile, $sReturn = '', $aD
    Local Static $hDll
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*')
    If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
    If $fOpenDLL Then $hDll = DllOpen('kernel32.dll')
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If @extended Then
    $aD = DllCall($hDll, 'dword', 'GetFileAttributesW', 'wstr', $sPath & $sFile)
    If @error Or BitAND($aD[0], 0x400) Then ContinueLoop
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    If $fRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0, True, $sDelim, False)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $fOpenDLL Then DllClose($hDll)
    If $iFormat And $sReturn = '' Then Return SetError(0, 1, StringSplit($sReturn, '', $iFormat))
    If $iFormat Then Return SetError(0, 2, StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat))
    Return $sReturn
    EndFunc

    [/autoit]
  • Problem mit If-Abfrage

    • Oscar
    • 31. März 2013 um 18:39

    Ein Sleep gehört niemals in die MsgLoop-Schleife. Damit bekommst Du immer Probleme mit der Steuerung.
    Wenn Du das verlangsamen willst, benutze eine Timer:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GdiPlus.au3>
    #include <Misc.au3>
    #include <file.au3>
    Global $path, $Leben, $path2
    OnAutoItExitRegister("_end")
    $x = 0
    $y = 0
    $path = @ScriptDir & "\PICS\"
    $path = @ScriptDir & "\INI\"
    $Leben = IniRead(@ScriptDir & "\INI\DATA.ini", "DATA", "Leben", 1)
    $Form1 = GUICreate("X-The Game", 600, 500, Default, Default, $WS_POPUP)
    GUISetBkColor(0xffa500, $Form1)
    GUISetState(@SW_SHOW)
    _GDIPlus_Startup()
    $Player = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Skin.gif")
    $bk = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Gras.gif")
    $height = _GDIPlus_ImageGetHeight($Player)
    $widht = _GDIPlus_ImageGetWidth($Player)
    $verhaelnis = $height / $widht
    $load_bk = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Load_Leer.gif")
    $load = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Load.gif")
    $erschaffen = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Erschaffen.gif")
    $btn_exit = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\close1.gif")
    $feld1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Feld.gif")
    $feld2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Feld.gif")
    $feld3 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Feld.gif")
    $feld4 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Feld.gif")
    $feld5 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Feld.gif")
    $feld6 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\Feld.gif")
    $graphic = _GDIPlus_GraphicsCreateFromHWND($Form1)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(700, 500, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
    $iTimer = TimerInit()
    While 1
    ;===========Buttons==============================;
    $mouse = GUIGetCursorInfo()
    If IsArray($mouse) Then
    If $mouse[0] >= 520 And $mouse[1] <= 25 Then
    $btn_exit = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\close2.gif")
    Else
    $btn_exit = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\PICS\close1.gif")
    EndIf
    EndIf
    ;================ENDE=============================;
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    If TimerDiff($iTimer) > 100 Then
    Select
    Case _IsPressed(25) And $x > 0
    $x -= 40
    Case _IsPressed(26) And $y > 0
    $y -= 40
    Case _IsPressed(27) And $x < 340
    $x += 40
    Case _IsPressed(28) And $y < 340
    $y += 40
    EndSelect
    $iTimer = TimerInit()
    EndIf
    _GDIPlus_GraphicsDrawImageRect($buffer, $erschaffen, 440, 60, 120, 120)
    _GDIPlus_GraphicsDrawImageRect($buffer, $bk, 0, 0, 400, 400)
    _GDIPlus_GraphicsDrawImageRect($buffer, $Player, $x, $y, 40, 40 * $verhaelnis)
    _GDIPlus_GraphicsDrawImageRect($buffer, $load_bk, 80, 450, 220, 40)
    _GDIPlus_GraphicsDrawString($graphic, "LP/" & $Leben, 0, 460)
    _GDIPlus_GraphicsDrawImageRect($buffer, $btn_exit, 560, 0, 40, 40)
    _GDIPlus_GraphicsDrawImageRect($buffer, $load, 90, 460, $Leben * 2, 20)
    _GDIPlus_GraphicsDrawImageRect($buffer, $feld1, 440, 200, 60, 60)
    _GDIPlus_GraphicsDrawImageRect($buffer, $feld2, 440, 270, 60, 60)
    _GDIPlus_GraphicsDrawImageRect($buffer, $feld3, 440, 340, 60, 60)
    _GDIPlus_GraphicsDrawImageRect($buffer, $feld4, 510, 200, 60, 60)
    _GDIPlus_GraphicsDrawImageRect($buffer, $feld5, 510, 270, 60, 60)
    _GDIPlus_GraphicsDrawImageRect($buffer, $feld6, 510, 340, 60, 60)
    _GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 0)
    WEnd
    Func _end()
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_ImageDispose($Player)
    _GDIPlus_ImageDispose($bk)
    _GDIPlus_Shutdown()
    EndFunc ;==>_end

    [/autoit]
  • [Mini-Tutorial] BitOR und Konsorten.

    • Oscar
    • 30. März 2013 um 17:18

    Also ich finde ja BitShift sehr interessant (schnelles verdoppeln/halbieren). Nur, was ich bei AutoIt nie verstanden habe, warum es kein Überlauf-Bit gibt?
    Aufgrund des 32-Bit Datentyps noch dazu vorzeichenbehaftet braucht man doch ein Überlauf-Bit. Ohne ist das nicht sinnvoll zu gebrauchen, IMHO.
    Oder habe ich da was übersehen?

  • InetGet sehr unzuverlässig

    • Oscar
    • 30. März 2013 um 16:59
    Zitat von Fliwatt


    Das Seltsame dabei ist, dass er nicht erkennt, dass die Datei kaputt ist sondern es erst das Entpackprogramm bemerkt. (7z)
    Wie kann ich die Funktion optimieren, damit solche Probleme nicht auftreten und wo liegt mein Fehler?

    Ich sehe in Deiner Funktion kein InetClose. Wenn das Handle nicht geschlossen ist, dann ist die Datei möglicherweise auch nicht komplett gespeichert.

  • Anfängerschwierigkeiten (Checkbox, Button etc.)

    • Oscar
    • 29. März 2013 um 19:14

    Zum einen sollte man den Status der Checkbox mit

    [autoit]

    If BitAnd(GUICtrlRead($Checkbox),$GUI_CHECKED) Then ...

    [/autoit]


    auslesen.
    Zum anderen enthält die Variable $faktor die ID der Inputbox. Den dort eingetragenen Wert bekommst Du mit

    [autoit]

    GUICtrlRead($faktor)

    [/autoit]

    Und noch ein Hinweis zu dem Quelltext: Bitte bei längeren Codeabschnitten zusätzlich den Spoiler verwenden.

  • FileRead Problem

    • Oscar
    • 29. März 2013 um 15:46

    Ilse, Du solltest Dir angewöhnen Dein komplettes Script einzustellen oder zumindest ein nachvollziehbares Beispiel.
    Bei dem, was Du gepostet hast, weiss niemand welche Datei in $Liste enthalten ist und es kennt keiner den Inhalt von "Quellcode.txt".
    Außerdem benutzt Du StringRegExp mit dem Handle von FileOpen. Das kann überhaupt nicht funktionieren. Du musst die Datei erstmal einlesen (FileRead/Line).
    Entsprechende Beispiele stehen in der Hilfe zu FileRead und FileReadLine.

  • Wie kann ich das scrapen?

    • Oscar
    • 28. März 2013 um 21:10

    Die HTML-Seite laden und mit den Stringbefehlen (StringRegExp) den Link extrahieren.
    Genaueres kann man nur sagen, wenn Du uns sagst um welche Seite es sich handelt.

  • Alle 10 Sekunden eine Zeile aus einer txt Datei auslesen?

    • Oscar
    • 28. März 2013 um 20:59

    Die Lösung von name22 ist ja auch keine Komplettlösung (Endlosschleife). :D

  • Abbruchbedingung in For Schleife

    • Oscar
    • 25. März 2013 um 18:30

    Ich würde statt eine Schleife zu starten, einfach eine Variable als Zähler verwenden und diese in die MessageLoop-Schleife einbauen:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    $hGui = GUICreate('Test', 300, 200)
    $ID_Label = GUICtrlCreateLabel('0', 10, 10, 200, 20)
    $ID_Start = GUICtrlCreateButton('Start', 10, 40, 80, 20)
    $ID_Stop = GUICtrlCreateButton('Stop', 100, 40, 80, 20)
    GUISetState()
    Global $fStart = False, $iCounter = 0
    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $ID_Start
    $fStart = True
    Case $ID_Stop
    $fStart = False
    EndSwitch
    If $fStart Then
    $iCounter += 1
    If $iCounter = 10000 Then $fStart = False
    GUICtrlSetData($ID_Label, $iCounter)
    EndIf
    WEnd

    [/autoit]


    Das ist viel einfacher und weniger fehleranfällig, als diese "Spaghetticode-Rekursiv-Aufrufe" irgendwelcher Funktionen.

    Generell solltest Du Dir aber darüber im Klaren sein, dass die MsgLoop-Schleife abhängig ist vom Benutzer. Wenn der Benutzer die Maus bewegt oder etwas auf der Tastatur schreibt, wird die Schleife öfter durchlaufen, als wenn der Benutzer gerade nichts macht. Wenn das entscheidend ist, dann solltest Du auf den OnEventMode ausweichen.

  • Schnelleres als MouseClicks ?

    • Oscar
    • 25. März 2013 um 12:37

    Natürlich gibt es etwas schnelleres = ControlClick.
    Kommt aber darauf am, was Du machen willst. Beschreib doch mal ausführlicher, welches Programm Du damit steuern willst.

  • Interprozesskommunikation

    • Oscar
    • 24. März 2013 um 12:55

    Ich habe das Beispiel noch etwas verbessert (siehe Post #1).

  • Quick TXT-Viewer

    • Oscar
    • 24. März 2013 um 11:50

    Ok sorry, es wird schon angezeigt (hatte es wirklich nicht getestet).
    Es wird aber trotzdem immer die ganze Textdatei angezeigt. Bei großen Textdateien dauert das aber etwas.
    Vielleicht solltest Du das noch konfigurierbar machen. Zum Beispiel, dass bei Dateien mit mehr als 100 Zeilen nur die ersten 100 Zeilen angezeigt werden oder so.
    Zum durchblättern sollte das ja reichen.

  • Quick TXT-Viewer

    • Oscar
    • 22. März 2013 um 17:20
    Zitat von x0r

    ...ohne sie direkt zu öffnen (spart Zeit, meiner Meinung nach).


    Was glaubst Du denn, was bei "ShellExecute(filename)" passiert?
    Wenn, dann solltest Du einen kleinen Textviewer selbst schreiben und zum Beispiel nur die ersten 10 Zeilen (oder so) anzeigen lassen.
    Das würde dann Zeit sparen (bei längeren Textfiles). :)

  • Statusbar - Verschiedene Farben für die einzelnen Parts

    • Oscar
    • 21. März 2013 um 07:31

    Funktioniert und sieht gut aus. Gleich mal archivieren. Kann ich bestimmt mal brauchen. Danke! :thumbup:

  • Fenstergrösse von FileSelectFolder verändern

    • Oscar
    • 21. März 2013 um 07:25

    Vergrößern und positionieren kann man mit WinMove. Da jedoch die Abarbeitung des AutoIt-Scripts angehalten wird, wenn man eine Dialogbox aufruft, muss man zu einem Trick greifen, um die Fenstergröße/-position zu ändern.
    Dieser Trick besteht in dem ausnutzen der Timer-UDF. Die Funktion, die man dort angibt, wird nämlich auch während der Dialogboxen aufgerufen:

    Spoiler anzeigen
    [autoit]


    #include <Timers.au3>
    $hGui = GUICreate('Test')

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

    _Timer_SetTimer($hGui, 50, '_MoveDialogBox')

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

    $_Var = FileSelectFolder('Bitte Ordner auswählen', '', 5)

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

    Func _MoveDialogBox($hWnd, $Msg, $iIDTimer, $dwTime)
    #forceref $hWnd, $Msg, $iIDTimer, $dwTime
    If Not WinExists('Ordner suchen') Then Return
    WinMove('Ordner suchen', '', 50, 50, 350, 480)
    _Timer_KillAllTimers($hGui)
    EndFunc

    [/autoit]
  • DromEd (Strg+V)?

    • Oscar
    • 20. März 2013 um 17:58

    [verschoben nach H&U]

  • Lizenz

    • Oscar
    • 19. März 2013 um 19:14

    Wenn Du so eine Liste auf den Server packst, dann aber nicht im Klartext. Das wäre nun wirklich zu simpel zu umgehen.
    Am besten nur die jeweiligen Checksummen (z.B. SHA1, geht mit _Crypt_HashData) dort ablegen. Im Script dann Checksumme der MAC-Adresse erstellen und vergleichen mit der Liste. Wobei die Übertragung am besten noch verschlüsselt erfolgen sollte, damit man da nicht falsche Werte "einstreuen" kann.
    Statt der MAC-Adresse könntest Du auch verschiedene Hardware-Komponenten auslesen und daraus einen Hashwert erstellen. Das ist nicht so leicht zu fälschen (wenn man es nicht gleich im Programm umgeht).
    Gegen die echten Cracks hast Du aber sowieso keine Chance. 100% sicher bekommst Du das nie.

  • Interprozesskommunikation

    • Oscar
    • 19. März 2013 um 17:02
    Zitat von chesstiger

    Schönes Tutorial, Oscar.^^
    Hast du vor, auch noch andere Wege der Interprozesskommunikation zu erklären?
    Also... z.B. Exchange Variables, Std-Stream... ^^

    Danke für das Lob!
    Aber die anderen Wege überlasse ich besser denen, die sich damit auskennen. Ich hab's schonmal mit NamedPipes probiert, aber da bekomme ich kein funktionierendes Beispiel hin.
    Alle Scripte, die ich dazu gefunden habe, sind auch mehr oder weniger fehlerbehaftet. Vielleicht fühlt sich ja jemand berufen, mal ein einfaches Beispiel zu schreiben?! :)

  • Interprozesskommunikation

    • Oscar
    • 17. März 2013 um 19:58

    Ich habe hier mal ein Beispielscript geschrieben, das eine Kommunikation zwischen zwei Prozessen ermöglicht.
    Dazu wird eine TCP-Verbindung über den Localhost (IP: 127.0.0.1) aufgebaut. Das Script ist mit zahlreichen Kommentaren versehen, sodass es hoffentlich verständlich ist.

    Edit: Ich habe das Script noch etwas abgeändert. Es wird jetzt für den Server eine eigene GUI benutzt, sodass man besser sehen kann, wie man das Beispiel in das eigene Script einbauen kann.
    Es ist zum testen auch nicht mehr nötig das Script vorher zu compilieren. Es wird automatisch doppelt gestartet.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <Misc.au3>

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

    Global $sTitle = 'Interprozesskommunikation' ; Programmname (für _Singleton)
    Global $sIPAddress = '127.0.0.1' ; Localhost-IP-Adresse
    Global $iPort = 55555 ; beliebige Portnummer (sollte im Bereich zwischen 49152 und 65535 liegen)
    Global $hGui, $ID_Input, $MainSocket, $ConnectedSocket = -1, $sData, $sRecv, $iPID

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

    TCPStartup()
    If _Singleton($sTitle, 1) = 0 Then ; wenn Server bereits gestartet, dann hier als Client weitermachen
    $ConnectedSocket = TCPConnect($sIPAddress, $iPort) ; Verbindung zum Server herstellen
    If @error Then ; wenn nicht erfolgreich, dann Client beenden mit Fehlermeldung
    MsgBox(16, 'FEHLER!', 'TCPConnect fehlgeschlagen! Fehlernr.: ' & @error)
    Else ; TCP-Verbindung war erfolgreich
    Do ; Schleife mit InputBox solange aufrufen, bis der Benutzer auf 'Abbrechen' klickt oder ein Fehler beim senden auftritt
    $sData = InputBox($sTitle & ' - Client', 'Daten eingeben die an den Server gesendet werden sollen:', '', '', 420, 140)
    If @error Then ExitLoop ; Benutzer hat auf 'Abbrechen' geklickt, also Schleife verlassen
    $sData = StringToBinary($sData, 4) ; Daten umwandeln
    TCPSend($ConnectedSocket, $sData) ; Daten an den Server senden
    Until @error ; mit der Schleife fortfahren, wenn beim senden kein Fehler aufgetreten ist
    TCPCloseSocket($ConnectedSocket) ; Verbindung zum Server trennen
    EndIf
    Else ; Server läuft noch nicht, also Server starten
    $hGui = GUICreate($sTitle & ' - Server', 360, 480)
    $ID_Input = GUICtrlCreateEdit('', 10, 10, 340, 460)
    GUISetState(@SW_SHOW, $hGui)
    $MainSocket = TCPListen($sIPAddress, $iPort)
    If $MainSocket = -1 Then Exit MsgBox(0, $sTitle, 'Server konnte nicht gestartet werden!')
    GUICtrlSetData($ID_Input, '> Server gestartet!' & @CRLF, 1)
    GUICtrlSetData($ID_Input, '> Starte Client...' & @CRLF, 1)
    Run(@AutoItExe & ' "' & @ScriptFullPath & '"') ; starte das Script nochmal (als Client)
    If @error Then Exit MsgBox(0, $sTitle, 'Client konnte nicht gestartet werden.')
    GUICtrlSetData($ID_Input, '> Client gestartet.' & @CRLF, 1)
    Do ; in dieser Schleife wartet der Server auf Daten und es wird GUIGetMsg abgefragt
    If $ConnectedSocket = -1 Then ; wenn noch keine Verbindung hergestellt wurde, dann..
    $ConnectedSocket = TCPAccept($MainSocket) ; abfragen, ob sich der Client verbunden hat
    If $ConnectedSocket <> -1 Then ; wenn Verbindung hergestellt, dann Meldung ausgeben
    GUICtrlSetData($ID_Input, '> Verbindung hergestellt.' & @CRLF, 1)
    GUICtrlSetData($ID_Input, '> Warte auf Daten...' & @CRLF, 1)
    EndIf
    Else ; Verbindung ist hergestellt
    $sRecv = TCPRecv($ConnectedSocket, 2048) ; Daten abholen
    If @error Then ; wenn dabei ein Fehler aufgetreten ist, dann ist die Verbindung unterbrochen (Client beendet)
    $ConnectedSocket = -1
    GUICtrlSetData($ID_Input, '> Verbindung unterbrochen.' & @CRLF, 1)
    GUICtrlSetData($ID_Input, '> Warte auf Verbindung...' & @CRLF, 1)
    Else ; Daten wurden korrekt empfangen
    $sRecv = BinaryToString($sRecv, 4) ; Daten umwandeln
    If $sRecv <> '' Then GUICtrlSetData($ID_Input, $sRecv & @CRLF, 1) ; und im Editfeld ausgeben
    EndIf
    EndIf
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    GUICtrlSetData($ID_Input, '> Verbindung getrennt.' & @CRLF, 1)
    GUICtrlSetData($ID_Input, '> Server wird beendet.' & @CRLF, 1)
    TCPCloseSocket($ConnectedSocket)
    Sleep(1000)
    EndIf
    TCPShutdown()
    Exit

    [/autoit]

    Dateien

    Interprozesskommunikation.au3 3,5 kB – 471 Downloads

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™