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. Bitnugger

Beiträge von Bitnugger

  • Dokumentation von AU3-Scripten / Liste Variablen und Funktionen mit Zeilennummern

    • Bitnugger
    • 4. Mai 2020 um 20:26
    Zitat von BugFix

    aber es hieß wohl "GetDeclaredVars"

    Kann es sein, dass du GetUnUsedVars.au3 meinst?

  • OrganizeIncludes

    • Bitnugger
    • 4. Mai 2020 um 13:23
    Zitat von Moombas

    Danke für deine Mühe schon mal. Getestet habe ich nun deine Version:

    - Umlaute: :thumbup:

    - bestehende Includes löschen: :thumbup:

    Ich habe noch ein paar Änderungen an OrganizeIncludes gemacht, so dass jetzt auch die Ausgaben in der SciTE-Output-Pane korrekt dargestellt werden. Desweiteren werde ich mich mal dransetzen und versuchen, eine rekursive Ermittlung der Includes einzubauen, bzw. diese zu optimieren, insofern sie bereits vorhanden ist. Die aktuelle Version findet ihr immer in Post #7.

    Zitat von Moombas

    Den Shortcut hatte ich noch nicht geändert, da ich nicht zu oft daran Hand anlegen wollte, wenn es halt eine Lösung zur autom. Ausführung vor dem Kompilieren gegeben hätte. Und warum wäre das kontraproduktiv? Bisher hat er alle (selbst "nicht Standard") includes gefunden und eingebunden.

    Zitat von Bitnugger

    Ja, das geht, aber es wäre extrem kontraproduktiv. Wieso änderst du nicht einfach die Tastenkombination in der SciTEUser.properties z.B. auf Ctrl + Enter?

    command.shortcut.45.*.au3=Ctrl+Shift+Alt+I

    command.shortcut.45.*.au3=Ctrl+Enter

    Den Shortcut musst du nur einmalig ändern - es kann also keine Rede von "zu oft daran Hand anlegen" sein.

    Die automatische Ausführung von OrganizeIncludes ist extrem kontraproduktiv, weil es dann ja bei jedem Kommpiliervorgang ausgeführt wird, auch wenn in dem Script nur marginale Änderungen vorgenommen wurden, z.B.wenn du lediglich einen Text korrigiert hast, wodurch sich an den benötigten Includes ja garantiert nichts ändert.

    Wenn du es dennoch machen willst, dann füge einfach folgende Zeilen an den Anfang deines Script ein:

    AutoIt
    ;~ Achtung: Pfade anpassen!!!
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Run_Before=""c:\Program Files (x86)\AutoIt3\AutoIt3.exe" "f:\AutoIt\AutoIt3_Tools\OrganizeIncludes\OI_1.0.0.50.au3" "%in%""
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

    Im AutoItWrapper (die auszuführende Zeile kannst du alternativ auch dort eintragen) sieht das dann so aus:

    AutoItWrapper.jpg

    In diesem Bild kann man übrigens sehen, dass OrganizeIncludes die includes nicht wirklich optimal hinzufügt...

    OrganizeIncludes.jpg

    ...da in diesem Fall tatsächlich nur zwei includes benötigt werden... und zwar diese:

    #include <Debug.au3> 

    #include <File.au3>

    #include <Array.au3>, #include <FileConstants.au3> und #include <StringConstants.au3> werden bereits durch #include <File.au3> hinzugefügt und sind somit doppelt gemoppelt! Das produziert zwar keinen Fehler, weil das #include-once in den jeweiligen Includes dafür sorgt, dass diese nur einmalig hinzugefügt werden - es ist aber nichtsdestrotrotz unnötig.

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • Bitnugger
    • 1. Mai 2020 um 19:38

    Na das ist ja schon mal ein gewaltiger Unterschied!

    AutoIt
    ;-- TIME_STAMP   2020-05-01 20:50:32
    
    #AutoIt3Wrapper_UseX64=y ; <<<=== Change it to y/n and press <Alt + F5> to start the patched Beta!
    
    ;~ https://autoit.de/thread/86867-msgbox-verlangsamt-den-skriptablauf-unter-win-10/?postID=699015#post699015
    ;~ https://www.autoitscript.com/forum/topic/202270-script-becomes-way-slower-after-a-msgbox-moved/
    ;~ https://www.autoitscript.com/autoit3/files/beta/autoit/win10slow/
    
    ConsoleWrite(StringFormat(';~ %-55s %-10s\n', @AutoItExe, @AutoItVersion))
    
    _Test(False, 0)
    _Test(False, 1)
    _Test(True, 0)
    _Test(True, 1)
    
    Func _Test($bMsgBox = False, $iGUIOnEventMode = 0)
        Local Static $iMsgBox = False
        Local $x = 0, $hTimer = TimerInit()
        AutoItSetOption('GUIOnEventMode', $iGUIOnEventMode)
        If $bMsgBox And $iMsgBox = False Then
            $iMsgBox = True
            MsgBox(0, "", TimerDiff($hTimer), 1, WinGetHandle('[ACTIVE]'))
        EndIf
        For $i = 1 To 500000
            $x += 1
        Next
        ConsoleWrite(StringFormat(';~ Diff = %15s, GUIOnEventMode = %i, $iMsgBox = %i\n', TimerDiff($hTimer), $iGUIOnEventMode, $iMsgBox))
        If $iGUIOnEventMode Then AutoItSetOption('GUIOnEventMode', 0)
    EndFunc
    
    ;~ C:\Program Files (x86)\AutoIt3\autoit3.exe              3.3.14.5
    ;~ Diff =        121.6931, GUIOnEventMode = 0, $iMsgBox = 0
    ;~ Diff =         277.118, GUIOnEventMode = 1, $iMsgBox = 0
    ;~ Diff =       1839.2242, GUIOnEventMode = 0, $iMsgBox = 1
    ;~ Diff =        953.5653, GUIOnEventMode = 1, $iMsgBox = 1
    
    ;~ C:\Program Files (x86)\AutoIt3\autoit3_x64.exe          3.3.14.5
    ;~ Diff =        113.2212, GUIOnEventMode = 0, $iMsgBox = 0
    ;~ Diff =        264.4404, GUIOnEventMode = 1, $iMsgBox = 0
    ;~ Diff =       1760.7921, GUIOnEventMode = 0, $iMsgBox = 1
    ;~ Diff =        843.8279, GUIOnEventMode = 1, $iMsgBox = 1
    
    ;;~ C:\Program Files (x86)\AutoIt3\Beta\autoit3.exe         3.3.15.1
    ;~ Diff =         99.0429, GUIOnEventMode = 0, $iMsgBox = 0
    ;~ Diff =        262.1309, GUIOnEventMode = 1, $iMsgBox = 0
    ;~ Diff =       1170.7505, GUIOnEventMode = 0, $iMsgBox = 1
    ;~ Diff =        256.9184, GUIOnEventMode = 1, $iMsgBox = 1
    
    ;~ C:\Program Files (x86)\AutoIt3\Beta\autoit3_x64.exe     3.3.15.1
    ;~ Diff =         94.2364, GUIOnEventMode = 0, $iMsgBox = 0
    ;~ Diff =         251.337, GUIOnEventMode = 1, $iMsgBox = 0
    ;~ Diff =       1172.7595, GUIOnEventMode = 0, $iMsgBox = 1
    ;~ Diff =        246.0969, GUIOnEventMode = 1, $iMsgBox = 1
    Alles anzeigen
  • QRCode.au3 & QRCodeUI.au3 & QRCreatorCI.au3 mit aktueller quricol.dll (32 & 64 bit) integriert

    • Bitnugger
    • 1. Mai 2020 um 17:47
    Zitat von BugFix

    Das halte ich eigentlich immer so, damit die Includenamen in Bsp. und Anwendungen bei neueren Versionen nicht ersetzt werden müssen, im Post die neue Version aber klar erkennbar ist.

    Ja, klar, ich verstehe... aber das ändert ja nichts an dem, was ich gesagt habe: Ein wenig umständlich finde ich nur, ...

    Vorschlag: Biete zusätzlich ein ZIP-Archiv (eg. QRCreatorUI[0.1].zip) an, in dem immer die aktuellen Versionen aller Dateien enthalten sind - jedoch ohne das [Version] in den darin enthaltenen Dateinamen, damit das/die Script/s|Beispiel/e ohne zusätzliche Arbeit direkt gestartet werden können.

  • QRCode.au3 & QRCodeUI.au3 & QRCreatorCI.au3 mit aktueller quricol.dll (32 & 64 bit) integriert

    • Bitnugger
    • 1. Mai 2020 um 16:40

    Hey, das klappt ja mal wirklich super - direkt beim ersten Versuch hat es geklappt!

    Ein wenig umständlich finde ich nur, dass im QRCreatorUI die Includes ohne [Versionsnummer] gesucht werden, sie aber in den dateinamen der Includes enthalten sind, so dass ich sie erst umbenennen muss, oder die entsprechenden Zeilen im QRCreatorUI ändern muss. Schön wäre auch, wenn man das ganze Paket in einem Rutsch als ZIP-Archiv downloaden könnte.

  • [Nim] und die BASS-Dll

    • Bitnugger
    • 1. Mai 2020 um 08:33
    Zitat von Oscar

    Wenn Du in Nim einen String mit Backslashes hast, dann einfach ein "r" (RawString) davorsetzen:

    Oh, danke... super... hm, jetzt wo ich es sehe... da bin ich doch schon mal drüber gestolpert... habe es aber wieder vergessen.

  • OrganizeIncludes

    • Bitnugger
    • 1. Mai 2020 um 08:23
    Zitat von BugFix

    Was mir an OI nicht so gefiel, dass zu viel unnötige Includes eingefügt werden, da nicht rekursiv in den Includes gesucht wird.

    Stimmt, da liefert der IncludesHelper in vielen Fällen bessere Ergebnisse, doch der hat auch so seine Tücken, wobei der (gefühlt) auch deutlich schneller als OI ist.

    Zitat von BugFix

    Die rekursive Ermittlung ist aber recht tricky.

    In der Tat... der einzige Grund, warum ich das Thema nicht schon längst mal angegangen bin. 8o

  • OrganizeIncludes

    • Bitnugger
    • 1. Mai 2020 um 07:05
    Zitat von Moombas

    Kann man OI auch beim kompilieren drüber laufen lassen anstatt wirklich jedesmal die doch recht üppige Tastenkombination drücken zu müssen, also idealerweise:

    F7 fürs kompilieren -> autom. OI (silent) -> dann autom. erst das kompilieren?

    Ja, das geht, aber es wäre extrem kontraproduktiv. Wieso änderst du nicht einfach die Tastenkombination in der SciTEUser.properties z.B. auf Ctrl + Enter?

    command.shortcut.45.*.au3=Ctrl+Shift+Alt+I

    command.shortcut.45.*.au3=Ctrl+Enter

    Zitat von Moombas

    ABER: Er behält auch alle bereits vorhandenen includes, ich habe sie also ggf. doppelt/mehrfach drin.

    Das ist mir auch schon vor einiger Zeit aufgefallen... da ich OrganizeIncludes jedoch nur alle 7 Pfingsten benutze, war es mir egal.

    Heute habe ich nun doch mal einen Blick in OrganizeIncludes riskiert... und ich denke es liegt an dem ersten RegEx-Pattern in der Funktion _deleteIncludes.

    Ich habe ein kleines Test-Script erstellt und das Pattern darin korrigiert - und so scheint es nun zu funktionieren:

    Test.au3
    AutoIt
    ;-- TIME_STAMP   2020-05-01 05:47:07   v 1.0
    
    Opt('MustDeclareVars', 1)
    
    #include <AutoItConstants.au3>
    #include <Array.au3>
    
    #include <WinAPIConstants.au3>
    #include <WinAPISysWin.au3>
    
    Global $original_source = FileRead(@ScriptFullPath), $red_A = [2, 'Array.au3', 'WinAPIConstants.au3'], $removeALL_R = False, $removeUnneeded_R = True
    ;~ Global $original_source = '#include <AutoItConstants.au3>' & @CRLF & '#Exit#' & @CRLF & '#include <Array.au3>' & @CRLF & 'Tada...' & @CRLF ; <<== die #include... dürfen nicht gelöscht werden!
    
    ConsoleWrite(_deleteIncludes($original_source) & @CRLF) ; remove all
    $removeALL_R = True
    $removeUnneeded_R = False
    ConsoleWrite('> #############################################################################' & @CRLF)
    ConsoleWrite(_deleteIncludes($original_source) & @CRLF) ; remove unneded
    
    ;===============================================================================
    ; Description: Delete the includes
    ; a) all
    ; b) only unnedded includes are deleted
    ;===============================================================================
    Func _deleteIncludes(ByRef $original_source)
        ;all
        If _getCheckboxState($removeALL_R) Then
            ConsoleWrite('! remove all' & @CRLF)
            If StringLeft($original_source, 2) <> @CRLF Then $original_source = @CRLF & $original_source
    ;~         Return StringReplace(StringRegExpReplace($original_source, '(?i)(\v\h*#include\s*[\x3c\x22\x27].*?\v)', ''), @CRLF, '', 1) ; <<== funktioniert nicht (mehr?)
    ;~         Return StringReplace(StringRegExpReplace($original_source, '(?i)([\v\h]+?#include\s*[\x3c\x22\x27].*?\v)', ''), @CRLF, '', 1) ; <<== funktioniert
            Return StringReplace(StringRegExpReplace($original_source, '(?i)(\R+#include\s*[\x3c\x22\x27].*?\v)', ''), @CRLF, '', 1) ; <<== funktioniert
        ElseIf _getCheckboxState($removeUnneeded_R) Then
            ; unneded
            ; alle roten bekommen und dann die zeilen löschen
            For $i = 1 To UBound($red_A) - 1
                ConsoleWrite('! remove unneded: ' & $red_A[$i] & @CRLF)
                $original_source = StringRegExpReplace($original_source, '(?i)\s*#include\s*[\x3c\x22\x27]' & $red_A[$i] & '[\x3e\x22\x27]', '')
            Next
        EndIf
        Return $original_source
    EndFunc   ;==>_deleteIncludes
    ;==============================================================================
    
    Func _getCheckboxState($controlID)
        Return ($controlID = True)
    EndFunc
    Alles anzeigen
    Zitat von Moombas

    Und einen "Fehler" habe ich noch gefunden: Er mag keine Umlaute (im Pfad und Dateinamen).

    Was macht Er dann? Verzieht Er dann sein Gesicht und schmollt vor sich hin, oder was?8o

    Nein, Quatsch beiseite... das liegt an der Funktion _getSource.

    Dort muss folgende Zeile geändert...

    $SciTECmd = StringReplace($SciTECmd, '\\', '\')

    $SciTECmd = _WinAPI_MultiByteToWideChar(StringReplace($SciTECmd, '\\', '\'), 65001, 0, True)

    ...und ein Include für _WinAPI_MultiByteToWideChar an den Anfang des Scripts eingefügt werden...

    #include <WinAPIConv.au3> ; bzw. #include <WinAPI.au3>

    Dann wäre noch der Fehler mit der Leerzeile... das liegt an der Funktion _insertIncludes.

    Dort muss folgende Zeile...

    If FileWrite($hfile, $includes & @CRLF & $original_source) <> 1 Then

    ...durch diese ersetzt werden:

    If $includes <> '' Then $includes &= @CRLF 

    If FileWrite($hfile, $includes & $original_source) <> 1 Then 

    Im Anhang findest du eine korrigierte Version von OrganizeIncludes... ich habe den Dateinamen so belassen, weil ich sonst an einigen Stellen/PCs schrauben müsste.

    Edit: Habe noch eine Zeile in dem Archiv korrigiert:

    SendSciTE_Command('output:+> "Organize Includes" for AutoIt3 | ' & $scriptVersion & ' | ' & Chr(169) & ' Th.Meger' & Chr(153) & ' | ' & $date)

    SendSciTE_Command(_WinAPI_WideCharToMultiByte('output:+> "Organize Includes" for AutoIt3 | ' & $scriptVersion & ' | ' & Chr(169) & ' Th.Meger' & Chr(153) & ' | ' & $date, 65001))

    Edit: 04.05.2020 - Ausgaben in der SciTE-Output-Pane werden nun auch korrekt dargestellt (wenn in SciTE das IN/OUT-Encoding auf UTF-8 umgestellt wurde).

    Dateien

    OI_1.0.0.50.au3.zip 13,55 kB – 420 Downloads
  • [Nim] und die BASS-Dll

    • Bitnugger
    • 1. Mai 2020 um 00:33
    Zitat von alpines

    Versuchs mal mit \\ statt einem Backslash.

    Nein, so geht es auch nicht... aber rufe ich die Exe mit Parametern auf, funktioniert es.

    Zitat von Bitnugger

    Bsp.: Test.exe "F:\Audio\MP3\CD\Top 3000-4ever\Top 3000-4ever 0401-0500\0458. Albert Hammond - The Free Electric Band (1973).mp3"

  • [Nim] und die BASS-Dll

    • Bitnugger
    • 1. Mai 2020 um 00:11

    Schön!

    Habe es noch etwas erweitert... jetzt kann die Exe mit Parameter aufrufen werden... und es muss kein *.mp3 sein... *.m4a und *.flac usw. geht auch. ;)

    Bsp.: Test.exe "F:\Audio\MP3\CD\Top 3000-4ever\Top 3000-4ever 0401-0500\0458. Albert Hammond - The Free Electric Band (1973).mp3"

    Code
    import os, nimbass/bass # https://github.com/genotrance/nimbass
    
    discard BASS_Init(cint(-1), cast[DWORD](44100), cast[DWORD](0), cast[DWORD](0), nil)
    discard BASS_SetVolume(0.1)
    
    var 
        iActive: DWORD
        iLen: QWORD
        iSeconds, iSecondsNow: cdouble
        sMp3File = ""
    
    if paramCount() > 0:
        echo paramCount(), " ", paramStr(1)
        sMp3File = paramStr(1)
    else:
        sMp3File = "F:/Audio/MP3/CD/Top 3000-4ever/Top 3000-4ever 0401-0500/0458. Albert Hammond - The Free Electric Band (1973).mp3"
    
    #[
        So funktioniert es nicht!
        let sMp3File = "F:\Audio\MP3\CD\Top 3000-4ever\Top 3000-4ever 0401-0500\0458. Albert Hammond - The Free Electric Band (1973).mp3"
    
        So aber...
        let sMp3File = "F:/Audio/MP3/CD/Top 3000-4ever/Top 3000-4ever 0401-0500/0458. Albert Hammond - The Free Electric Band (1973).mp3"
        
        let sMp3File = "0458. Albert Hammond - The Free Electric Band (1973).mp3"
    ]#
    
    let cMp3File: cstring = sMp3File
    let hChannel = BASS_StreamCreateFile(false, cMp3File, 0, 0, BASS_STREAM_PRESCAN or BASS_STREAM_AUTOFREE)
    discard BASS_ChannelPlay(hChannel, false)
    iLen = BASS_ChannelGetLength(hChannel, BASS_POS_BYTE)
    iSeconds = BASS_ChannelBytes2Seconds(hChannel, iLen)
    
    while true:
        iActive = BASS_ChannelIsActive(hChannel)
        if iActive != BASS_ACTIVE_PLAYING: break
        iLen = BASS_ChannelGetPosition(hChannel, BASS_POS_BYTE)
        iSecondsNow = BASS_ChannelBytes2Seconds(hChannel, iLen)
        echo "Play: " & $int(iSecondsNow) & " / " & $int(iSeconds)
        sleep(1000)
    discard BASS_ChannelStop(hChannel)
    discard BASS_Free()
    Alles anzeigen
  • OrganizeIncludes

    • Bitnugger
    • 30. April 2020 um 21:24
    Zitat von BugFix

    Wenn ich mal Muße habe, werde ich mein in Lua angefangenes IncludeManagement mal fertigstellen.

    DAS wäre wirklich sehr schön!!!

    Moombas

    Neben OrganizeIncludes benutze ich auch den INCLUDES HELPER:

    https://www.autoitscript.com/forum/topic/13…ncludes-helper/

  • SciTE - Option "MustDeclareVars" mittels Property automatisch setzen

    • Bitnugger
    • 30. April 2020 um 20:58

    Mir ist aufgefallen, dass die folgende Zeile aus deinem Lua-Script nur dann korrekt funktioniert, wenn die Datei ohne Inhalt gespeichert wird, bzw. auch mit *, der dann ja von AutoStampSaveVersion.lua durch einen Time Stamp ersetzt wird.

    local a, e = fileread:find(';%-%- TIME_STAMP.*\r\n')

    Werden vor dem ersten Speichern der Datei aber noch einige Zeilen Code eingeben und die Zeilenumbrüche in dem Script bestehen aus CRLF, wird Opt('MustDeclareVars', 1) an der falschen Stelle eingefügt.

    So funktioniert es aber:

    local a, e = fileread:find(';%-%- TIME_STAMP.*%d+\r\n')

    Wobei man jetzt natürlich noch meckern könnte, dass die Datei durch den Time Stamp nun gemischte Zeilenumbrüche hat... Au3OptMustDeclareVars[0.2].lua hat übrigens nur LF als Zeilenumbrüche, alle anderen Lua-Scripte von dir aber CRLF!?

    In den Zeilen mit editor:InsertText(...) habe ich zudem noch vor dem "Opt" ein \n eingefügt...

    find.jpg

  • _Word_DocPictureAdd - Bild auf Seitengröße einpassen

    • Bitnugger
    • 28. April 2020 um 21:25
    Zitat von water

    Setze Parameter $bVisible auf False.

    Geil... aber das tut schon fast weh... :theke:

    Hier nun noch mein geändertes Script, mit dem sich auch mehrere Bilder in eine PDF-Datei speichern lassen, quasi als Sammelmappe.

    AutoIt: PIC_To_PDF.au3
    ;-- TIME_STAMP   2020-04-28 23:21:10   v 0.1
    
    Opt('MustDeclareVars', 1)
    
    #include <MsgBoxConstants.au3>
    #include <APIRegConstants.au3>
    #include <Array.au3>
    #include <Word.au3>
    #include <WinAPIShPath.au3>
    #include <WinAPIReg.au3>
    
    Global $g_aPicExt = ['.ani', '.awd', '.bmp', '.dib', '.cam', '.cdr', '.cur', '.clp', '.dcm', '.acr', '.dcx', '.djvu', '.iw44', '.emf', '.eps', '.fpx', '.g3', '.gif', '.icl', '.ico', '.iff', '.lbm', '.img', '.jpg', '.jpeg', '.kdc', '.ldf', '.lwf', '.pbm', '.pcd', '.pcx', '.pgm', '.png', '.ppm', '.psd', '.psp', '.ras', '.sun', '.rle', '.sff', '.sfw', '.sgi', '.rgb', '.tga', '.svg', '.tbn', '.tif', '.thm']
    
    _Main()
    
    Func _Main()
        ; PIC_To_PDF [/F:FileName.jpg | /L:ListName.txt] [/S[:SaveAs.pdf]]
        ; Examples:
        ; PIC_To_PDF /F:FileName.bmp
        ; PIC_To_PDF /F:FileName.jpg /S
        ; PIC_To_PDF /F:FileName.png /S:SaveAs.pdf
        ; PIC_To_PDF /L:ListName.txt /S
        ; PIC_To_PDF /L:ListName.txt /S:SaveAs.pdf
        Local $aList[0], $aBadFiles[0], $sListName, $sFileName, $sSaveAs, $sExtension
        If $CMDLINE[0] Then
            For $i = 1 To $CMDLINE[0]
                Select
                    Case $CMDLINE[$i] = '/?'
                        Exit MsgBox(0x40000, @ScriptName & ' Help', _
                                'Switches are:' & @CRLF _
                                 & @CRLF & 'PIC_To_PDF [/F:FileName.jpg | /L:ListName.txt] [/S[:SaveAs.pdf]]' _
                                 & @CRLF & @TAB & 'Convert any PIC/s to PDF')
                    Case StringLeft($CMDLINE[$i], 3) = '/F:'
                        $sFileName = StringMid($CMDLINE[$i], 4)
                        If Not FileExists($sFileName) Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF", _
                                "Error : " & $sFileName & " not found!" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
                        ReDim $aList[1]
                        $aList[0] = $sFileName
                    Case StringLeft($CMDLINE[$i], 3) = '/L:'
                        $sListName = StringMid($CMDLINE[$i], 4)
                        If Not FileExists($sListName) Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF", _
                                "Error : " & $sListName & " not found!" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
                        $aList = FileReadToArray($sListName)
                        If @error Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF", _
                                "Error : " & $sListName & " is empty!" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
                        For $j = @extended - 1 To 0 Step -1
                            _ArraySearch($g_aPicExt, _WinAPI_PathFindExtension($aList[$j]))
                            If @error Then
                                _ArrayAdd($aBadFiles, $aList[$j])
                                _ArrayDelete($aList, $j)
                            EndIf
                        Next
                    Case StringLeft($CMDLINE[$i], 2) = '/S'
                        $sSaveAs = (StringMid($CMDLINE[$i], 3, 1) = ':' ? StringMid($CMDLINE[$i], 4) : InputBox('PIC_To_PDF', 'Save as: ', _WinAPI_PathRenameExtension($aList[0], '.pdf')))
                        If $sSaveAs = '' Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF", _
                                "Error : InputBox for SaveAs name canceled!" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
                        $sExtension = _WinAPI_PathFindExtension($sSaveAs)
                        $sSaveAs = $sExtension = '.pdf' ? $sSaveAs : $sExtension ? _WinAPI_PathRenameExtension($sSaveAs, '.pdf') : $sSaveAs & '.pdf'
                        If FileExists($sSaveAs) Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF", _
                                "Error : " & $sSaveAs & " already exists!" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
                    Case Else
                        MsgBox(0x40000, 'PIC_To_PDF', _
                                'Incorrect switch used' & @CRLF & _
                                'Command used:' & @CRLF & $CMDLINERAW & @CRLF & _
                                @CRLF & 'Use /? for the switches available.')
                        Exit
                EndSelect
            Next
            If $sSaveAs = '' Then $sSaveAs = InputBox('PIC_To_PDF', 'Save as: ', _WinAPI_PathRenameExtension($aList[0], '.pdf'))
            If $sSaveAs = '' Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF", _
                                "Error : InputBox for SaveAs name canceled!" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
            If UBound($aList) Then _PIC_To_PDF($aList, $sSaveAs)
            If UBound($aBadFiles) Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF", _
                    "Error : This files are ignored - no PICs!" & @CRLF & _ArrayToString($aBadFiles, ', ') & @CRLF & "@error = " & @error & ", @extended = " & @extended)
        EndIf
    EndFunc   ;==>_Main
    
    Func _PIC_To_PDF(ByRef $_aList, $_sSaveAs)
        ConsoleWrite('$_sSaveAs = ' & $_sSaveAs & @CRLF)
        Local $aProcessList = ProcessList('winword.exe')
        If @error Or $aProcessList[0][0] = 0 Then
            Local $sWord = _WinAPI_AssocQueryString('.docx', $ASSOCSTR_EXECUTABLE)
            If @error Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF", _
                    "Error : WINWORD.EXE not found!" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
            ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $sWord --> " & $sWord & @LF)
            Local $iPID = Run(StringFormat('"%s" /Automation -Embedding', $sWord))
            ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $iPID --> " & $iPID & @LF)
            If Not $iPID Or Not WinWait('[TITLE:Word; CLASS:OpusApp]', '', 5) Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF", _
                    "Error : Can't start WINWORD.EXE!" & @CRLF & "@error = " & @error & ", @extended = " & @extended)
        EndIf
    
        ; Create application object
        Local $oWord = _Word_Create(False) ; window will not be visible
        If @error Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF: _Word_DocAdd", _
                "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    
        ; Add a new empty document
        Local $oDoc = _Word_DocAdd($oWord)
        If @error Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF: _Word_DocAdd", "Error creating a new Word document." _
                 & @CRLF & "@error = " & @error & ", @extended = " & @extended)
        ; https://docs.microsoft.com/de-de/office/vba/api/overview/word
        ; https://docs.microsoft.com/en-us/office/vba/api/word.wdpapersize
        ; https://docs.microsoft.com/de-de/office/vba/api/word.pagesetup.papersize
        Local Const $wdPaperA4 = 7 ; A4 dimensions.
    
        With $oDoc.PageSetup
            .TopMargin    = 0 ;CentimetersToPoints(1)
            .BottomMargin = 0 ;CentimetersToPoints(1)
            .LeftMargin   = 0 ;CentimetersToPoints(1)
            .RightMargin  = 0 ;CentimetersToPoints(1)
            .PaperSize    = $wdPaperA4
    ;~         .orientation  = $wdOrientLandscape ; Hochformat
            .orientation  = $wdOrientPortrait ; Querformat
        EndWith
    
        ; Insert a picture in the document
        Local $oShape
        For $i = UBound($_aList) - 1 To 0 Step -1
            $oShape = _Word_DocPictureAdd($oDoc, $_aList[$i])
            If @error Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF: _Word_DocPictureAdd", _
                    "Error adding the picture " & $_aList[$i] & " to the document" & @CRLF & " @error = " & @error & ", @extended = " & @extended)
            $oShape.Height = CentimetersToPoints(29.7) ; DIN A4
            $oShape.Width = CentimetersToPoints(21.0)
        Next
    
        ; Export the complete document as PDF
        _Word_DocExport($oDoc, $_sSaveAs, $WdExportFormatPDF)
        If @error Then Exit MsgBox($MB_SYSTEMMODAL, "PIC_To_PDF: _Word_DocExport", "Error exporting the document." & _
                @CRLF & "@error = " & @error & ", @extended = " & @extended)
    
        ; Close a Word document
    ;~     _Word_DocClose($oDoc)
    
        ; Closes all documents, the Word application and removes the object reference to it
        _Word_Quit($oWord)
    EndFunc   ;==>_PIC_To_PDF
    
    Func CentimetersToPoints($iValue)
        Return ($iValue * 28.35)
    EndFunc   ;==>CentimetersToPoints
    Alles anzeigen
  • _Word_DocPictureAdd - Bild auf Seitengröße einpassen

    • Bitnugger
    • 28. April 2020 um 20:50

    Ich kann es kaum glauben, aber ich habe es tatsächlich hinbekommen... ist sicher nicht ideal gelöst, aber es funktioniert zumindest.

    AutoIt
    ;-- TIME_STAMP   2020-04-28 20:41:42   v 0.1
    
    #include <MsgBoxConstants.au3>
    #include <Word.au3>
    
    Opt('MustDeclareVars', 1)
    
    ; Create application object
    Local $oWord = _Word_Create()
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocPictureAdd Example", _
            "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    ; Add a new empty document
    Local $oDoc = _Word_DocAdd($oWord)
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocPictureAdd Example", _
            "Error creating a new Word document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    ; https://docs.microsoft.com/en-us/office/vba/api/word.wdpapersize
    Local Const $wdPaperA4 = 7 ; A4 dimensions.
    
    With $oDoc.PageSetup
        .TopMargin    = 0 ;CentimetersToPoints(1)
        .BottomMargin = 0 ;CentimetersToPoints(1)
        .LeftMargin   = 0 ;CentimetersToPoints(1)
        .RightMargin  = 0 ;CentimetersToPoints(1)
        .PaperSize    = $wdPaperA4
    ;~     .orientation  = $wdOrientLandscape ; Hochformat
        .orientation  = $wdOrientPortrait ; Querformat
    EndWith
    
    ; Insert a picture
    ;~ Local $oShape = _Word_DocPictureAdd($oDoc, 'm:\_Word_DocPictureAdd\Lohnabrechnung_RS_02.2020.jpg')
    Local $oShape = _Word_DocPictureAdd($oDoc, @ScriptDir & '\Feb_2020_OK.jpg')
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocPictureAdd Example", _
            "Error adding the picture to the document" & @CRLF & " @error = " & @error & ", @extended = " & @extended)
    $oShape.Height = CentimetersToPoints(29.7) ; DIN A4
    $oShape.Width = CentimetersToPoints(21.0)
    
    MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocPictureAdd Example", _
            "Picture has successfully been added after word 4 in the document.", 2)
    
    ; Export the complete document as PDF
    ;~ _Word_DocExport($oDoc, 'm:\_Word_DocPictureAdd\Lohnabrechnung_RS_02.2020.pdf', $WdExportFormatPDF)
    _Word_DocExport($oDoc, @ScriptDir & '\Feb_2020_OK.pdf', $WdExportFormatPDF)
    _Word_DocClose($oDoc)
    
    Func CentimetersToPoints($iValue)
        Return ($iValue * 28.35)
    EndFunc   ;==>CentimetersToPoints
    Alles anzeigen

    Jetzt stört mich nur noch, dass das Fenster von Word dabei zu sehen ist. ;)

  • _Word_DocPictureAdd - Bild auf Seitengröße einpassen

    • Bitnugger
    • 28. April 2020 um 18:47
    Zitat von alpines

    Ich kenn mich mit der UDF nicht aus, deshalb habe ich dir nur den Weg genannt wie man es manuell macht.

    Danke dir, aber mit Word kenne ich mich recht gut aus und kannte den Weg bereits.

    Zitat von alpines

    Vielleicht findest du ja in der Doku zum Objekt die Möglichkeit Formatierungsoptionen eines Objektes zu setzen?

    Ich glaube so alt werde ich nicht... da sucht man sich ja tot!

    https://docs.microsoft.com/de-de/office/vba/api/overview/word

    Ich habe wohl schon was gefunden, wie ich die Bilder auf 100% skalieren kann, die Größe stimmt dann zwar, aber dann wird das Bild zu weit rechts und zu weit nach unten dargestellt. Ich denke, dass ich dann auch noch die Seitenränder und die Kopfzeile des Dokuments ändern muss.

    $oShape.ScaleWidth = 100

    $oShape.ScaleHeight = 100

    AutoIt
    ;-- TIME_STAMP   2020-04-28 18:31:03   v 0.1
    
    #include <MsgBoxConstants.au3>
    #include <Word.au3>
    
    Opt('MustDeclareVars', 1)
    
    ; Create application object
    Local $oWord = _Word_Create()
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocPictureAdd Example", _
            "Error creating a new Word application object." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    ; Add a new empty document
    Local $oDoc = _Word_DocAdd($oWord)
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocPictureAdd Example", _
            "Error creating a new Word document." & @CRLF & "@error = " & @error & ", @extended = " & @extended)
    
    ; Insert a picture after the fourth word of the document
    Local $oShape = _Word_DocPictureAdd($oDoc, @ScriptDir & '\Feb_2020_OK.jpg')
    If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocPictureAdd Example", _
            "Error adding the picture to the document" & @CRLF & " @error = " & @error & ", @extended = " & @extended)
    $oShape.ScaleWidth = 100
    $oShape.ScaleHeight = 100
    MsgBox($MB_SYSTEMMODAL, "Word UDF: _Word_DocPictureAdd Example", _
            "Picture has successfully been added after word 4 in the document.")
    
    ; Export the complete document as PDF
    _Word_DocExport($oDoc, @ScriptDir & '\Feb_2020_OK.pdf', $WdExportFormatPDF)
    _Word_DocClose($oDoc)
    Alles anzeigen

    Im Anhang ist das Script und zwei Bilder... Feb_2020_OK.jpg - so soll es auc hin dem PDF aussehen... sieht aber so aus wie Feb_2020_BAD.jpg!

    Zitat von water

    Ich schau mir das mal an

    Du bist ein Schatz! 8o

    Dateien

    _Word_DocPictureAdd.zip 51,37 kB – 320 Downloads
  • _Word_DocPictureAdd - Bild auf Seitengröße einpassen

    • Bitnugger
    • 28. April 2020 um 17:58
    Zitat von alpines

    Rechtsklick aufs Bild > Format > "Passend"

    Genau das will ich ja eben nicht... deshalb verwende ich ja die Word-UDF... schön wäre, wenn man damit die Formatierung ändern könnte.

  • _Word_DocPictureAdd - Bild auf Seitengröße einpassen

    • Bitnugger
    • 28. April 2020 um 17:45

    Hallo,

    ich bin dabei, mir ein Script zu schreiben, dass meine Lohnabrechnungen, die ich via E-Mail als *.jpg bekomme, mit der Word-UDF als *.pdf zu speichern.

    Das funktioniert soweit auch ganz gut, allerdings werden die Bilder in der PDF-Datei nicht 1:1 übernommen, sondern kleiner dargestellt, als im Original.

    Hier habe ich schon was gefunden, wie ich die Bilder skalieren könnte:

    RE: Mit Autoit Dateiinhalt kopieren und in Worddatei einfügen

    Doch das ist nicht genau das, was ich suche... denn ich will für die Bilder keine fixe Größe angeben, sondern sie in das Word-Dokument auf Seitengröße einpassen.

    Dazu müsste ich die Seitengröße des Word-Dokuments ermitteln... nur wie stelle ich das an?

  • MsgBox verlangsamt den Skriptablauf unter Win 10

    • Bitnugger
    • 28. April 2020 um 00:15
    Zitat von Musashi

    Die Funktion läuft gut, bis JEDES GUI-Element sichtbar gemacht wird.

    Hier hast du dich vertan... nicht JEDES, sondern EIN...

    Google übersetzt den Satz so: Die Funktion läuft einwandfrei, bis ein beliebiges GUI-Element sichtbar gemacht wird.

  • [Nim] Fragen zu einem Frame (Window)

    • Bitnugger
    • 26. April 2020 um 10:47

    Hier hast du schon geguckt?

    https://github.com/khchen/wNim/tree/master/examples

  • [Nim] Fragen zu einem Frame (Window)

    • Bitnugger
    • 26. April 2020 um 10:11
    Zitat von Oscar

    Was macht "app.mainloop()"?

    Code
    proc mainLoop(self: wApp): int {...}

    Execute the main GUI event loop. The loop will exit after all top-level windows is deleted.

    https://khchen.github.io/wNim/wApp.html#App

    Zitat von Oscar

    Ich erstelle einen Frame (Window). Wozu dann noch ein Panel?

    A frame is a top-level window in wNim. A panel is a window on which controls are placed. It is usually placed within a frame.

    https://khchen.github.io/wNim/wFrame.html

    https://khchen.github.io/wNim/wPanel.html

    Zitat von Oscar

    Gibt es irgendwo eine Erklärung, wie das mit dem (Auto-)Layout funktioniert?

    https://khchen.github.io/wNim/autolayout.html

    Zitat von Oscar

    let statusBar = StatusBar(frame)

    Problem: "'statusBar' is declared but not used

    Ja... ich denke, mit Nim/wNim werde ich noch viel Spaß haben. ;)

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™