aber es hieß wohl "GetDeclaredVars"
Kann es sein, dass du GetUnUsedVars.au3 meinst?
aber es hieß wohl "GetDeclaredVars"
Kann es sein, dass du GetUnUsedVars.au3 meinst?
Danke für deine Mühe schon mal. Getestet habe ich nun deine Version:
- Umlaute:
- bestehende Includes löschen:
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.
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.
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+Icommand.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:
;~ 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:
In diesem Bild kann man übrigens sehen, dass OrganizeIncludes die includes nicht wirklich optimal hinzufügt...
...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.
Na das ist ja schon mal ein gewaltiger Unterschied!
;-- 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
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.
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.
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.
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.
Die rekursive Ermittlung ist aber recht tricky.
In der Tat... der einzige Grund, warum ich das Thema nicht schon längst mal angegangen bin.
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
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:
;-- 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
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?
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).
Versuchs mal mit \\ statt einem Backslash.
Nein, so geht es auch nicht... aber rufe ich die Exe mit Parametern auf, funktioniert es.
Bsp.: Test.exe "F:\Audio\MP3\CD\Top 3000-4ever\Top 3000-4ever 0401-0500\0458. Albert Hammond - The Free Electric Band (1973).mp3"
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"
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
Wenn ich mal Muße habe, werde ich mein in Lua angefangenes IncludeManagement mal fertigstellen.
DAS wäre wirklich sehr schön!!!
Neben OrganizeIncludes benutze ich auch den INCLUDES HELPER:
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...
Setze Parameter $bVisible auf False.
Geil... aber das tut schon fast weh...
Hier nun noch mein geändertes Script, mit dem sich auch mehrere Bilder in eine PDF-Datei speichern lassen, quasi als Sammelmappe.
;-- 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
Ich kann es kaum glauben, aber ich habe es tatsächlich hinbekommen... ist sicher nicht ideal gelöst, aber es funktioniert zumindest.
;-- 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.
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.
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
;-- 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!
Ich schau mir das mal an
Du bist ein Schatz!
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.
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?
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.
Hier hast du schon geguckt?
Was macht "app.mainloop()"?
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
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
Gibt es irgendwo eine Erklärung, wie das mit dem (Auto-)Layout funktioniert?
https://khchen.github.io/wNim/autolayout.html
let statusBar = StatusBar(frame)
Problem: "'statusBar' is declared but not used
Ja... ich denke, mit Nim/wNim werde ich noch viel Spaß haben.