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

  • Schieben von PDF´s in den richtigen Ordner

    • Oscar
    • 30. Januar 2018 um 10:18

    Es reicht ja, wenn man bei Scriptstart einmal einen Event aufruft, dann werden die dort bereits vorhandenen PDFs bearbeitet.

    Du musst also nach GuiSetState(@SW_SHOW, $hGui) (Zeile 36) nur die folgende Zeile einfügen: WM_SHELLCHANGENOTIFY(0, 0, 0, 2).

  • Errormessage Option

    • Oscar
    • 30. Januar 2018 um 05:22

    Der Unterschied besteht darin, dass Du die Exe startest und er das Script aus SciTE (mit F5) heraus.

  • Script zum beheben der "Script breaking changes"

    • Oscar
    • 29. Januar 2018 um 18:00

    In der Shoutbox gab es ja heute die Diskussion über die "Script breaking changes" und das dadurch einige ältere Scripte nicht mehr laufen.

    Ich denke, bei den meisten alten Scripten müssen nur ein paar Ersetzungen vorgenommen werden. Beim durchschauen von meinen alten Scripten sind mir drei wesentliche Punkte aufgefallen:

    1. die globale GDI+ Variable (alt: $ghGDIPDll, neu: $__g_hGDIPDll).

    2. die Funktion "_IIF", die aufgrund des ternären Operators gestrichen wurde.

    3. AdlibEnable -> AdlibRegister und AdlibDisable -> AdlibUnRegister.

    Und warum alles von Hand ersetzen, wenn wir doch AutoIt haben? Also habe ich ein kleines Script geschrieben, was diese Ersetzungen vornimmt:

    AutoIt
    #include <FileConstants.au3>
    
    Global $sOldAutoItScript = FileOpenDialog('Bitte das alte Script auswählen!', @ScriptDir, 'AutoIt-Script (*.au3)', $FD_FILEMUSTEXIST + $FD_PATHMUSTEXIST)
    If @error Then Exit
    Global $sOldScript = FileRead($sOldAutoItScript)
    _ReplaceGDIPVar($sOldScript)
    _ReplaceIIF($sOldScript)
    _ReplaceAdlib($sOldScript)
    _ReplaceStringReverse($sOldScript)
    _ReplaceOnAutoItExit($sOldScript)
    _ReplaceOnAutoItStart($sOldScript)
    Global $sPath = StringRegExpReplace($sOldAutoItScript, '(.+\\).+', '$1')
    Global $sNewFile = StringRegExpReplace($sOldAutoItScript, '.+\\(.+)\.au3', '$1_new.au3')
    Global $hFile = FileOpen($sPath & $sNewFile, 2)
    FileWrite($hFile, $sOldScript)
    FileClose($hFile)
    ShellExecute($sPath & $sNewFile)
    
    ; Die globale Variable bei GDI+ wurde geaendert.
    ; Das laesst sich durch einfaches Replace beheben
    Func _ReplaceGDIPVar(ByRef $sScript)
        $sScript = StringReplace($sScript, '$ghGDIPDll', '$__g_hGDIPDll')
    EndFunc   ;==>_ReplaceGDIPVar
    
    ; Die Funktion "_IIF()" wurde geloescht zugunsten des ternaeren Operators.
    ; Das laesst sich auch austauschen
    Func _ReplaceIIF(ByRef $sScript)
        $sScript = StringRegExpReplace($sScript, '(?s)(.*)_IIF\((.+?),(.+?),(.+?)\)(.*)', '$1($2 ?$3 :$4)$5')
    EndFunc   ;==>_ReplaceIIF
    
    ; AdlibEnable wurde gegen AdlibRegister ausgetauscht
    ; und AdlibDisable gegen AdlibUnRegister.
    ; Das laesst sich durch einfaches Replace beheben
    Func _ReplaceAdlib(ByRef $sScript)
        $sScript = StringReplace($sScript, 'AdlibEnable', 'AdlibRegister')
        $sScript = StringReplace($sScript, 'AdlibDisable', 'AdlibUnRegister')
    EndFunc   ;==>_ReplaceAdlib
    
    ; Die Funktion "_StringReverse" wurde durch eine interne Funktion "StringReverse" ersetzt.
    ; Das laesst sich durch einfaches Replace beheben
    Func _ReplaceStringReverse(ByRef $sScript)
        $sScript = StringReplace($sScript, '_StringReverse', 'StringReverse')
    EndFunc   ;==>_ReplaceStringReverse
    
    ; Die Funktion "OnAutoItExit()" und die Option "Opt('OnExitFunc', 'Funktion')" wurden
    ; durch "OnAutoItExitRegister()" ersetzt.
    ; Damit die Funktionalitaet des alten Scripts erhalten bleibt, muss die Funktion dort registriert werden.
    Func _ReplaceOnAutoItExit(ByRef $sScript)
        If StringInStr($sScript, 'Func OnAutoItExit') Then
            $sScript = StringFormat('OnAutoItExitRegister("OnAutoItExit")\r\n%s', $sScript)
        EndIf
        If StringRegExp($sScript, '(?s).*(?:AutoItSetOption|Opt)\(.OnExitFunc.+') Then
            Local $sFunc = StringRegExpReplace($sScript, '(?s).*(?:AutoItSetOption|Opt)\(.OnExitFunc.,.*?(\w+).+?\).*', '$1')
            $sScript = StringFormat('OnAutoItExitRegister("%s")\r\n%s', $sFunc, $sScript)
            $sScript = StringRegExpReplace($sScript, '(?s)(.*)(?:AutoItSetOption|Opt)\(.OnExitFunc.,.+?\)(.*)', '$1$2')
        EndIf
    EndFunc   ;==>_ReplaceOnAutoItExit
    
    ; Die Funktion "OnAutoItStart()" wurde durch eine Preprozessor-Anweisung "#OnAutoItStartRegister" ersetzt.
    ; Damit die Funktionalitaet des alten Scripts erhalten bleibt, muss die Funktion dort eingetragen werden.
    Func _ReplaceOnAutoItStart(ByRef $sScript)
        If StringInStr($sScript, 'Func OnAutoItStart') Then
            $sScript = StringFormat('#OnAutoItStartRegister "OnAutoItStart"\r\n%s', $sScript)
        EndIf
    EndFunc   ;==>_ReplaceOnAutoItStart
    Alles anzeigen

    Fallen euch noch weitere "Script breaking changes" ein, die man hier mit aufnehmen kann?

    Edit 30.01.18: Es gibt jetzt noch folgende Ersetzungen:

    - _StringReverse

    - OnAutoItExit

    - OnAutoItStart

    Außerdem habe ich mal ein Beispielscript im alten Stil ("test1.au3" im Anhang) geschrieben, was mit der aktuellen AutoIt-Version nicht lauffähig ist. So könnt ihr sehen, was das obige Script daraus macht und dass es danach funktioniert.

    Dateien

    AutoItOld2New.au3 3,29 kB – 268 Downloads test1.au3 1,16 kB – 281 Downloads
  • Schieben von PDF´s in den richtigen Ordner

    • Oscar
    • 29. Januar 2018 um 15:50

    Hast Du die PDFs erst nach dem starten des Scripts nach "O:\" kopiert oder lagen die schon beim Start des Scripts dort?

    Im letzteren Fall kann ja nichts passieren, weil es kein Event von Windows gibt. Das Script reagiert erst, wenn ein PDF im überwachten Verzeichnis erstellt wird.

    Wenn es häufiger passiert, dass dort bereits PDFs liegen und die beim Scriptstart einsortiert werden sollen, dann könnte ich noch einen Button zum sortieren einbauen.

  • Inputbox, Inhalt wird nicht dargestellt

    • Oscar
    • 28. Januar 2018 um 09:21

    Schön, dass Du es lösen konntest.

    Nur so richtig helfen konnten wir mangels Script ja nicht und ohne ein Beispielscript (bei dem das beschriebene Problem auftritt), hilft die Lösung uns anderen auch nicht wirklich.

    Aber manchmal reicht es ja schon, wenn man über ein Problem diskutiert (ohne es zu kennen). ;)

  • Schieben von PDF´s in den richtigen Ordner

    • Oscar
    • 27. Januar 2018 um 14:23

    @NO1: An Deinem Script stört mich, dass Du das Verzeichnis ständig abfragst, ob neue PDFs vorhanden sind. Besser ist, wenn das Script auf eine Nachricht (Event) von Windows wartet und erst dann die PDFs einliest. So kann sich die Festplatte auch mal "schlafen legen". Außerdem kann man "pdftotext.exe" auch so aufrufen, dass der Text direkt als Stream an AutoIt übergeben wird, damit spart man sich das erstellen und wieder loeschen der Textdateien. Dein _FileListToArray kannst Du auch gleich mit Dateifilter ("*.pdf") aufrufen, dann musst Du das nicht noch zusätzlich ausfiltern.

    Nicht falsch verstehen! Das soll nur konstruktive Kritik sein, wie man es besser machen kann.

    Im Anhang gibt es meine Version des PDF-Sortierers (mit den obigen Features).

    Dateien

    PDFsort.zip 427,32 kB – 41 Downloads
  • Gruppe von Steuerlementen verstecken

    • Oscar
    • 24. Januar 2018 um 19:34

    Wenn Du die Control-Elemente der Gruppe alle nacheinander erstellst, dann musst Du nicht unbedingt ein Array benutzen:

    AutoIt
    #include <GUIConstantsEx.au3>
    
    Global $hGui = GUICreate("My GUI group", 480, 240)
    
    Global $idGroupStart = GUICtrlCreateGroup("Group 1", 190, 60, 90, 140)
    Global $idRadio1 = GUICtrlCreateRadio("Radio 1", 210, 90, 50, 20)
    Global $idRadio2 = GUICtrlCreateRadio("Radio 2", 210, 110, 60, 50)
    Global $idGroupEnd = GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    GUISetState(@SW_SHOW)
    Sleep(2000)
    _GroupSetState($idGroupStart, $idGroupEnd, $GUI_HIDE)
    Sleep(2000)
    _GroupSetState($idGroupStart, $idGroupEnd, $GUI_SHOW)
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
        EndSwitch
    WEnd
    
    Func _GroupSetState($idStart, $idEnd, $iState)
        For $idCtrl = $idStart To $idEnd
            GUICtrlSetState($idCtrl, $iState)
        Next
    EndFunc
    Alles anzeigen

    Das funktioniert aber nur, wenn die Control-Elemente alle hintereinander erstellt werden, denn AutoIt vergibt die Control-IDs der Reihe nach (1, 2, 3, 4,....usw.).

  • Gruppe von Steuerlementen verstecken

    • Oscar
    • 24. Januar 2018 um 18:13

    Controls in ein Array speichern und dann in einer For...Next-Schleife GuiCtrlSetState aufrufen!

    Control-Gruppen gibt es (in AutoIt) nicht!

  • Inputbox, Inhalt wird nicht dargestellt

    • Oscar
    • 23. Januar 2018 um 06:06
    Zitat von Mikki

    Sondern nur dann, wenn ich vorher ein zweites Fenster in einem anderen Abschnitt öffne, dieses schließe, und dann wieder das "alte" Fenster öffne.

    Hört sich für mich so an, als wenn es überlagernde Controls gibt (z.B. Label, was über das Input ragt).

    Ich würde Dir auch raten, bei den Controls die Höhe immer mit anzugeben (ob die Automatik da immer richtig arbeitet?).

  • wav. datei abspielen

    • Oscar
    • 22. Januar 2018 um 18:49
    Zitat von Tuxedo

    Eventuell kann sich ja mal einer von den Fortgeschrittenen Usern hier die UDF dahingehend mal ansehen.

    Eine File das nicht laden will, könnte ich zur Verfügung stellen.

    Ich kann mich noch dunkel daran erinnern, dass ich mit der Sound-UDF auch mal einen Player programmieren wollte.

    Wenn ich mich recht erinnere, dann gab es Probleme mit MP3s die VBR kodiert waren.

    Jedenfalls ist die BASS-UDF um ein Vielfaches besser geeignet und zuverlässiger.

  • _GDIPlus_ImageGetPropertyItems

    • Oscar
    • 20. Januar 2018 um 14:34
    Zitat von Peter S. Taler

    Wenn man Deinen Beispielcode laufen läßt und kein Bild vorhanden ist - gibt es im UDF eine Fehlermeldung - liegt wohl am fehlenden Bild

    Stimmt!

    Das fehlende Bild habe ich übersehen. Danke für den Hinweis! :):thumbup:

    Ich hab's oben (Post#1) mal geändert.

  • _GDIPlus_ImageGetPropertyItems

    • Oscar
    • 20. Januar 2018 um 12:23

    Neue Version (siehe Post#1)!

    Einige GPS-Daten werden jetzt ausgelesen.

  • CMD Ausgabe zuverlässig erfassen

    • Oscar
    • 18. Januar 2018 um 19:25
    Zitat von Crys

    Kannst du mir aber vielleicht sagen, wie du auf die Hex-Werte (0x010E, ...) bei dem DllStructGetData() gekommen bist?

    Das sind die PropertyItems. Siehe hier: https://msdn.microsoft.com/de-de/library/ms534416.aspx

    Die zusätzlichen Exifdaten waren jetzt aber nicht so schwer zu integrieren. Das habe ich schnell mal gemacht. Die neue Funktion gibt es hier: _GDIPlus_ImageGetPropertyItems

  • CMD Ausgabe zuverlässig erfassen

    • Oscar
    • 18. Januar 2018 um 17:59
    Zitat von Crys

    Ich wäre an den verschieden GPS-Daten interessiert:

    Ok, ich schaue mal. Könnte aber ein paar Tage dauern, weil ich momentan nicht so viel freie Zeit habe.

  • CMD Ausgabe zuverlässig erfassen

    • Oscar
    • 18. Januar 2018 um 17:50
    Zitat von Crys

    nur leider sind alle relevanten Daten, wie die "GPSImgDirection" nicht vorhanden

    Kannst Du mir mal ein Testbild (mit den Daten) zur Verfügung stellen?

  • CMD Ausgabe zuverlässig erfassen

    • Oscar
    • 18. Januar 2018 um 17:48
    Zitat von Crys

    Hast du da einen Ansatz für mich?

    Alpines hat ja bereits den Link zu der Funktion gepostet.

    Falls Dir da noch Exifdaten fehlen, melde Dich einfach. Ich schaue dann mal, was sich machen lässt.

    Es gibt so viele Exifdaten, die größtenteils gar nicht von den Kameras gespeichert werden, dass ich keine Lust hatte, alle einzubinden.

  • FileListToArray und Buttons anklicken

    • Oscar
    • 17. Januar 2018 um 18:26
    Zitat von Peter S. Taler

    Ich nehme die Prügel hin

    So war das nicht gemeint! :)

    Es ist ja nicht nur der Platzverbrauch, sondern auch, dass sich der Zähler nicht automatisch anpasst, wenn Du das Array in der Größe veränderst. UBound hingegen liefert immer den richtigen Wert.

  • FileListToArray und Buttons anklicken

    • Oscar
    • 17. Januar 2018 um 17:53
    Zitat von Peter S. Taler

    der nullte Wert eines Arrays sollte nie mit Daten befüllt werden, sondern den Zähler der Arrayfelder enthallten.

    Wer sagt das?

    Ich halte das Gegenteil davon für richtig: ein Zähler in Array[0] ist sowas von überflüssig!

  • Text Kodieren/Dekodieren

    • Oscar
    • 16. Januar 2018 um 15:44
    Zitat von AspirinJunkie

    Daher sollte hier zu gemacht werden.

    Jo! [Closed]

  • Viele Sub-Funktionen in einer main Funktion hinzufügen/entfernen

    • Oscar
    • 15. Januar 2018 um 15:56

    Lies Dir doch mal den Returnwert von _ArrayToString durch:

    Zitat

    Return Value

    Success: a string which combined selected elements separated by the delimiters.

    Es wird ein String zurückgegeben!

    Wenn Du diesen String aber keiner Variablen zuweist, dann verschwindet der ins Nirvana.

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™