dass mit den vielen '"''" kann einen schon wahnsinnig machen
Ja, bei dieser Escaperei verliert man leicht den Überblick. Daher immer wieder mein Tipp: StringFormat.
dass mit den vielen '"''" kann einen schon wahnsinnig machen
Ja, bei dieser Escaperei verliert man leicht den Überblick. Daher immer wieder mein Tipp: StringFormat.
Vielleicht solltest du aus dem Script eine Smartphone-App basteln
Haha - die Idee ist mir tatsächlich auch gekommen. Allerdings nicht weil das Tool als Must-Have auf jedes Smartphone sollte, sondern da hätte ich mal die Möglichkeit zu testen, ob das mit der Lua-Execute-App tatsächlich funktioniert. Würde das also in Lua ausführen.
Wer weiß, vielleicht packts mich ja noch. 😚
Der Hauptgrund, warum ich das mit einem Programm machen wollte: Zwei nebeneinander liegende Räume, doppelflügelige Tür dazwischen. Räume unterschiedlich lang. Ziel: Von dieser Tür aus sollte ein gespiegeltes Verlegemuster sein. Also beidseitig Probiererei. 😁
Diele ist Vollholz und hat nicht direkt was mit Laminat zu tun. Das können zwei verschiedene Produkte sein.
Nun, ich wollte nicht "Einzelnes-Laminat-Dingens" schreiben. 😂 Und in Beschreibungen habe ich "Dielen" gefunden. Dass eine Diele ohne weiteren Kontext als Langes Brett mit Nut und Feder zu sehen ist, ist schon klar. 😊
Ich habe gerade 3 Räume, in denen ich Laminat verlegen muss. Um besser mit den Maßen jonglieren zu können, habe ich mir jetzt diesen Calculator erstellt.
Die Länge des ersten Teils muss nur eingegeben werden, wenn keine Diele in voller Länge verwendet wird, das wird dann automatisch eingefügt. Wenn im Ergebnis untermaßige Teile erscheinen (rot markiert) muss durch Anpassen der Größe für das erste Teil korrigiert werden.
Bei der Berechnung für die zweite Reihe wird zuerst versucht, das Restteil der ersten Reihe zu verwenden. Wenn Länge von Startteil und Endteil zusammen länger sind als eine volle Länge + Versatz, wird die Startlänge so angepasst, dass ein ganzes Teil am Ende zum Einsatz kommen kann.
Analoger Ablauf für die Breite.
Es lassen sich auch nur Länge oder nur Breite berechnen. Beide Berechnungen finden in eigenen Funktionen statt. Sind dafür keine Daten eingegeben, werden diese einfach nicht ausgeführt.
Hinweis:
Den Längenverlust durch die Sägeblattbreite habe ich vernachlässigt. Selbst bei einem sehr breiten Schnitt von 3 mm wären das pro Seite nur 1,5 mm Versatz - das verschwindet ungesehen unter der Wandleiste. ![]()
LaminatCalculator_1.png LaminatCalculator_2.png
Also, falls ihr demnächst auch was zu verlegen habt - Viel Spaß damit. ![]()
EDIT:
Vielleicht nicht ganz unwichtig, ich habe als Verlegemuster den "Englischen Verband" zugrunde gelegt.
Falls durch ungünstige Raummaße zu viel Verschnitt entsteht, dann lieber im Wilden Verband verlegen (Wie von Andy in Post 5 beschrieben).
Damit sieht man eindeutig womit man es zu tun hat.
Hab ich jetzt (ähnlich) ergänzt.
Btw. - sehr unglücklich finde ich, dass eine ohne Inhalt deklarierte Variable als Typ "String" erkannt wird. Automatische Vorbelegung mit Null wäre ein Träumchen. ![]()
Ausgabe des Inhalts einer Map als Schlüssel-Wert-Paare in die Konsole.
Für nicht darstellbare Werte wird deren Typ ausgegeben.
Edit: Ich habe mal die Markierung für String-Werte mit eingefügte. Danke für den Hinweis Mars
; #FUNCTION# =======================================================================================
; Name ..........: _ConsoleWriteMap
; Description ...: Writes the content of a map as key-value pairs to the console.
; ...............: For values that cannot be displayed, their type is specified.
; Syntax ........: _ConsoleWriteMap($_m)
; Parameters ....: $_m - The map to be displayed.
; Return values .: None
; Author ........: BugFix
; ==================================================================================================
Func _ConsoleWriteMap(ByRef $_m)
Local $aC[] = ['-> ', '>> '], $n = 0, $sType, $vValue
Local $sOut = StringFormat(' %-20s%s-- VALUE --\n', '-- KEY --')
For $k In MapKeys($_m)
$n = Abs($n -1)
$sType = VarGetType($_m[$k])
Switch $sType
Case 'Array', 'Map', 'Object', 'DLLStruct', 'Function', 'UserFunction'
$vValue = $sType
Case 'Keyword'
$vValue = (IsKeyword($_m[$k]) = 1 ? 'Default' : 'Null')
Case 'String'
$vValue = '"' & $_m[$k] & '"'
Case Else
$vValue = String($_m[$k])
EndSwitch
$sOut &= StringFormat('%s%-20s%s%s\n', $aC[$n], $k, $vValue)
Next
ConsoleWrite($sOut & @CRLF)
EndFunc
Alles anzeigen
Local $a[] = [1,2,3], $m0[], $o = ObjCreate('Scripting.Dictionary'), $nothing
Local $m[]
$m.Arr = $a
$m.Map = $m0
$m.Obj = $o
$m.String = 'Bla'
$m.Num = 15
$m.NumStr = "15"
$m.Empty = $nothing
$m.Struct = DllStructCreate('double')
$m.Ptr = DllStructGetPtr($m.Struct)
$m.Hwnd = WinGetHandle('[ACTIVE]')
$m.Null = Null
$m.Def = Default
$m.Func = MsgBox
$m.UserFunc = _ConsoleWriteMap
_ConsoleWriteMap($m)
Alles anzeigen
Werden Anführungszeichen in Lua nicht mit vorangesteltem Backslash escaped?
Ja, habe das auch damit probiert. Direkt als Luaskript ausgeführt funktioniert es. Übergebe ich das an die Director Extension zum Ausführen schlägt es fehl.
Ich habe das Skript mal auf das absolute Minimum reduziert. Die Zeile zum Auswerten (der Funktionsparameter) wird hier immer in doppelte Anführungseichen gesetzt und bereits vorhandene doppelte vorab mit Backslash maskiert. (Zeilen 84 - 87)
Global $gSciTECmd
GUIRegisterMsg(74, "MY_WM_COPYDATA") ; $WM_COPYDATA = 74
; --------------------------------------------------------------------------------------------------
; extrahiert für alle gefundenen Variablen:
; Var_1 @ Var_1_Name & optional Indexwert | Var_3 @ Var_2_Name ... etc.
; Der Ergebnisstring wird in der Weiterverarbeitung noch in ".." eingeschlossen.
;~ ConsoleWrite(_GetVarsFromLine("$xyz = $abc['xy']") & @CRLF) ; OK: $abc['xy']@$abc[" & 'xy' & "]|$xyz@$xyz
;~ ConsoleWrite(_GetVarsFromLine("$n = $a[$a[0][0]][0]") & @CRLF) ; OK: $a[$a[0][0]][0]@$a[" & $a[0][0] & "][0]|$n@$n
ConsoleWrite(_GetVarsFromLine("$m[""x""] = 'c'") & @CRLF) ; FAIL: sParam ist i.O.: ("$m[\"x\"] = 'c'")
; [string "do function MatchVarsFromLine(_l) tpatt = ..."]:1: ')' expected near 'x'
; Ausführen direkt in Lua:
; print(MatchVarsFromLine("$m[\"x\"] = 'c'")) --> OK: $m["x"]@$m[" & 'x' & "]
; --------------------------------------------------------------------------------------------------
Func _GetVarsFromLine($_line)
;~ -- matches: ($abc)[*][*][*] ($abc)[*][*] ($abc)[*] $a[*][*][*]
;~ -- $a[*][*] $a[*] $abc.Bla $abc
local $sFunc = _
"function MatchVarsFromLine(_l)" & _
" tpatt = {'(%b()%b[]%b[]%b[])', '(%b()%b[]%b[])', '(%b()%b[])', '(%$[_%w]+%b[]%b[]%b[])'," & _
" '(%$[_%w]+%b[]%b[])', '(%$[_%w]+%b[])', '(%$[_%w]+%.%w+)', '(%$[_%w]+)'}" & _
" local sgl, dbl, sVars, sVarsStr, n, s0, s1 = string.char(39), string.char(34), '', '', 0" & _
" for i=1, #tpatt do" & _
" while true do" & _
" local s, e, v = _l:find(tpatt[i])" & _
" if s == nil then break end" & _
" n = n +1" & _
" sVarsStr = v:gsub('%b[]'," & _
" function(_b) _b = _b:gsub('^%[', ''):gsub('^%s+', '')" & _
" _b = _b:gsub('%]$', ''):gsub('%s+$', '')" & _
" if _b:find('^%d+$') then return '['.._b..']' end" & _
" if (_b:find('^'..sgl) or _b:find('^'..dbl)) then" & _
" _b = ('%s%s%s'):format(sgl, _b:sub(2, _b:len()-1), sgl) end" & _
" return ('[%s & %s & %s]'):format(dbl, _b, dbl) end)" & _
" sVars = sVars..v..'@'..sVarsStr..'|'" & _
" s0, s1 = _l:sub(1, s-1), _l:sub(e +1)" & _
" _l = s0..s1" & _
" end" & _
" end" & _
" return sVars:gsub('|$', '') " & _
"end"
Return _ScI_DostringGet($sFunc, $_line)
EndFunc
;===============================================================================
; Function Name....: _ScI_DostringGet
; Description......: Eine Luafunktion mit/ohne Parameter aufrufen UND ein Ergebnis erhalten
; : Maximal 10 Parameter können übergeben werden.
; Parameter(s).....: $_sLuaFunc - String mit der Lua-Funktion
; : $p1 - [optional] Parameter1 für die Funktion
; : ... bis
; : $p10 - [optional] Parameter10 für die Funktion
; Return Value(s)..: Rückgabewert der Lua-Funktion
; Author(s)........: BugFix
; Note.............: Achtung! Der Code darf !keine! Kommentare enthalten!
;-------------------------------------------------------------------------------
; Bsp.:
; ohne Parameter:
; Local $sFunc = "function LineFromCursor() return editor:LineFromPosition(editor.CurrentPos)+1 end"
; ConsoleWrite(_ScI_DostringGet($sFunc) & @CRLF)
;
; mit Parameter:
; Local $sFunc = "function LineEnd(iLine) return editor.LineEndPosition[iLine] end"
; ConsoleWrite(_ScI_DostringGet($sFunc, 130) & @CRLF)
;===============================================================================
Func _ScI_DostringGet($_sLuaFunc, $p1=Null, $p2=Null, $p3=Null, $p4=Null, $p5=Null, $p6=Null, $p7=Null, $p8=Null, $p9=Null, $p10=Null)
Local $aParamCall[] = [$p1,$p2,$p3,$p4,$p5,$p6,$p7,$p8,$p9,$p10]
; extract function name
Local $sFunc = (StringRegExp($_sLuaFunc, 'function (\w+)\(', 1))[0], $sParam = '()'
Local $sPart
If $p1 <> Null Then
; extract parameters
$sParam = (StringRegExp($_sLuaFunc, 'function \w+\(([^)]+)\)', 1))[0]
Local $aParam = StringSplit($sParam, ',')
; rebuild sParam with given values
$sParam = ''
For $i = 1 To $aParam[0]
$sPart = StringReplace($aParamCall[$i-1], '"', '\"')
$sParam &= '"' & $sPart & '"' & ','
Next
$sParam = '(' & StringTrimRight($sParam,1) & ')'
EndIf
ConsoleWrite('-> sParam: ' & $sParam & @CRLF)
SendSciTE_Command("extender:dostring do props['extender.result'] = '' end")
SendSciTE_Command("extender:dostring do " & $_sLuaFunc & " props['extender.result'] = " & $sFunc & $sParam & " end")
SendSciTE_Command('askproperty:extender.result')
Return StringTrimLeft($gSciTECmd,StringInStr($gSciTECmd, ':', 1, 4))
EndFunc
Func _GetHwndDirectorExtension()
Local $hActive = WinGetHandle('[ACTIVE]')
Local $PIDActive = WinGetProcess($hActive)
Local $aExtension = WinList("DirectorExtension")
Local $PIDExt
For $i = 1 To $aExtension[0][0]
$PIDExt = WinGetProcess($aExtension[$i][1])
If $PIDExt = $PIDActive Then Return $aExtension[$i][1]
Next
EndFunc
Func SendSciTE_Command($_sCmd, $Wait_For_Return_Info=0)
Local $WM_COPYDATA = 74
Local $Scite_hwnd = _GetHwndDirectorExtension() ; Get SciTE Director Handle
Local $My_Hwnd = GUICreate("AutoIt3-SciTE interface") ; Create GUI to receive SciTE info
Local $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2)) ; Convert my Gui Handle to decimal
$_sCmd = ":" & $My_Dec_Hwnd & ":" & $_sCmd ; Add dec my gui handle to commandline to tell SciTE where to send the return info
Local $CmdStruct = DllStructCreate('Char[' & StringLen($_sCmd) + 1 & ']')
DllStructSetData($CmdStruct, 1, $_sCmd)
Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
DllStructSetData($COPYDATA, 1, 1)
DllStructSetData($COPYDATA, 2, StringLen($_sCmd) + 1)
DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
$gSciTECmd = ''
DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
'Ptr', DllStructGetPtr($COPYDATA))
GUIDelete($My_Hwnd)
If $Wait_For_Return_Info Then
Local $n = 0
While $gSciTECmd = '' Or $n < 10
Sleep(20)
$n += 1
WEnd
EndIf
Return $gSciTECmd
EndFunc ;==>SendSciTE_Command
Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
Local $gSciTECmdLen = DllStructGetData($COPYDATA, 2)
Local $CmdStruct = DllStructCreate('Char[' & $gSciTECmdLen+1 & ']',DllStructGetData($COPYDATA, 3))
$gSciTECmd = StringLeft(DllStructGetData($CmdStruct, 1), $gSciTECmdLen)
EndFunc ;==>MY_WM_COPYDATA
Alles anzeigen
Ich trete ein wenig auf der Stelle. Stringauswertungen mache ich gern im Lua-Interface, einige Parsingmöglichkeiten sind dort einfacher und effektiver als in AutoIt.
Nun mein Problem: Ich übergebe eine kpl. Zeile AutoIt-Code aus SciTE an meine Luafunktion. Diese muss als String übergeben werden. Da ich den Parameter in einen Lua String einfüge, kann ich alle Lua-Stringbegrenzer verwenden: '...', "...", [[...]] .
$a[$i] = $x wird zu "$a[$i] = $x"
$m["abc"] = $x wird zu '$m["abc"] = $x'
$s = "Hallo 'schöne' Welt!" wird zu [[$s = "Hallo 'schöne' Welt!"]]
aber wie kann ich solch ein (mögliches) Szenario abfangen?
$a[$a[0][0]][1] = "Hallo 'schöne' Welt!"
Durch die innenliegenden zweifach schließenden eckigen Klammern kann ich die Klammern nicht verwenden. Einfache und doppelte Anführungszeichen (egal in welcher Reihenfolge) brechen den String auf. Ersatzzeichen, z.B. Chr(1), könnte ich für eine spezielle Funktion sicher nutzen und intern wieder zurückführen, aber damit ist dann eine allgemeine Nutzung der Luafunktion eingeschränkt, weil eben diese Ersatzzeichen niemals für andere Funktionen vorkommen dürfen.
Also, ich bin offen für eure Ideen.
Hast du evtl. auch eine Erklärung für uns warum das Verhalten auftritt? Wie kann die GUI(ich denke damit meintest du das Progressbarfenster)
denn den Focus verlieren und weshalb passiert das nicht beim Hilfecode? Liegt es an der Dauer des Kopiervorganges(meine Testdatei ist deutlich größer als die der Hilfe)?
Ich nehme mal an (weiß es aber nicht definitiv), dass die Callback-Funktion in einem eigenen Prozess läuft, der "empfindlich" auf Störungen reagiert.
Durch Volatile wird diese Funktion mit einer Art "Schutzschicht" umgeben, sodass sie störungsfrei laufen kann.
Soweit meine laienhafte Erklärung, aber evtl. kann das jemand noch genauer beleuchten. ![]()
Nachtrag:
Ich hänge dir mal eine für meinen Job erstellte Kopierfunktion an, vielleicht hilfreich. Musst zum Ausführen nur noch meine "GroupEx.au3" einbinden (oder die betreffenden Passagen auskommentieren).
Dieses Verhalten passiert schon in dem Moment, wenn deine Gui den Fokus verliert.
Lösung: Verwende für deine Callbackfunktion das Keyword:
Wir hatten ja gerade das Thema Debugging. Ich habe dazu eine Funktion, die ich in der OwnHotkeys UDF habe nach AutoIt übertragen. So funktioniert es:
Markierung im Skript wird kopiert und zusammen mit allen Includes aus dem Skript in eine temporäre
Datei im Skriptordner geschrieben (__TMP__RunSelected.au3).
Zusätzlich werden Consolenausgabebefehle eingefügt für:
- In Funktionsdeklaration alle Parameter
- ansonsten alle auftauchenden Variablen
- Ignoriert werden Variablen in Deklarationszeilen (Global/Local/Dim) und im 'Switch'-Kopf
- Integrierte Variablenerkennung für:
$a[$i][$j] , $m["k"]["j"]
($abc)[$i][$j]
($abc)[$i]
$a[$i] , $m["k"]
$abc.Bla
$abc
Consolenausgabe, Variablen anspringbar mit DblClick auf Ausgabezeile:
@LINE ZeileNR ( Variablenname, bei Array: mit aktuellen Indexwerten ) < Variablentyp > Wert
z.B.: @LINE 32 ( $a[0][0] ) < String > value: c
Standardmäßig wird die erstellte Datei automatisch gestartet. Wenn die Variable "$gbCopyOnly = True"
gesetzt wird, erfolgt kein automatisches Ausführen (EXE-Aufruf mit Parameter).
• Skript kompilieren
• In "SciTEUser.properties" eintragen:
command.name.9.$(au3)=Run Selected Code
command.mode.9.$(au3)=subsystem:0
command.9.$(au3)="C:\Programming\au3\scripts\RunSelectedCode.exe"
command.shortcut.9.$(au3)=Ctrl+Alt+R
Um nur das Skript zu erstellen mit Parameter "True" od. "1" aufrufen:
command.name.10.$(au3)=Create Script From Selection
command.mode.10.$(au3)=subsystem:0
command.10.$(au3)="C:\Programming\au3\scripts\RunSelectedCode.exe" "True"
command.shortcut.10.$(au3)=Ctrl+Alt+C
• Pfad der EXE anpassen
• command-Nr. nach freier Nummer bei euch auswählen (ohne Eintrag ist die erste freie: 36)
• ggf. Shortcut anpassen
Alles anzeigen
Die Variablenerkennung deckt alle häufigen Schreibweisen ab. Natürlich nicht alles. Wenn ihr da noch erweitern möchtet, kann in der Funktion _GetVars die Patternliste erweitert werden. Aber beachten, dass in der richtigen Reihenfolge abgefragt wird, erkannte Variablen werden sofort aus der Zeile entfernt, bevor mit dem nächsten Pattern geprüft wird.
Ich verwende meine "SciTE_GetInfo.au3" in dem Skript, ist mit angehängt.
#cs
Markierung im Skript wird kopiert und zusammen mit allen Includes aus dem Skript in eine temporäre
Datei im Skriptordner geschrieben (__TMP__RunSelected.au3).
Zusätzlich werden Consolenausgabebefehle eingefügt für:
- In Funktionsdeklaration alle Parameter
- ansonsten alle auftauchenden Variablen
- Ignoriert werden Variablen in Deklarationszeilen (Global/Local/Dim) und im 'Switch'-Kopf
- Integrierte Variablenerkennung für:
$a[$i][$j] , $m["k"]["j"]
($abc)[$i][$j]
($abc)[$i]
$a[$i] , $m["k"]
$abc.Bla
$abc
Consolenausgabe, Variablen anspringbar mit DblClick auf Ausgabezeile:
@LINE ZeileNR ( Variablenname, bei Array: mit aktuellen Indexwerten ) < Variablentyp > Wert
z.B.: @LINE 32 ( $a[0][0] ) < String > value: c
Standardmäßig wird die erstellte Datei automatisch gestartet. Wenn die Variable "$gbCopyOnly = True"
gesetzt wird, erfolgt kein automatisches Ausführen (EXE-Aufruf mit Parameter).
• Skript kompilieren
• In "SciTEUser.properties" eintragen:
command.name.9.$(au3)=Run Selected Code
command.mode.9.$(au3)=subsystem:0
command.9.$(au3)="C:\Programming\au3\scripts\RunSelectedCode.exe"
command.shortcut.9.$(au3)=Ctrl+Alt+R
Um nur das Skript zu erstellen mit Parameter "True" od. "1" aufrufen:
command.name.10.$(au3)=Create Script From Selection
command.mode.10.$(au3)=subsystem:0
command.10.$(au3)="C:\Programming\au3\scripts\RunSelectedCode.exe" "True"
command.shortcut.10.$(au3)=Ctrl+Alt+C
• Pfad der EXE anpassen
• command-Nr. nach freier Nummer bei euch auswählen (ohne Eintrag ist die erste freie: 36)
• ggf. Shortcut anpassen
#ce
#include <FileConstants.au3>
#include <String.au3>
#include "SciTE_GetInfo.au3" ; <<<< PFAD ANPASSEN !!!
Global $gbCopyOnly = False ; mit True wird die Datei '\__TMP__RunSelected.au3' in SciTE erstellt, aber nicht automatisch ausgeführt
If $CMDLINE[0] Then $gbCopyOnly = ($CMDLINE[1] = 1 Or $CMDLINE[1] = 'True') ? True : False
Global $gSciTECmd
GUIRegisterMsg(74, "MY_WM_COPYDATA") ; $WM_COPYDATA = 74
_SGI_SetPollTime(-1) ; automatisches Aktualisieren deaktivieren
Global $gmSciTE = _SGI_GetAllHwnd(True)
; MapSciTE Keys: .PID = SciTE Process ID
; .hWnd = hwndSciTE
; .Title = SciTE Window Title
; .Director = hWnd DirectorExtension
; .Editor = hWnd Editor pane
; .Output = hWnd Output pane
; .Toolbar = hWnd Toolbar Ctrl
; .TabCtrl = hWnd Tab Ctrl
; .iTabItem = Index of the current active Tab-Item
; .sTabItem = Text of the current active Tab-Item
; .Statusbar = hWnd Statusbar Ctrl
Global $ghActive = _SGI_GetActiveSciTEHwnd()
If $ghActive = Null Then Exit MsgBox(16, "Fehler", "Das aktive Fenster ist kein SciTE-Fenster!")
_RunSelectedCode()
Func _RunSelectedCode()
_ScI_Dostring('output:ClearAll()')
Local $sErr = '!>> [Error RunSelectedCode] >> '
If _ScI_GetProperty('FileExt') <> 'AU3' Then Return _ScI_OutputToConsole($sErr & 'Attempting to run code from a non-au3 file!')
Local $sFileDir = _ScI_GetProperty('FileDir')
Local $sSel = _ReadSelection()
If $sSel = '' Then Return
$sSel = _SelectionAddOutput($sSel)
Local $sText = _GetEditorText()
Local $sIncl = _GetIncludes($sText) & @CRLF
Local $newPath = StringRegExpReplace($sFileDir & '\__TMP__RunSelected.au3', '\\+', '/')
Local $sFuncAdd = @CRLF & @CRLF & _
";------------------------------ ONLY FOR DEBUG ----------------------------------------------------" & @CRLF & _
"Func _GetTypeAndValue($_v)" & @CRLF & _
" Local $type = VarGetType($_v), $value" & @CRLF & _
" Switch $type" & @CRLF & _
" Case 'Array', 'Map', 'Object', 'DLLStruct', 'Function', 'UserFunction'" & @CRLF & _
" $value = ''" & @CRLF & _
" Case 'Keyword'" & @CRLF & _
" $value = (IsKeyword($_v) = 1 ? 'Default' : 'Null')" & @CRLF & _
" Case 'Ptr'" & @CRLF & _
" $type = IsHWnd($_v) ? 'Handle' : 'Ptr'" & @CRLF & _
" $value = $_v" & @CRLF & _
" Case Else" & @CRLF & _
" $value = String($_v)" & @CRLF & _
" EndSwitch" & @CRLF & _
" Return StringFormat('< %s >%s %s', $type, ($value = '' ? '' : @TAB & @TAB & 'value:'), $value)" & @CRLF & _
"EndFunc" & @CRLF
Local $fh = FileOpen($newPath, BitOR($FO_UTF8,$FO_OVERWRITE))
FileWrite($fh, $sIncl & $sSel & $sFuncAdd)
FileClose($fh)
_ScI_Dostring('scite.Open("' & $newPath & '")')
If $gbCopyOnly Then Return
_ScI_Dostring('scite.MenuCommand(IDM_GO)')
EndFunc
Func _ReadSelection()
Local $sFunc = "function ReadSelection() read = editor:GetSelText() return read end"
Return StringReplace(_ScI_DostringGet($sFunc), '\r\n', @CRLF)
EndFunc
Func _SelectionAddOutput($_sSel)
$_sSel = StringReplace($_sSel, ' _' & @CRLF, ' ') ; Zeilenfortschreibungen entfernen
Local $aLines = StringSplit($_sSel, @CRLF, 1), $sRet = '', $nCmtBlock = 0, $bIsCmnt = False
For $i = 1 To $aLines[0]
Switch StringLeft(StringStripWS($aLines[$i], 1), 3)
Case '#cs'
$bIsCmnt = True
$nCmtBlock += 1
Case '#ce'
$nCmtBlock -= 1
EndSwitch
If $bIsCmnt And $nCmtBlock > 0 Then ; Kommentarblock Start / innen
$sRet &= $aLines[$i] & @CRLF
ElseIf $bIsCmnt And $nCmtBlock = 0 Then ; Kommentarblock Ende
$bIsCmnt = False
$sRet &= $aLines[$i] & @CRLF
ElseIf StringLeft(StringStripWS($aLines[$i], 1), 1) = ';' Then ; Kommentarzeile
$sRet &= $aLines[$i] & @CRLF
Else ; kein Kommentar
$sRet &= _ScanLine(StringStripWS($aLines[$i], 2))
EndIf
Next
Return $sRet
EndFunc
Func _ScanLine($_line)
If $_line = '' Then Return @CRLF
If StringRegExp($_line, '^(?i)Func') Then ; Function Declaration
Local $sFuncName = StringRegExp($_line, '^(?i)Func\s+([_a-z0-9]+)', 1)[0]
$_line = _GetParam($_line, $sFuncName)
ElseIf StringRegExp($_line, '^(?i)\s*(Local|Global|Dim|Switch)') Then ; Declaration
; ignore
ElseIf StringRegExp($_line, '\$[_\w]+') Then ; Variable in line
$_line &= _GetVars($_line)
EndIf
Return $_line & @CRLF
EndFunc
Func _GetParam($_line, $_sFunc)
$_line = StringRegExpReplace($_line, '\)\s*;.*$', ')') ; evtl. Kommentare entfernen
Local $sParam = StringTrimRight(StringMid($_line, StringInStr($_line, '(') +1, -1), 1)
If StringStripWS($sParam, 8) = '' Then Return $_line
; Zuweisungen von Zeichenketten entfernen
$sParam = StringRegExpReplace($sParam, '\s*=\s*"[^"]+"', '')
$sParam = StringRegExpReplace($sParam, "\s*=\s*'[^']+'", '')
; sonstige Zuweisungen entfernen
$sParam = StringRegExpReplace($sParam, '\s*=\s*[^,]+', '')
Local $aParam = StringSplit($sParam, ',')
Local $sRet = $_line & @CRLF & @TAB & 'ConsoleWrite("-- Func: [ ' & $_sFunc & ' ] Passed values:" & @CRLF)' & @CRLF
Local $sValOut = ''
For $i = 1 To $aParam[0]
$aParam[$i] = StringStripWS($aParam[$i], 3)
$sValOut &= @TAB & 'ConsoleWrite("@LINE" & @TAB & @TAB & @ScriptLineNumber -' & $i +1 & ' & ( ' & $aParam[$i] & ' ) " & _GetTypeAndValue(' & $aParam[$i] & ') & @CRLF)' & @CRLF
Next
Return $sRet & $sValOut
EndFunc
Func _GetVars($_line)
Local $sSpace = '', $aSpace = StringRegExp($_line, '^\s+', 1)
If Not @error Then $sSpace = $aSpace[0]
Local $sVars = '', $aVars, $iMatch = 0, $iVar = 0
Local $aPatt[] = [ _
'\$[_\w]+\[[^\]]+\]\[[^]]+\]', _ ; $a[$i][$j] , $m["k"]["j"]
'\(\$[_\w]+\)\[[^\]]+\]\[[^\]]+\]', _ ; ($abc)[$i][$j]
'\(\$[_\w]+\)\[[^\]]+\]', _ ; ($abc)[$i]
'\$[_\w]+\[[^\]]+\]', _ ; $a[$i] , $m["k"]
'\$[_\w]+\.\w+', _ ; $abc.Bla
'\$[_\w]+'] ; $abc
For $i = 0 To UBound($aPatt) -1
If StringRegExp($_line, $aPatt[$i]) Then
$aVars = StringRegExp($_line, $aPatt[$i], 3)
For $j = 0 To UBound($aVars) -1
$iVar += 1
$sVars &= $sSpace & 'ConsoleWrite("@LINE" & @TAB & @TAB & @ScriptLineNumber -' & $iVar & _
' & " ( ' & StringRegExpReplace($aVars[$j], '\[\s*(\$[^\]]+)\]', '[" & \1 & "]') & _
' )" & @TAB & @TAB & _GetTypeAndValue(' & $aVars[$j] & ') & @CRLF)' & @CRLF
$_line = StringReplace($_line, $aVars[$j], '') ; remove match from line
Next
$iMatch += 1
EndIf
Next
If $iMatch = 0 Then Return ''
Return @CRLF & $sVars
EndFunc
Func _GetEditorText()
Local $sFunc = "function GetEditorText() read = editor:GetText() return read end"
Return _ScI_DostringGet($sFunc)
EndFunc
Func _GetIncludes($_sText)
Local $sReturn = ''
Local $aMatch = StringRegExp($_sText, '[\r\n]?(?im)(#include\s+(<|''|")[^>''"]+(>|''|"))', 3)
If Not @error Then
For $i = 0 To UBound($aMatch) -1 Step 3
$sReturn &= $aMatch[$i] & @CRLF
Next
EndIf
Return $sReturn
EndFunc
Func SendSciTE_Command($_sCmd, $Wait_For_Return_Info=0)
Local $WM_COPYDATA = 74
Local $Scite_hwnd = $gmSciTE[$ghActive]['Director'] ; Get SciTE DIrector Handle
Local $My_Hwnd = GUICreate("AutoIt3-SciTE interface") ; Create GUI to receive SciTE info
Local $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2)) ; Convert my Gui Handle to decimal
$_sCmd = ":" & $My_Dec_Hwnd & ":" & $_sCmd ; Add dec my gui handle to commandline to tell SciTE where to send the return info
Local $CmdStruct = DllStructCreate('Char[' & StringLen($_sCmd) + 1 & ']')
DllStructSetData($CmdStruct, 1, $_sCmd)
Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
DllStructSetData($COPYDATA, 1, 1)
DllStructSetData($COPYDATA, 2, StringLen($_sCmd) + 1)
DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
$gSciTECmd = ''
DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
'Ptr', DllStructGetPtr($COPYDATA))
GUIDelete($My_Hwnd)
If $Wait_For_Return_Info Then
Local $n = 0
While $gSciTECmd = '' Or $n < 10
Sleep(20)
$n += 1
WEnd
EndIf
Return $gSciTECmd
EndFunc ;==>SendSciTE_Command
Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
Local $gSciTECmdLen = DllStructGetData($COPYDATA, 2)
Local $CmdStruct = DllStructCreate('Char[' & $gSciTECmdLen+1 & ']',DllStructGetData($COPYDATA, 3))
$gSciTECmd = StringLeft(DllStructGetData($CmdStruct, 1), $gSciTECmdLen)
EndFunc ;==>MY_WM_COPYDATA
;===============================================================================
; Function Name....: _ScI_GetProperty
; Description......: Gibt den Wert für eine Property zurück
; Parameter(s).....: Property
; Return Value(s)..: Wert der Property
; Docu.............: http://www.scintilla.org/SciTEDoc.html od. "SciTE-Hilfe" --> "SciTE Documentation"
; Author(s)........: BugFix
;===============================================================================
Func _ScI_GetProperty($_sProperty)
SendSciTE_Command("askproperty:" & $_sProperty)
Return StringTrimLeft($gSciTECmd,StringInStr($gSciTECmd, ':', 1, 4))
EndFunc
;===============================================================================
; Function Name....: _ScI_OutputToConsole
; Description......: Gibt einen Wert in die Konsole aus
; Parameter(s).....: auszugebender Wert, Zeilenumbruch mit "\n", Tab mit "\t"
; Return Value(s)..: keine
; Author(s)........: BugFix
;===============================================================================
Func _ScI_OutputToConsole($_vValue)
SendSciTE_Command("output:" & $_vValue)
EndFunc
;===============================================================================
; Function Name....: _ScI_Dostring
; Description......: Einen Luastring mit/ohne Parameter aufrufen OHNE ein Ergebnis zu erhalten
; : Parameter im Lua-String (max. 10) sind in der Form "_1", "_2", .., "_n" zu benennen.
; Parameter(s).....: $_sLua - der Lua-String
; : $p1 - [optional] Parameter1 für den Lua-String ("_1")
; : ... bis
; : $p10 - [optional] Parameter10 für den Lua-String ("_10")
; Return Value(s)..: keine
; Author(s)........: BugFix
;-------------------------------------------------------------------------------
; Bsp.:
; ohne Parameter:
; _ScI_Dostring("print('Hallo Welt!')")
;
; mit Parameter:
; _ScI_Dostring("editor:SetSelection(_1,_2)", 4, 14)
;===============================================================================
Func _ScI_Dostring($_sLuastring, $p1=Null, $p2=Null, $p3=Null, $p4=Null, $p5=Null, $p6=Null, $p7=Null, $p8=Null, $p9=Null, $p10=Null)
Local $aParamCall[] = [$p1,$p2,$p3,$p4,$p5,$p6,$p7,$p8,$p9,$p10], $index = 0
While $aParamCall[$index] <> Null
$_sLuastring = StringRegExpReplace($_sLuastring, '_\d+', $aParamCall[$index], 1)
$index += 1
WEnd
SendSciTE_Command("extender:dostring do " & $_sLuastring & " end")
EndFunc
;===============================================================================
; Function Name....: _ScI_DostringGet
; Description......: Eine Luafunktion mit/ohne Parameter aufrufen UND ein Ergebnis erhalten
; : Maximal 10 Parameter können übergeben werden.
; Parameter(s).....: $_sLuaFunc - String mit der Lua-Funktion
; : $p1 - [optional] Parameter1 für die Funktion
; : ... bis
; : $p10 - [optional] Parameter10 für die Funktion
; Return Value(s)..: Rückgabewert der Lua-Funktion
; Author(s)........: BugFix
;-------------------------------------------------------------------------------
; Bsp.:
; ohne Parameter:
; Local $sFunc = "function LineFromCursor() return editor:LineFromPosition(editor.CurrentPos)+1 end"
; ConsoleWrite(_ScI_DostringGet($sFunc) & @CRLF)
;
; mit Parameter:
; Local $sFunc = "function LineEnd(iLine) return editor.LineEndPosition[iLine] end"
; ConsoleWrite(_ScI_DostringGet($sFunc, 130) & @CRLF)
;===============================================================================
Func _ScI_DostringGet($_sLuaFunc, $p1=Null, $p2=Null, $p3=Null, $p4=Null, $p5=Null, $p6=Null, $p7=Null, $p8=Null, $p9=Null, $p10=Null)
Local $aParamCall[] = [$p1,$p2,$p3,$p4,$p5,$p6,$p7,$p8,$p9,$p10]
; extract function name
Local $sFunc = (StringRegExp($_sLuaFunc, 'function (\w+)\(', 1))[0], $sParam = '()'
If $p1 <> Null Then
; extract parameters
$sParam = (StringRegExp($_sLuaFunc, 'function \w+\(([^)]+)\)', 1))[0]
Local $aParam = StringSplit($sParam, ',')
; rebuild sParam with given values
$sParam = ''
For $i = 1 To $aParam[0]
$sParam &= $aParamCall[$i-1] & ','
Next
$sParam = '(' & StringTrimRight($sParam,1) & ')'
EndIf
SendSciTE_Command("extender:dostring do " & $_sLuaFunc & " props['extender.result']=" & $sFunc & $sParam & " end")
SendSciTE_Command("askproperty:extender.result")
Return StringTrimLeft($gSciTECmd,StringInStr($gSciTECmd, ':', 1, 4))
EndFunc
Alles anzeigen
Word oder Excel empfinde ich für den Anwender zu aufwendig, selbst wenn man es mit VBA automatisiert.
Aufwändig - inwiefern. Du kannst doch dort auch GUI anbieten und hast den Vorteil, dass alles direkt mit VBA verknüpft ist. Der Anwender bekommt doch davon nichts mit. ![]()
Was mache ich falsch, bzw. wo ist mein Denkfehler?
Der Denkfehler: AutoIt Programme werden nicht Zeile für Zeile ausgeführt, sondern insgesamt übersetzt und dann ausgeführt.
Dadurch kannst du nicht nach einzelnen Momenten die Werte von Variablen abfragen. Bisherige Lösungen basieren, soweit ich bisher gesehen habe deshalb darauf, die Skripte in einem separaten Programm Zeile für Zeile auszuführen.
Also einzelne Werte auszugeben ist ja kein Problem, aber man kann keine Haltepunkte setzen.
Bin diese Woche nicht zu Hause. Schau mir das nächste Woche an.
Warum kann ich den SPI_SETMOUSSONAR nicht verwenden, sondern muss die Konstante von AutoIt (oder 0x101D) verwenden?
Weil du eine Zeichenkette übergeben hast, erforderlich ist aber UINT.
Und warum muss ich bei einem PVOID-Datentyp UINT-angeben?
Schau Mal in der Hilfe, da findest du eine Auflistung, welche Datentypen als Entsprechung in AutoIt zur Verfügung stehen.
Ich versuch z.B. bei diesem DLLCall rauszubekommen, wo ich die Parameter dazu her bekomme.
Eine Unmenge an API Funktionen sind in den _WinAPI_ UDF in AutoIt gewrapped. Schau einfach diese Aufrufe in den Include Dateien an, da kannst du viel verstehen und lernen.
Excel 2003 erlaubt nur ein 7-stufige Verschachtelung. Wenn du es trotzdem in eine Formel quetschen möchtest, könntest du beide Wenn-Blöcke mit Oder verknüpfen. Sollte klappen.
So etwa: =Oder( (Wenn1;Dann1;(Wenn2;... bis Wenn6) ; (Wenn7;Dann7:(Wenn8;... Wenn12) )
Aber ich würde mit Verweis arbeiten, wenn deine Tabellengestaltung das ermöglicht. Ich schreib mir oft eine Verweistabelle auf ein ausgeblendetes Tabellenblatt um z. B. mit Eingabe der Kalenderwochennummer automatisch Von-Datum / Bis-Datum einzusetzen.
war allerdings zu faul da mir schon das ganze dokumentieren tierisch auf den Sack ging.
![]()
Ernst gemeintes Angebot: Wenn du mal einen Ghost-Dokumentator brauchst, melde dich. Ich werde wahrscheinlich nicht zwingend alle Finessen erkennen und beschreiben können. Aber für das Grundgerüst sollte es reichen. Feinheiten und Korrekturen blieben dann noch für dich.
Nicht dass ich wirklich scharf aufs Dokumentieren bin, aber besser kann man neue Dinge kaum lernen, als sie eigenständig beschreiben zu müssen.