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

Beiträge von BugFix

  • Los gehts

    • BugFix
    • 26. April 2011 um 21:19

    Bevor ihr anfangt, solltet ihr zumindest "LUA für Anfänger" mal in groben Zügen durchlesen um einige Unterschiede zu AutoIt zu erkennen.
    Ich werde Bsp. von dieser Seite hier darstellen, jede Zeile kommentiert.

    Erste Schritte:

    Variablendeklaration:
    Wenn eine Variable nicht als "local" deklariert wurde, ist sie immer "global".
    Variablennamen bestehen aus Buchstaben/Ziffern/Unterstrich

    Zuweisungen:
    erfolgen, wie in AutoIt, mit "=". Aber als Vergleichsoperator dient "=="!
    Es gibt in LUA den Wert "nil" für "nichts". Das dient z.B. dazu Variablen zu löschen oder wird bei Fehlern ausgegeben.

    Kommentare im Skript:
    in einer Zeile: "--Kommentar"
    mehrzeilig:
    --[[ erste Zeile Kommentar
    Kommentarzeile 2
    Kommentarzeile 3
    Kommentar Ende ]]

    Text verknüpfen mit:
    ".." Bsp.: "Text: " .. stringvariable

    Ausgabe in Konsole:
    print()

    Nun mal probieren - Arrays heißen hier Table:

    Code
    -- Table mit Wochentagen
    tage = {"Sonntag", "Montag", "Dienstag","Mittwoch", "Donnerstag", "Freitag", "Samstag"}  -- Deklaration mit Zuweisung
    ubound = table.getn(tage)  		-- getn entspricht Ubound in AutoIt
    print( 'Anzahl Item in \'tage\': ' .. ubound)  -- Metazeichen müssen zur Ausgabe maskiert werden
    
    
    print( 'nacheinander ausgeben, generisch:' )
    for zaehler, wert in pairs(tage) do 
    	print( wert )
    end
    
    
    print( '\noder über Indexzugriff:' )
    for zaehler in pairs(tage) do
    	print( tage[zaehler] )
    end
    Alles anzeigen

    Es lassen sich Feldnamen verwenden für Zugriffe mit: Table.Feldname

    Code
    -- andere Form der Zuweisung: Table mit Feldnamen
    tage = {} -- Table erstellen
    tage.Sonntag = 1
    tage.Montag = 2
    tage.Dienstag = 3
    tage.Mittwoch = 4
    tage.Donnerstag = 5
    tage.Freitag = 6
    tage.Samstag = 7
    print( '\nWert eines Wochentages zurückgeben:')
    print( 'Mittwoch hat Wert: ' .. tage.Mittwoch)
    Alles anzeigen

    Etwas ganz Tolles :thumbup:
    Funktionen lassen sich als Array (Table)-Elemente erstellen:

    Code
    -- Funktion als Element eines Table - Funktionen erhalten keinen Namen! Zur Identifikation dem Element einen Feldnamen vergeben
    meinCalc = {
    	Addiere       = function( _a, _b ) return _a + _b end,
    	Subtrahiere   = function( _a, _b ) return _a - _b end,
    	Multipliziere = function( _a, _b ) return _a * _b end,
    	Dividiere     = function( _a, _b ) return _a / _b end } -- Table erstellen
    
    
    -- oder so geht es auch:
    --~ meinCalc = {}
    --~ meinCalc.Addiere       = function( _a, _b ) return _a + _b end
    --~ meinCalc.Subtrahiere   = function( _a, _b ) return _a - _b end
    --~ meinCalc.Multipliziere = function( _a, _b ) return _a * _b end
    --~ meinCalc.Dividiere     = function( _a, _b ) return _a / _b end
    
    
    a = 27 b = 9
    print ( 'Addition:\t' .. meinCalc.Addiere(a,b) )			--> Addition:		 36
    print ( 'Subtraktion:\t' .. meinCalc.Subtrahiere(a,b) )		--> Subtraktion:	 18
    print ( 'Multiplikation: ' .. meinCalc.Multipliziere(a,b) )	--> Multiplikation: 243
    print ( 'Division:\t' .. meinCalc.Dividiere(a,b) )			--> Division:		  3
    Alles anzeigen

    Und wie sieht es mit Makros aus?
    Nun, Datum/Zeit lassen sich so ausgeben:

    Code
    t = os.date ("*t")
    print (t.year)
    print (t.month)
    print (t.day)
    print (t.hour)
    print (t.min)
    print (t.sec)

    Und zu guter letzt in diesem Beitrag - meine erste LUA-Funktion:

    Code
    function germanDate( _type ) -- l=longDate("Montag, 12.September 2011"), s=shortDate("Mo, 12.Sep 2011"), N=numericLong("12.09.2011"), n=numericShort("12.09.11")
    	local longWochentag  = {'Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'}
    	local shortWochentag = {'So','Mo','Di','Mi','Do','Fr','Sa'}
    	local longMon        = {'Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'}
    	local shortMon       = {'Jan','Feb','Mrz','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'}
    	local indexTag       = os.date( "%w" ) +1
    	local indexMon       = math.abs( os.date( "%m" ) )
    	if _type == 's' then
    		return os.date( shortWochentag[indexTag]..", %d."..shortMon[indexMon].." %Y" )
    	elseif _type == 'l' then
    		return os.date( longWochentag[indexTag]..", %d."..longMon[indexMon].." %Y" )
    	elseif _type == 'N' then
    		return os.date( "%d.%m.%Y" )
    	elseif _type == 'n' then
    		return os.date( "%d.%m.%y" )
    	end
    end
    
    
    print ( 'Kurzdatum mit Wochentag\t' .. germanDate('s') )
    print ( 'Langdatum mit Wochentag\t' .. germanDate('l') )
    print ( 'Datum numerisch lang\t' .. germanDate('N') )
    print ( 'Datum numerisch kurz\t' .. germanDate('n') )
    Alles anzeigen
  • Lua - ich (wir) lerne(n)

    • BugFix
    • 26. April 2011 um 20:25

    Hi,
    ich hatte peethebee gebeten, ein Unterforum für Lua einzurichten. Als wichtiger Bestandteil von SciTE und sehr mächtige Skriptsprache ist Lua es wert, sich näher damit zu beschäftigen.
    Im Moment bin ich noch recht frisch auf diesem Gebiet. Meine Idee ist, dass ich alles, was ich mir zu Lua aneigne, parallel hier gut kommentiert poste. So können davon auch andere Interessierte profitieren.
    Natürlich ist jeder, der Kenntnisse auf dem Gebiet hat oder mit erwirbt herzlich eingeladen sich hier einzubringen.

    Edit 23.10.2013:
    Nun ist doch "etwas" Zeit ins Land gegangen und ich bin wesentlich weiter als hier sichtbar. ;)
    Also werde ich nun endlich beginnen das hier zu vervollständigen.

    1. Wie kann ich Lua in SciTE ausführen?
    Standardmäßig ging es bei mir nicht. Ich bin, wie folgt vorgegangen:
    - Download Lua 5.1
    - Installation
    - lua.properties ==> Pfad anpassen (am Ende der Datei):
    für "C:\Program Files\Lua\5.1\luac.exe" und "C:\Program Files\Lua\5.1\lua.exe" euren Installationspfad verwenden

    SciTEUser.properties
    Code
    # compatible with LuaBinaries for Lua 5.1; will work on both platforms.
    #command.compile.*.lua=luac5.1 -o "$(FileName).luc" "$(FileNameExt)"
    command.compile.*.lua="C:\Program Files\Lua\5.1\luac.exe" -o "$(FileName).luc" "$(FileNameExt)"
    # Lua 5.1
    #command.go.*.lua=lua5.1 "$(FileNameExt)"
    command.go.*.lua="C:\Program Files\Lua\5.1\lua.exe" "$(FileNameExt)"
    # Lua 4.0
    #command.go.*.lua=Lua-4.0.exe -c -f "$(FileNameExt)"

    Das war viel zu kompliziert. Die einfachere Methode ist der Zugriff auf das in SciTE eingebundene Lua.
    So gehts:
    In der SciTEUser.properties folgende Einträge vornehmen.

    Code
    command.go.$(file.patterns.lua)=dofile $(FilePath)
    command.go.subsystem.$(file.patterns.lua)=3

    So wird mit "F5" die aktuell in SciTE geöffnete Lua-Datei ausgeführt.

    2. Wo kann ich etwas zu Lua lesen?
    Hilfe im Internet:
    Lua für Anfänger
    Lua 5.1 Reference Manual
    Programming in Lua (first edition)

    Einen zu AutoIt vergleichbaren Syntaxcheck kann ich mit Lua nicht durchführen, da sofort nach Fund des ersten Fehlers die Interpretation abgebrochen wird.
    Ich habe ein kleines Skript geschrieben, das die aktuelle Datei in einem geschützten Prozeß lädt (nicht ausführt) und dabei auftretende Fehler (bzw. den ersten) meldet. Das gebe ich dann in die Konsole aus, wie von AutoIt bekannt:
    + [15:32:56] Syntax-Check <C:\Code_AutoIt\LUA\test.lua>
    > [15:32:56] ------> OK
    oder z.B.
    + [15:35:18] Syntax-Check <C:\Code_AutoIt\LUA\test.lua>
    ! [15:35:18] Line: 701, ERROR: unfinished string near '''

    Ich habe ein Lua-Skript mit einigen SciTE-Tools erstellt, welches beim SciTE-Start geladen wird und aus dem dann u.a. der Syntax-Check aufgerufen wird.
    Man sollte sinnvollerweise für die Lua-Skripte einen eigenen Ordner anlegen ausserhalb der SciTE-Installation. Der SciTE-Lua-Pfad wird bei Updates überschrieben, ist daher wenig geeignet für eigene Skripte.
    Damit dieser Pfad auch überall angesprochen werden kann, empfiehlt sich in der SciTEUser.properties einen Eintrag dafür anzulegen, sieht bei mir so aus:
    #~ Speicherort der Skriptdatei !! ohne abschließendem Backslash !!
    Lua.User.Scripts.Path=C:\Code_AutoIt\LUA
    Beim Starten von SciTE werden alle Properties in ein Array geladen. Darauf kann man in den Lua-Skripten zugreifen mit: Wert = props['Property'], für den Skriptpfad wäre das also: sPath = props["Lua.User.Scripts.Path"]
    Wichtig ist: Alle gespeicherten Werte sind Strings, wenn also Zahlenwerte in Properties gespeichert sind müssen diese beim Einlesen umgewandelt werden (numValue = tonumber(props['Property']))

    Um den Syntax-Check, wie gewohnt mit "Ctrl+F5" aufzurufen sind zwei Dinge erforderlich:
    - Laden der Tools-Datei (Eintrag am Ende der "SciTEStartup.lua": LoadLuaFile("MySciTETools.lua", props["Lua.User.Scripts.Path"] .. "\\") )
    - Eintrag in der "SciTEUser.properties":
    # 36 Syntax Check Lua, if error --> selects error line and makes it visible
    command.name.36.$(file.patterns.lua)=SyntaxCheck Lua
    command.36.$(file.patterns.lua)=dostring MySciTETools:LuaCheck()
    command.mode.36.$(file.patterns.lua)=subsystem:lua,savebefore:yes
    command.shortcut.36.$(file.patterns.lua)=Ctrl+F5

    MySciTETools v0.1
    Code
    -- TIME_STAMP   2013-10-23 17:49:40   v 0.1
    
    
    MySciTETools = {}
    
    
    ----------------------------------------------------------------------------------------------------
    EvtUserlistTip = EventClass:new(Common)
    
    
    -- Event Select Userlist (Search Variable by Tip)
    function EvtUserlistTip:OnUserListSelection(_id, _str)
    	if _id ~= 99 then return false end
    	local iFirst = _str:find('[\.\.\.]') +3
    	local iLast = _str:find('[\.\.\.]', iFirst +1) -1
    	local var = _str:sub(iFirst,iLast)
    	editor:ReplaceSel(var)
    	return false
    end
    ----------------------------------------------------------------------------------------------------
    
    
    do
    	local LuaCheck = function()
    		local time = function() local tD = os.date("*t", os.time()) return string.format('%02d:%02d:%02d',tD.hour,tD.min,tD.sec) end
    		print("+ ["..time().."] Syntax-Check <"..props['FilePath']..">") io.flush()
    		local status, err = pcall(function() assert(loadfile(props['FilePath'])) end)
    		if status then
    			print("> ["..time().."] ------> OK") io.flush()
    		else
    			local filename = (props['FileNameExt']):gsub('([%(%)%.%%%+%-%*%?%[%^%$])', '%%%1') -- escape magic characters
    			local line, errout = err:match(filename..":(%d+):%s+(.+)")
    			editor:GotoLine(line -1) editor:LineEndExtend()  -- go to error line, make it visible, select line
    			print("! ["..time().."] Line: "..line..", ERROR: "..errout) io.flush()
    		end
    	end --> LuaCheck
    	----------------------------------------------------------------------------------------------------
    
    
    	----------------------------------------------------------------------------------------------------
    	-- Zwei verschiedene Funktionen:
    	--
    	-- VarGetTip
    	--      Für Variablen werden in einer separaten Region des Skripts Tipps hinterlegt:
    	--          #region - Variablen-Tipp
    	--          ; $Variable1 Das ist der Tipp für $Variable1
    	--          ; $Variable2 Das ist der Tipp für $Variable2
    	--          ; $Variable3 Das ist der Tipp für $Variable3
    	--          #endregion
    	--      oder sie werden in einer Kommentarzeile mit Tag irgendwo im Skript erstellt:
    	--          ;@ $Variable1 Das ist der Tipp für diese Variable
    	--      oder DIREKT nach Erstellung einer Variablen kann in der Folgezeile mit '-1' auf diese verwiesen werden:
    	--          $GuiMain = GuiCreate(...)
    	--          ;-1 Das ist der Kommentar zur Variable in der Zeile zuvor
    	--
    	--      oder Tipp für Funktionen:
    	--          In der Folgezeile nach Funktionskopzeile den Tipp hinterlegen mit
    	--             Func _IrgendeineFunc()
    	--                 ;-f Tipp zu dieser Funktion\nZweite Zeile zu diesem Tipp
    	--          Ausgabe:
    	--             Funktionsname( )
    	--             Tipp zu dieser Funktion
    	--             Zweite Zeile zu diesem Tipp
    	--
    	--      Es können auch Variablen gleichen Namens mehrfach verwendet werden (in unterschiedlichen Funktionen).
    	--      Die Erstellung der Tipps muß dann innerhalb desselben Gültigkeitsbereiches (also in derselben Funktion oder Global) erfolgen.
    	--      Das Skript sucht nach Tipps für die aktuelle Variable im aktuellen Gültigkeitsbereich. Zuerst innerhalb der Funktion,
    	--      falls gerade der Cursor auf einer Variablen in einer Funktion steht, da bei gleichnamigen existierenden lokalen und globalen Variablen,
    	--      die lokale Variable eine höhere Priorität hat.
    	--      Es wird immer der Variablenname und der Gültigkeitsbereich ausgegeben
    	--          $VarBefore  [ Global ]
    	--          Das ist ein Kommentar zu $VarBefore
    	--      oder
    	--          $iSelf  [ Local: Func _TimeOver() ]
    	--          Das ist ein Kommentar zu $iSelf
    	--
    	--      Mehrzeilige Tipps lassen sich erstellen mit "\n" als Zeilenumbruchzeichen im Text
    	--      z.B.
    	--          ;@ $VariableXY comment1\ncomment2\ncomment3
    	--      Ausgabe:
    	--          $VariableXY
    	--          comment1
    	--          comment2
    	--          comment3
    	--
    	--      Datei speichern als "..\SciTE\LUA\VarGetTipp.lua"
    	--      oder besser in eigenem Skripte-Ordner "..\VarGetTipp.lua
    	--
    	--      In der "SciTEUser.properties" wird ein Hotkey zum Aufruf der Funktion hinterlegt
    	--         # 49 Variablen Tipp by BugFix
    	--         command.name.49.*.au3=Variablen Tipp
    	--         command.49.*.au3=dostring MySciTETools:VarGetTip()
    	--         command.mode.49.*.au3=subsystem:lua,savebefore:no
    	--         command.shortcut.49.*.au3=Ctrl+Alt+V
    	--
    	--  !!! Zusätzlich folgende properties-Werte erstellen !!!
    	--         #~ Variablentipp / Suche Variable mit Tipp
    	--         #~ Tipp als CallTip (1) oder Konsolenausgabe (0)
    	--         Variable.Tipp.CallTip.*.au3=1
    	--         #~ Speicherort der Lua-Skriptdateien  !! Ohne abschließenden Backslash !!
    	--         Lua.User.Scripts.Path=C:\Code_AutoIt\LUA
    	--         #~ Ergebnis Variablensuche per Tipp in Userliste (1) oder Konsole (0)
    	--         Userlist.VarGetTip=1
    	--
    	--      - Cursor auf die Variable setzen
    	--      - Hotkey aufrufen
    	--      - Ist ein Tipp hinterlegt, wird dieser als CallTipp angezeigt oder in die Konsole ausgegeben
    	----------------------------------------------------------------------------------------------------
    	-- VarByTip     ( command.48.*.au3=dostring MySciTETools:VarByTip() )
    	--      Sucht anhand des Begriffs in der aktuellen Editorzeile innerhalb der vorhandenen Variablentipps nach
    	--      Übereinstimmungen. Treffer werden in einer Userlist zur Auswahl angezeigt.
    	--      Die Variable des ausgewählten Treffers wird an der Position des Suchbegriffs im Editor eingefügt.
    	--      Alternativ können alle Variablen, in deren Beschreibung das Suchwort enthalten ist, in die Konsole ausgegeben werden.
    	----------------------------------------------------------------------------------------------------
    
    
    	local VariableGetTip = function(_param)
    		if props['FileExt']:upper() ~= 'AU3' then return end
    		local GetVarFromCursor = function()
    			local caret = editor.CurrentPos
    			if editor.StyleAt[caret] ~= 9 then if editor.StyleAt[caret-1] ~= 9 then return caret, '' end end
    			local iStart, iEnd, iPos, iEnd2, fBrace, sDebugAU3 = caret, caret, nil, nil, false, ''
    			local iLine = editor:LineFromPosition(iStart)
    			local iZero = editor:PositionFromLine(iLine)
    			local iCol = iStart - iZero
    			local sLine = editor:GetLine(iLine)
    			local sRight = Trim(sLine, iCol)
    			iStart = iCol
    			while sLine:sub(iStart,iStart):find('[$a-zA-Z0-9_]') do iStart = iStart -1 end
    			iEnd = iStart +1
    			iStart = iStart +1
    			while sLine:sub(iEnd,iEnd):find('[$a-zA-Z0-9_]') do sDebugAU3 = sDebugAU3..sLine:sub(iEnd,iEnd) iEnd = iEnd +1 end
    			return sDebugAU3, caret
    		end -- GetVarFromCursor()
    
    
    		local GetFuncFromCursor = function()
    			local iCaret = editor.CurrentPos
    			local sSel = string.char(editor.CharAt[iCaret])
    			if (string.byte(sSel) == 13) or (sSel == ' ') or (sSel == ',') then return nil end
    			local sLine = editor:GetLine(editor:LineFromPosition(iCaret))
    			if string.char(editor.CharAt[iCaret -1]) ~= ' ' then editor:WordLeft() end
    			editor:WordRightExtend()
    			local sCurrWord = editor:GetSelText()
    			editor:SetSel(iCaret, iCaret)
    			if sCurrWord:find('[^%w_)]') then return '' end
    			if sLine:find(sCurrWord..'%s*%b()') then
    				return sCurrWord, iCaret
    			else
    				return ''
    			end
    		end -- GetFuncFromCursor()
    
    
    		local Output = function(sText1, sText2)
    			if tonumber(props['Variable.Tipp.CallTip.*.au3']) == 1 then
    				if sText2 ~= nil then sText1 = sText1..'\n'..sText2:gsub('\\n', '\n') end
    				editor:CallTipShow(editor.CurrentPos, sText1)
    			else
    				print('!> '..sText1)
    				if sText2 ~= nil then print('>> '..sText2:gsub('\\n', '\n>> ')) end
    			end
    		end -- Output
    
    
    		local GetAllTip = function()
    			local tTip = {}
    			local s = editor:GetText()
    			-- in vorhergehender Zeile deklariert
    			for p, tip in s:gmatch('()\n[\t%s]*;%-1%s*([^\r\n]+)') do
    				local _, _, var = editor:GetLine(editor:LineFromPosition(p) -1):find('(%$[%w_]+)')
    				table.insert(tTip, {var,tip,p,'global'})
    			end
    			-- mit "at"-Tag gesetzter Tipp
    			for p, var, tip in s:gmatch('()\n[\t%s]*;@%s-(%$[%w_]+)%s([^\r\n]+)') do
    				table.insert(tTip, {var,tip,p,'global'})
    			end
    			-- in Region gesetzte Tipps
    			local tReg = {}
    			for p in s:gmatch("()#[Rr]egion %- [Vv]ariablen%-[Tt]ipp") do
    				table.insert(tReg, p)
    			end
    			if table.getn(tReg) > 0 then
    				for i=1,table.getn(tReg) do
    					local line = editor:LineFromPosition(tReg[i])
    					while not editor:GetLine(line):find('#[Ee]nd[Rr]egion') do
    						line = line +1
    						local _, _, var, tip = editor:GetLine(line):find(';%s-(%$[%w_]+)%s([^\r\n]+)')
    						if var then table.insert(tTip, {var,tip,tReg[i],'global'}) end
    					end
    				end
    			end
    			if sParam == 'v' then
    				-- Funktionstipps, nur bei Aufruf mit Parameter 'v'
    				for p, tip in s:gmatch('()\n[\t%s]*;%-f%s*([^\r\n]+)') do
    					local _, _, sFunc = editor:GetLine(editor:LineFromPosition(p) -1):find('([%w_]+)%s*%b()')
    					table.insert(tTip, {sFunc,tip,p,sFunc})  -- Alles OK !
    				end
    			end
    			return tTip
    		end -- GetAllTip
    
    
    		local GetFuncs = function()  -- Ermitteln aller Funktionsdeklarationen (Startpos, Endpos, Funktionsname)
    			local tFuncs = {}
    			for iStart, sFunc in editor:GetText():gmatch('()[Ff][Uu][Nn][Cc]%s+([%w_]+)%s*%b()') do
    				local iLine, iEnd = editor:LineFromPosition(iStart)
    				while true do
    					iLine = iLine +1
    					iEnd = editor:GetLine(iLine):find('[Ee][Nn][Dd][Ff][Uu][Nn][Cc]')
    					if iEnd ~= nil then break end
    				end
    				table.insert(tFuncs, {iStart, editor:PositionFromLine(iLine), sFunc})
    			end
    			return tFuncs
    		end -- GetFuncs
    
    
    		if _param == 'v' then
    			local varCurr, varPos = GetVarFromCursor()
    			local fIsFuncTip = false
    			if varCurr == '' then
    				varCurr, varPos = GetFuncFromCursor()
    				if varCurr ~= '' then fIsFuncTip = true end
    			end
    			local tFuncs, tTip, fMatch, fMatchFunc, fInFunc, sFunc, sTip = GetFuncs(), GetAllTip(), false, false, false
    
    
    			local GetTip = function(_var, _scope)
    				_scope = _scope or 'global'
    				for i=1,table.getn(tTip) do
    					if tTip[i][1]:lower() == _var:lower() and tTip[i][4] == _scope then return tTip[i][2] end
    				end
    				return nil
    			end -- GetTip
    
    
    			if table.getn(tTip) > 0 and table.getn(tFuncs) > 0 then  -- den Tipps die Funktionen zuordnen
    				for i=1,table.getn(tTip) do
    					for j=1,table.getn(tFuncs) do
    						if tTip[i][3] >= tFuncs[j][1] and tTip[i][3] <= tFuncs[j][2] then
    							tTip[i][4] = tFuncs[j][3]
    							break
    						end
    					end
    				end
    			end
    
    
    			local IsVarInFunc = function(_var, _pos)
    				if table.getn(tFuncs) == 0 then return false, nil end
    				for i=1,table.getn(tFuncs) do
    					if _pos >= tFuncs[i][1] and _pos <= tFuncs[i][2] then
    						return true, tFuncs[i][3]  -- Rückgabe: True/False, Funktionsname
    					end
    				end
    				return false, nil
    			end -- IsVarInFunc
    
    
    			if table.getn(tTip) == 0 then
    				Output('Keine Tipps hinterlegt!')
    			else
    				if varCurr == '' then
    					Output('Cursor steht nicht auf einer Variablen\noder einem Funktionsaufruf!')
    				else
    					if not fIsFuncTip then fInFunc, sFunc = IsVarInFunc(varCurr, varPos) end
    					if fInFunc then
    						sTip =  GetTip(varCurr, sFunc)
    						if sTip ~= nil then
    							Output(varCurr..'  [ Local: Func '..sFunc..'() ]', sTip)
    						else
    							sTip =  GetTip(varCurr, 'global')
    							if sTip ~= nil then
    								Output(varCurr..'  [ Global ]', sTip)
    							else
    								Output(varCurr, 'Es ist kein Tipp hinterlegt!')
    							end
    						end
    					elseif fIsFuncTip then
    						sTip =  GetTip(varCurr, varCurr)
    						if sTip ~= nil then
    							Output(varCurr..'( )', sTip)
    						else
    							Output(varCurr..'( )', 'Es ist kein Tipp hinterlegt!')
    						end
    					else
    						sTip =  GetTip(varCurr, 'global')
    						if sTip ~= nil then
    							Output(varCurr..'  [ Global ]', sTip)
    						else
    							Output(varCurr, 'Es ist kein Tipp hinterlegt!')
    						end
    					end
    				end
    			end
    
    
    		elseif _param == 's' then
    			local tTip = GetAllTip()  -- {variable, tipp, position, scope}
    			local sWord = AutoItTools:GetWord()
    			local tFound, sFound, sep, iS, sTipN = {}, '', ';'
    			if sWord:gsub('[%s]+', '') == '' or table.getn(tTip) == 0 then return end
    			local fList = false
    			if props['Userlist.VarGetTip'] == '1' then fList = true end
    			local OutputGrouped = function(_fList)
    				local iMax, sOut, sLineEnd = 0, '', '\n'
    				if _fList then sLineEnd = sep end
    				for i=1,table.getn(tFound) do if tFound[i][2]:len() > iMax then iMax = tFound[i][2]:len() end end
    				for i=1,table.getn(tFound) do sOut = sOut..tFound[i][1]..'...'..tFound[i][2]..('.'):rep(iMax-tFound[i][2]:len()+3)..tFound[i][3]..sLineEnd end
    				return sOut
    			end
    			local SelectCurrentWord = function()
    				local iCaret = editor.CurrentPos
    				local iLine = editor:LineFromPosition(iCaret)
    				local iLine1stPos = editor:PositionFromLine(iLine)
    				local iDiffPos = iCaret - iLine1stPos +1
    				local sLine = editor:GetLine(iLine)
    				local sWord = props["CurrentWord"]
    				if sWord == '' then return end
    				local s, p = sLine:find(sWord)
    				local tMatch = {}
    				while s ~= nil do
    					table.insert(tMatch, {s,p})
    					s, p = sLine:find(sWord, s+1)
    				end
    				if table.getn(tMatch) > 0 then
    					for i=1, table.getn(tMatch) do
    						if iDiffPos >= tMatch[i][1] and iDiffPos <= tMatch[i][2] then
    							editor:SetSel(iLine1stPos-1 +tMatch[i][1], iLine1stPos +tMatch[i][2])
    							break
    						end
    					end
    				end
    			end
    			for i=1,table.getn(tTip) do
    				iS = tTip[i][2]:lower():find(sWord:lower())
    				if iS then
    					sTipN = tTip[i][2]:gsub('\\n', ' \[LINEBREAK\] ')
    					table.insert(tFound, {tTip[i][4], tTip[i][1], sTipN})
    				end
    			end
    			if table.getn(tFound) > 0 then sFound = OutputGrouped(fList) else sFound = 'Kein Tipp mit diesem Begriff vorhanden.' end
    			SelectCurrentWord()
    			if not fList then print(sFound) editor:ReplaceSel('') return end
    			editor.AutoCSeparator = string.byte(sep)
    			editor:UserListShow(99, sFound)
    			editor.AutoCSeparator = string.byte(' ')
    		end
    	end --> VariableGetTip
    
    
    	local VarGetTip = function() VariableGetTip('v') end
    	local VarByTip  = function() VariableGetTip('s') end
    	----------------------------------------------------------------------------------------------------
    
    
    	----------------------------------------------------------------------------------------------------
    	--          Time
    	-- _part    - nil (default) returns "hh:mm:ss"
    	--          - h / m / s     returns "hh" / "mm" / "ss"
    	-- _number  - returns h / m / s as number
    	----------------------------------------------------------------------------------------------------
    	local Time = function(_part, _number)
    		local datetable, retValue = os.date("*t", os.time())
    		if _part == nil then
    			return string.format('%02d:%02d:%02d', datetable.hour, datetable.min, datetable.sec)
    		else
    			if _part:lower() == 'h' then retValue = string.format('%02d', datetable.hour)
    			elseif _part:lower() == 'm' then retValue = string.format('%02d', datetable.min)
    			elseif _part:lower() == 's' then retValue = string.format('%02d', datetable.sec) end
    			if _number ~= nil then retValue = tonumber(retValue) end
    			return retValue
    		end
    	end --> Time
    	----------------------------------------------------------------------------------------------------
    
    
    	----------------------------------------------------------------------------------------------------
    	-- Detects if char at given editor position has comment style
    	----------------------------------------------------------------------------------------------------
    	local IsComment = function(_pos)
    		local tComment = {1,2} if tComment[editor.StyleAt[_pos]] == nil then return false else return true end
    	end
    	----------------------------------------------------------------------------------------------------
    
    
    	----------------------------------------------------------------------------------------------------
    	-- Detects if char at given editor position has white space style
    	----------------------------------------------------------------------------------------------------
    	local IsWhiteSpace = function(pos)
    		if editor.StyleAt[pos] == 0 then return true else return false end
    	end
    	----------------------------------------------------------------------------------------------------
    
    
    	----------------------------------------------------------------------------------------------------
    	-- Creates an insensitive string (combination of upper and lower chars: "[aA][bB]")
    	----------------------------------------------------------------------------------------------------
    	local InSensitive = function(_s)
    		_s = _s:gsub("%a", function(_c) return string.format("[%s%s]", _c:upper(),_c:lower()) end) return _s
    	end
    	----------------------------------------------------------------------------------------------------
    
    
    	----------------------------------------------------------------------------------------------------
    	-- Trim _i chars from string _s
    	-- Positive integer trim from left, negative from right side
    	-- _s       String to trim
    	-- _i       Number of chars to trim
    	-- _fspace  "true" deletes after trimming existing space chars on trimming side
    	----------------------------------------------------------------------------------------------------
    	local Trim = function(_s, _i, _fspace)
    		local iLen, tPatt, iPatt = _s:len(), {'^%s*', '%s*$'}, 1   -- {leftPatt,rightPatt}
    		local sTrim
    		if _i == nil then _i = 1 end
    		if _i >= iLen then return '' end
    		if _i == 0 then return _s
    		elseif _i < 0 then sTrim = _s:sub(1, iLen + _i) iPatt = 2  -- trim from right
    		else sTrim = _s:sub(_i + 1, -1) end                        -- trim from left
    		if _fspace then sTrim = sTrim:gsub(tPatt[iPatt], '') end
    		return sTrim
    	end  --> Trim
    	----------------------------------------------------------------------------------------------------
    
    
    	----------------------------------------------------------------------------------------------------
    	--[[ Splits up a string into substrings depending on the given delimiters.
    	_delimiter:  nil= each character will be returned as an element
    	...........  If no delimiters were found, the full string is returned
    	_flag.....:  nil= each character in the delimiter string will mark where to split the string
    	...........  1= entire delimiter string is needed to mark the split
    	...........  2= empty substrings are ignored (can be combined with other values)
    	Note......:  Use only raw strings for delimiters, no pattern! To split on tab, newline, or carriage return, use
    	..........:  their wildcards: \t = tab; \r = carriage return; \n = line feed; \r\n = carriage return/line feed
    	Return....:  table with splitted string, count of elements (= 1 if no delimiter was found)
    	--]]
    	----------------------------------------------------------------------------------------------------
    	local StringSplit = function(_string, _delimiter, _flag)
    		local EscapeMagic = function(_delim)
    			if _delim:find('[%(%)%.%%%+%-%*%?%[%^%$]') then
    				return _delim:gsub('([%(%)%.%%%+%-%*%?%[%^%$])', '%%%1')
    			else return _delim end
    		end
    		local tString, tSplit, n = {}, {}, 1
    		_string = tostring(_string)
    		if _delimiter ~= nil then
    			_delimiter = tostring(_delimiter)
    		else
    			for k in _string:gmatch('(.)') do table.insert(tString, k) end
    			return tString, #tString
    		end
    
    
    		_delimiter = EscapeMagic(_delimiter)
    		local tPos, patt = {}, '()([' .. _delimiter .. '])'
    		if (_flag == 1 or _flag == 3) then
    			patt = '()(' .. _delimiter .. ')'
    			n = _delimiter:len()
    		end
    		local pLast, sLen, sub = 1, _string:len(), ''
    		local insEmpty = not((_flag == 2 or _flag == 3) or false)
    		for p in _string:gmatch(patt) do
    			if p > (pLast -n) then sub = _string:sub(pLast, p-1) pLast = p +n end
    			if (sub == '' and insEmpty) or sub ~= '' then table.insert(tSplit, sub) end
    			sub = ''
    		end
    		if (sLen-n) >= pLast then sub = _string:sub(pLast, sLen) end
    		if (sub == '' and insEmpty) or sub ~= '' then table.insert(tSplit, sub) end
    		return tSplit, #tSplit
    	end
    	----------------------------------------------------------------------------------------------------
    
    
    											   -- SYNTAX
    	MySciTETools.LuaCheck     = LuaCheck       -- Modul.LuaCheck()  or Modul:LuaCheck()
    	MySciTETools.VarGetTip    = VarGetTip      -- Modul.VarGetTip() or Modul:VarGetTip()
    	MySciTETools.VarByTip     = VarByTip       -- Modul.VarByTip()  or Modul:VarByTip()
    	MySciTETools.Time         = Time           -- Modul.Time(parameter)
    	MySciTETools.IsComment    = IsComment      -- Modul.IsComment(pos)
    	MySciTETools.IsWhiteSpace = IsWhiteSpace   -- Modul.IsWhiteSpace(pos)
    	MySciTETools.InSensitive  = InSensitive    -- Modul.InSensitive(string)
    	MySciTETools.Trim         = Trim           -- Modul.Trim(parameters)
    	MySciTETools.Split        = StringSplit    -- Modul.Split(parameters)
    end
    Alles anzeigen


    Nutzung von Bibliotheken
    Lua stellt zum Einbinden von Bibliotheken den Befehl "require" zur Verfügung. Einbinden lassen sich *.dll- und *.lua-Bibliotheken. Damit die Bibliotheken gefunden werden müssen sie im Startup-Skript angemeldet werden, bei mir sieht das so aus:
    local sUserLua = props["Lua.User.Scripts.Path"]

    LUA_USER_PATH = sUserLua .. "\\?.dll;" .. sUserLua .. "\\?\\?.dll;"
    package.cpath = LUA_USER_PATH .. package.cpath

    LUA_USER_LUA = sUserLua .. "\\?.lua;" .. sUserLua .. "\\?\\?.lua;"
    package.path = LUA_USER_LUA .. package.path


    Damit dieser Post nicht unendlich lang wird, erstelle ich weitere Themen als eigene Threads und verlinke hier.

    • Bibliotheken in Lua
    • Alien und VCLua für SciTE (progandy)
    • Objekte in Lua

    Dateien

    MySciTETools.lua 21,07 kB – 665 Downloads
  • Fußzeile

    • BugFix
    • 26. April 2011 um 19:10

    Wieso hast du nochmal einen Thread dazu erstellt? Ich hatte dir doch bereits die Lösung gepostet. - Abonniere einfach die Threads, die du erstellst, dann entgehen dir auch keine Antworten.

  • Skript Speichern mit TimeStamp

    • BugFix
    • 26. April 2011 um 19:02

    Ich habe mir noch überlegt, dass es vielleicht sinnvoll ist über die properties zu regeln, ob mit oder ohne TimeStamp gespeichert wird.
    Da ich adhoc nicht gefunden habe, wo die Parameter aus der properties Datei deklariert werden, habe ich einen Umweg über Datei Lesen genommen - was aber ebenso super funktioniert ;)

    Also in die "SciTEGlobale.properties" folgenden Block einfügen (Position nach Deklaration "SciteStartup.lua")

    Code
    # Globals
    ext.lua.startup.script=$(SciteDefaultHome)/Lua/SciTEStartup.lua
    #~ ext.lua.auto.reload
    #~ ext.lua.reset
    
    
    #~ TimeStamp beim Speichern Ja/Nein (1/0)
    SetTimeStamp=1


    Nun die

    geänderte SaveWithTimeStamp.lua
    Code
    function OnBeforeSave(fname)
    	local ext = props['FileExt']
    	local au3_ext = 'au3'
    	if ext == au3_ext then
    		if SetTimeStamp == 1 then InsertTimestamp(fname) end
    	end
    end
    
    
    function InsertTimestamp(fname)
    	local line = editor:LineFromPosition(editor.CurrentPos)
    	local s = editor:GetText()
    	local t =  "#Region - Timestamp\r\n; "..os.date("%Y-%m-%d %H:%M:%S").."\r\n#EndRegion"
    	local a,b = editor:findtext("#Region - TimeStamp", SCFIND_REGEXP)
    	local x,y = editor:findtext("#EndRegion", SCFIND_REGEXP)
    	editor:BeginUndoAction()
    	if a then
    		if y then
    			editor:SetSel(a,y)
    			editor:ReplaceSel(t)
    		end
    	else
    		editor:SetText(t .. "\r\n\r\n" .. s)
    	end
    	editor:EndUndoAction()
    	editor:GotoLine(line)
    	editor:EnsureVisible(line)
    end
    Alles anzeigen

    abspeichern und dann noch folgendes Einfügen in die "SciTEStartup.lua" nach der Zeile "LoadLuaFileList = { }"

    Code
    --------------------------------------------------------------------------------
    -- TimeStamp Variable erzeugen, Wert aus "SciTEGlobal.properties" lesen
    --------------------------------------------------------------------------------
    SetTimeStamp = 1                                                       -- Globale Variable erstellen
    local pathSciTE = props["SciteDefaultHome"]		               -- Pfad SciTE4AutoIt
    local fin = assert(io.open(pathSciTE .. "\\SciTEGlobal.properties"))   -- Datei zum Lesen öffnen
    local sRead = fin:read("*a")                                           -- Datei einlesen
    assert(fin:close())		                                       -- Datei schließen
    local r1, r2 = string.find(sRead, "SetTimeStamp=%d")                   -- TimeStamp-Anweisung suchen
    SetTimeStamp = tonumber(string.sub(sRead, r2, r2))                     -- Wert auslesen und setzen (1/0 = J/N)


    Nach einem SciTE-Neustart gilt der Wert aus den properties.

  • Unterschied zwischen einer SQLite und einer Access Datenbank

    • BugFix
    • 26. April 2011 um 11:41

    Der markanteste Unterschied vorab: Access kostet Geld. Somit fällt es von vornherein durch mein Raster. ;)
    Ich habe einen Artikel zum Datenbankenvergleich gefunden, den ich als recht treffend erachte. Datenbankvergleich

  • Skript Speichern mit TimeStamp

    • BugFix
    • 26. April 2011 um 10:06

    Ich habe das Skript von i2c etwas erweitert, damit der Cursor nach dem TimeStamp setzen in der vorher aktuellen Zeile verbleibt und diese sichtbar ist.
    Ist doch etwas lästig, wenn jedes mal der Cursor in Zeile 1 landet. ;)

    SaveWithTimeStamp.lua
    Code
    function OnBeforeSave(fname)
    	local ext = props['FileExt']
    	local au3_ext = 'au3'
    	if ext == au3_ext then
    		InsertTimestamp(fname)
    	end
    end
    
    
    function InsertTimestamp(fname)
    	local line = editor:LineFromPosition(editor.CurrentPos)
    	local s = editor:GetText()
    	local t =  "#Region - Timestamp\r\n; "..os.date("%Y-%m-%d %H:%M:%S").."\r\n#EndRegion"
    	local a,b = editor:findtext("#Region - TimeStamp", SCFIND_REGEXP)
    	local x,y = editor:findtext("#EndRegion", SCFIND_REGEXP)
    	editor:BeginUndoAction()
    	if a then
    		if y then
    			editor:SetSel(a,y)
    			editor:ReplaceSel(t)
    		end
    	else
    		editor:SetText(t .. "\r\n\r\n" .. s)
    	end
    	editor:EndUndoAction()
    	editor:GotoLine(line)
    	editor:EnsureVisible(line)
    end
    Alles anzeigen
  • [offen] Aufruf externer Datei aus LUA - CMD-Window unterdrücken

    • BugFix
    • 25. April 2011 um 11:47

    Hi,
    also wenn du einen Error bekommst, der auf "AutoItTools.lua" verweist, muß die aufgerufene Funktion auch innerhalb dieser Tools deklariert sein.
    Die Standardfunktion heisst: "FunctionsList()" - dieser Name ist also vergeben, deshalb hatte ich meine Funktion auch "MyFunctionsList()" benannt. Kann es sein, dass du stattdessen den Namen "FunctionsList()" verwendet hast?
    Bei mir funktioniert es sowohl unter Win7 als auch im Virtuell_XP.
    Allerdings habe ich eine Änderung vorgenommen:
    - Pfad für die "ShowFuncList.exe" und die Austauschdatei ist jetzt hardcodiert "C:\", da unter XP Leerzeichen im Userpfad sind und dann der Aufruf der Funktion in die Hose geht (Es ist m.M. nach eine große Unzulänglichkeit im Betiebssystem, wenn Leerzeichen in Ordner- u. Dateinamen zulässig sind.)
    Die Änderungen füge ich im Startpost ein.

  • [offen] Aufruf externer Datei aus LUA - CMD-Window unterdrücken

    • BugFix
    • 25. April 2011 um 00:10

    Hi,
    da die Funktionsliste in SciTE ( aufrufbar mit Alt+L ) nur in einem recht mickrigen Control angezeigt wird, habe ich hier mal eine Variante erstellt, in der die Anzeige in einem AutoIt-Listview erfolgt und somit von jedem nach eigenem Geschmack angepaßt werden kann.
    Vorgehensweise ist identisch, wie bei der "Standard-Liste": HotKey (in meinem Bsp. Ctrl+Alt+L) aufrufen, Funktionsliste erscheint, Doppelklick auf Funktion, Cursor springt zur Zeile mit der Funktion und wird in den sichtbaren Bereich des Editors gescrollt.
    Da ich zur Zeit mich etwas mehr mit LUA beschäftige, war dies eine schöne Übung zum Datenaustausch zwischen LUA- und AutoIt-Skript. Gelöst über eine temporäre Datei.
    Funktionell ist alles prima und tut, was es soll.
    ABER, Ein Schönheitsfehler besteht: Ich rufe aus dem LUA-Skript heraus mittels "os.execute(Dateipfad)" das kompilierte AutoIt-Skript zur Anzeige der Funktionen auf. Jedoch wird mir dabei im Hintergrund das Windows-CMD Fenster angezeigt. Bisher habe ich noch keine Möglichkeit gefunden dieses zu unterdrücken.

    ShowFuncList.au3
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include <WindowsConstants.au3>

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

    ; Anzeige der Funktionsliste
    ; wird übergeben bei "Strg+Alt+L" im Skript

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

    If Not $CmdLine[0] Then Exit
    Global $sPathDataExchange = $CmdLine[1]
    Local $aFuncs = StringSplit(FileRead($sPathDataExchange), @CR)

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

    Local $gui = GUICreate('Funktionsliste', 500, 450, -1, -1, $WS_SIZEBOX, $WS_EX_TOPMOST)
    Local $ListView = GUICtrlCreateListView('Funktionsliste', 5, 5, 490, 415, BitOR($LVS_NOCOLUMNHEADER,$LVS_SHOWSELALWAYS))
    For $i = 1 To $aFuncs[0]
    GUICtrlCreateListViewItem($aFuncs[$i], $ListView)
    Next
    Local $hListView = GUICtrlGetHandle($ListView)
    _GUICtrlListView_SetColumnWidth($hListView, 0, $LVSCW_AUTOSIZE_USEHEADER)

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

    GUISetState()

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func _DblClck($iIndex)
    Local $sFunc = _GUICtrlListView_GetItemText($hListView, $iIndex)
    If $sFunc = '' Then Return
    Local $fh = FileOpen($sPathDataExchange, 2)
    FileWrite($fh, '$' & $sFunc)
    FileClose($fh)
    Exit
    EndFunc

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Return _DblClck(DllStructGetData($tInfo, "Index"))
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]
    MyFunctionsList.lua !geändert!
    PHP
    --------------------------------------------------------------------------------
    -- MyFunctionList()
    --------------------------------------------------------------------------------
    function MyFunctionsList()
    	local data = { }
    	local doc = editor:GetText()
    	local self = { }
    	self.Pattern = "()[%s][Ff][Uu][Nn][Cc][%s]+([%w%s_]*%(.-%))"
    	self.Seperator = ";"
    	self.DataTable = { }
    	for pos, str in doc:gmatch(self.Pattern) do
    		-- If we have a multi-line function definition, show it all on one line.
    		str = str:gsub("[\r\n]*", "")
    		-- Insert the string into both tables.
    		table.insert(data, str)
    		self.DataTable[str] = editor:LineFromPosition(pos)
    	end
    	-- Sort the table and build a string out of it.
    	table.sort(data, function(a, b) return string.lower(a) < string.lower(b) end)
    	local list = table.concat(data, self.Seperator)
    
    
    	-- DataExchange:
    --~ 	local userDir = os.getenv("USERPROFILE")
    	local exchgDir = os.getenv("HOMEDRIVE")											-- hardcodiert 'C:', sonst Problem bei Execute und mgl. Leerzeichen im Pfad
    	local tmpFile = exchgDir .. "\\LUA_DataExchange.txt"							-- Dateipfad für Datenaustausch im USERDIR festlegen
    	if string.len(list) > 0 then													-- wenn Funktionen im Skript vorhanden
    		-- Begin - EXPORT
    		local ret_1, ret_2 = string.gsub(list, "%);", ")\r")						-- Trenner zw. Funktionen mit 'CR' ersetzen
    		local fout = assert(io.open(tmpFile, "wb")) 								-- Datei zum Schreiben öffnen
    		fout:write(ret_1)															-- Liste in Datei schreiben (2. Returnwert enthält Anzahl Ersetzungen von .gsub)
    		assert(fout:close())														-- Datei schließen
    
    
    -- HIER der Knackpunkt: Bei Aufruf externer EXE bleibt ein CMD-Fenster offen
    		os.execute(exchgDir .."\\ShowFuncList.exe \"".. tmpFile .."\"")				-- Anzeigeskript mit Datei Funktions-Liste aufrufen
    		-- End - EXPORT
    		-- Begin - Auswertung angeklickte Funktion, wenn 1.Zeichen "$" dann wurde eine Funktion angeklickt
    		local fin = assert(io.open(tmpFile)) 										-- Datei zum Lesen öffnen
    		local sRead = fin:read("*a")												-- Datei einlesen
    		local selected = string.sub(sRead, 1, 1)				 					-- und erstes Zeichen selektieren
    		assert(fin:close())															-- Datei schließen
    		if selected == '$' then														-- 1.Zeichen = "$", also wurde eine Funktion gewählt (kein Abbruch o. Auswahl)
    			local sFunc = string.sub(sRead, 2, string.len(sRead))					-- "$" abschneiden = Funktionsname
    			editor:GotoLine(self.DataTable[sFunc])									-- gehe zu Zeile mit Funktion (aus Array DataTable)
    		end
    		-- Ende - Auswertung
    		os.remove(tmpFile)															-- Datenaustausch-Datei löschen
    	end
    end	-- FunctionsList
    Alles anzeigen


    Wer es selbst testen möchte, wie folgt vorgehen:
    - ShowFuncList.au3 kompilieren und im Pfad @UserProfileDir als "..\USERNAME\ShowFuncList.exe" abspeichern "C:\ShowFuncList.exe" abspeichern
    - "MyFunctionsList.lua" im Pfad "..\SciTE\LUA" abspeichern
    - im selben Pfad die Datei "SciTEStartup.lua" öffnen
    - im Block: "-- Load all the Lua files" eine neue Zeile anfügen: 'LoadLuaFile("MyFunctionsList.lua")'
    - nun noch den Aufruf per HotKey festlegen in "SciTEUser.properties"

    Code
    # END => DO NOT CHANGE ANYTHING BEFORE THIS LINE  #-#-#-#-#-#
    #41 Zeige Funktionsliste
    command.name.41.$(au3)=MyFunctionsList
    command.41.$(au3)=MyFunctionsList
    command.subsystem.41.$(au3)=3
    command.mode.41.$(au3)=savebefore:no
    command.shortcut.41.$(au3)=Ctrl+Alt+L

    Nach Neustart von SciTE steht die Funktion zur Verfügung.
    Falls jemand eine Idee hat, wie ich das CMD-Window unterdrücken kann (oder eine andere Form des Aufrufs aus LUA kennt) - bitte melden. ;)

    Edit:
    Ich kann es zwar ausblenden - aber es popt vorher kurz auf, sieht nicht sehr gelungen aus.
    Folgender Code am Skriptanfang setzt das Fenster 'HIDE':

    [autoit]

    If Not WinExists("[Class:ConsoleWindowClass]") Then
    WinWait("[Class:ConsoleWindowClass]")
    EndIf
    Local $hWndCMD = WinGetHandle("[Class:ConsoleWindowClass]")
    WinSetState($hWndCMD, '', @SW_HIDE)

    [/autoit]
  • Skript Speichern mit TimeStamp

    • BugFix
    • 22. April 2011 um 12:49

    Die Anfrage im EN-Forum war erfolgreich, das Tool funktioniert nun, wie gewünscht. :thumbup:

  • StringReplace vertauscht Zeichen

    • BugFix
    • 21. April 2011 um 19:55

    Lass dir mal nach jedem Replace das Ergebnis ausgeben, dann siehst du wo das problem steckt.
    StringReplace ist hier nicht optimal, da deine Suchbegriffe sich z.T. in sich selbst enthalten.
    Mit Reguären Ausdrücken oder CaseSensitiver Suche im String und dann positionsgenauem Ersetzen fährst du besser.

  • Füßzeile im Word ändern

    • BugFix
    • 21. April 2011 um 17:09

    Kein Problem:

    [autoit]

    Local Const $wdHeaderFooterPrimary = 1

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

    $oWord = ObjCreate("Word.Application")
    $oWord.Visible = False ; bleibt unsichtbar
    $oWord.Documents.Open ('C:\Testdatei.doc') ; eine bestehende Datei aufrufen

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

    ; aktuelle Fußzeile auslesen
    ConsoleWrite('Fußzeile aktuell:' & @CRLF & $oWord.ActiveDocument.Sections(1).Footers($wdHeaderFooterPrimary).Range.Text & @CRLF)

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

    ; neue Fußzeile zuweisen
    $sFooterNew = 'Das ist eine neue Fußzeile'
    $oWord.ActiveDocument.Sections(1).Footers($wdHeaderFooterPrimary).Range.Text = $sFooterNew

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

    $oWord.Application.DisplayAlerts = False
    $oWord.ActiveDocument.Save
    $oWord.Quit

    [/autoit]
  • Warscheinlichkeitsberechnung

    • BugFix
    • 21. April 2011 um 15:41
    Zitat von Schnitzel

    1 ist sehr unwahrscheinlich
    2 ist eher unwahrscheinlich
    3 ist sehr wahrscheinlicher
    4 ist eher unwahrscheinlich
    5 ist sehr unwahrscheinlich


    Sorry, aber da irrst du. Eine genügend lange Meßserie wird dazu führen dass die Verteilung der Einzelwerte annähernd identisch ist.
    Heißt in diesem Fall: Die Wahrscheinlichkeit, dass eine dieser Zahlen ausgegeben wird liegt bei 20%.
    Aber auch hier gilt: Traue keiner Statistik, die du nicht selbst gefälscht hast. :D Je nach den Bewertungsmaßstäben, die du anlegst, wirst du auch andere Ergebnisse erhalten.

  • Text Ticker

    • BugFix
    • 21. April 2011 um 15:09

    Hier kannst du die UDF finden: https://autoit.de/index.php?page…7857#post197857

  • Skript Speichern mit TimeStamp

    • BugFix
    • 21. April 2011 um 14:47

    Hi,
    da bei Skripten ja keine automatische Versionsfortschreibung vorhanden ist und ich meine Skripte auf mehreren PC und Sticks hin- und herschleppe ist es manchmal etwas schwierig, die Übersicht zu behalten, welche Version denn die aktuelle ist.
    Darum habe ich mir überlegt, einfach bei Bedarf eine Funktion "Speichern mit TimeStamp" in SciTE zu nutzen.
    Sieht dann so aus, dass am Skriptanfang eine Region eingefügt wird:

    [autoit]

    #Region - TimeStamp
    ; 2011-04-21 14:17:49
    #EndRegion

    [/autoit]

    bzw. wenn schon vorhanden wird die Zeit aktualisiert.

    2 Probleme habe ich derzeit noch:
    1.
    Ist das zu speichernde Skript vorher editiert wurden erscheint eine Sicherheitsabfrage zum Speichern. Sicher könnte ich das Fenster abfangen und automatisiert klicken, aber das kanns ja nicht sein. Schließlich popt das Fenster ja beim händischen Speichern auch nicht auf und ich greife direkt auf das Scintilla-Menü: Speichern zu.

    Bevor ich überhaupt auf das aktuelle Skript zugreifen kann, MUSS es gespeichert werden über die Anweisung "command.save.before.40.*.au3=1"
    Dann kann ich mir auch das Speichern am Anfang meines Skriptes sparen. ;)
    2.
    Alle Versuche die Parameter für den zu selektierenden Bereich zu setzen bleiben ohne Erfolg. Wenn bereits ein Zeitstempel vorhanden ist, muß ich die Zeile selektieren und die Selektion mit der neuen Zeit ersetzen.
    Im Moment löse ich das so, dass ich in die entsprechende Zeile wechsle an Spalte 1 und dort die neue Zeit einfüge. Anschließen steht der Cursor am Ende des eingefügten Inhalts - vor der alten Zeit. Mithilfe von Send() :wacko: markiere ich nun den Rest und lösche. Finde ich allerdings wenig prickelnd.

    Mit Hilfe von Jos gelöst.

    Falls ihr Ideen habt - immer her damit.

    Einbindung wieder über die SciTEUser.properties

    Code
    # END => DO NOT CHANGE ANYTHING BEFORE THIS LINE  #-#-#-#-#-#
    #40 Save With Time Stamp
    command.40.*.au3="$(autoit3dir)\autoit3.exe" "C:\SHARE\Code_AutoIt\TEST\SaveWithTimeStamp.au3" 
    command.name.40.*.au3=SaveWithTimeStamp
    command.save.before.40.*.au3=1
    command.is.filter.40.*.au3=1
    command.shortcut.40.*.au3=Ctrl+Shift+Alt+T

    Pfad und Nummer natürlich anpassen.

    Spoiler anzeigen
    [autoit]


    #cs ==== Aufruf über SciTE Menü (SciTEUser.properties entry:) ===

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

    #40 Save With Time Stamp
    command.40.*.au3="$(autoit3dir)\autoit3.exe" "C:\SHARE\Code_AutoIt\TEST\SaveWithTimeStamp.au3"
    command.name.40.*.au3=SaveWithTimeStamp
    command.save.before.40.*.au3=1
    command.is.filter.40.*.au3=1
    command.shortcut.40.*.au3=Ctrl+Shift+Alt+T

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

    #ce ==============================================================

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

    Opt("WinSearchChildren", 1)
    Global Const $WM_COPYDATA = 74, $IDM_SAVE = 106
    Global $My_Hwnd, $Scite_hwnd, $My_Dec_Hwnd, $SciTECmd, $sReceive = ''
    Local $sFile, $sSelection, $iLine

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

    _StartUpSciTEInterface()

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

    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "goto:1,1")
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "find:#Region - TimeStamp")
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "askproperty:CurrentSelection")
    $sSelection = StringRegExp($sReceive, '(?::\d+:macro:stringinfo:)(.*)', 1)
    If @error Then Exit

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

    If $sSelection[0] <> "#Region - TimeStamp" Then
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "insert:" & _
    "#Region - TimeStamp\n" & _
    "; " & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & "\n" & _
    "#EndRegion\n\n" & $sSelection[0])
    Else
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "askproperty:SelectionStartLine")
    $iLine = StringRegExp($sReceive, '(?::\d+:macro:stringinfo:)(\d+)', 1)
    If @error Then Exit
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "goto:" & $iLine[0] +1 & ",1")
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "extender:dostring editor:LineDelete()")
    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "insert:" & _
    "; " & @YEAR & "-" & @MON & "-" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC & '\n')
    EndIf

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

    SendSciTE_Command($My_Hwnd, $Scite_hwnd, "menucommand:" & $IDM_SAVE)

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

    Func _StartUpSciTEInterface()
    $Scite_hwnd = WinGetHandle("DirectorExtension")
    $My_Hwnd = GUICreate("SciTE interface", 400, 600, 10, 10)
    $My_Dec_Hwnd = Dec(StringTrimLeft($My_Hwnd, 2))
    GUIRegisterMsg($WM_COPYDATA, "MY_WM_COPYDATA")
    EndFunc

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

    Func SendSciTE_Command($My_Hwnd, $Scite_hwnd, $sCmd)
    $sCmd = ":" & $My_Dec_Hwnd & ":" & $sCmd
    ConsoleWrite('-->SendSciTE_Command >' & $sCmd & @LF)
    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))
    DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, _
    'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, _
    'Ptr', DllStructGetPtr($COPYDATA))
    EndFunc ;==>SendSciTE_Command

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

    Func MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam)
    Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
    $SciTECmdLen = DllStructGetData($COPYDATA, 2)
    Local $CmdStruct = DllStructCreate('Char[255]', DllStructGetData($COPYDATA, 3))
    $SciTECmd = StringLeft(DllStructGetData($CmdStruct, 1), $SciTECmdLen)
    If StringInStr($SciTECmd, ":macro:stringinfo:", 1) Or _
    StringInStr($SciTECmd, ":filename:", 1) Then
    If $sReceive <> $SciTECmd Then $sReceive = $SciTECmd
    EndIf
    ConsoleWrite('<--Receive' & $SciTECmd & @LF)
    EndFunc ;==>MY_WM_COPYDATA

    [/autoit]

    Edit 22.04.11: Habe auch mal eine Anfrage im EN-Forum gepostet. ==> brachte die Lösung :thumbup:

    Dateien

    SaveWithTimeStamp.au3 8,2 kB – 315 Downloads
  • Ungenutzte Variablen ermitteln

    • BugFix
    • 21. April 2011 um 09:26

    Danke progandy, ich sammle mal noch evtl. weitere Hinweise und werde das in der nächsten Version einbinden.

  • Gehäuse aus Holz

    • BugFix
    • 21. April 2011 um 00:44

    Holz ist vielleicht nicht gängig für ein PC-Gehäuse, aber dennoch relativ einfach dafür anzuwenden.
    - Abschirmung: mit ordentlich stabiler Alufolie ( nicht das Tüdel-Haushaltsgedöns ;) ) komplett von innen auskleben
    - Hitze? Wer glaubt, dass ein Metallgehäuse Wärme ableitet, kann gerne mal nachmessen. Absolut minimal, was über das Gehäuse abgegeben werden kann, da es mit dem bestmöglichen Isolator (Luft) gefüllt ist.
    Für einwandfreien Luftdurchsatz muß, genau wie in einem Metallgehäuse gesorgt werden. Brandschutz ist hier nur sekundär (wenn auch nicht von der Hand zu weisen). Primär würde bei Temperaturen, bei denen Holz noch lange nicht schwelt, bereits deine Elektronik ins Nirvana abtauchen.
    Ein großer Vorteil von Holz: Läßt sich super bearbeiten. Deinen Gestaltungswünschen sind nur Bauteil-Formbedingte Grenzen gesetzt.
    Viel Spaß dabei. :thumbup:

  • Ungenutzte Variablen ermitteln

    • BugFix
    • 21. April 2011 um 00:29

    Jeder wird es kennen, ein Skript wächst und wächst. Variablen werden deklariert und manchmal auch entfernt. Und zum Schluß weiß man gar nicht, ob alle deklarierten auch verwendet werden.
    Mit diesem Skript könnt ihr:
    - einmalig genutze Variablen (Standard) oder
    - alle verwendeten Variablen ausgeben lassen
    Die Ausgabe enthält:
    - Funktionsbereich (Funktionsname für Variablen in Funktionen, sonst 'Out_Of_Func')
    - Variablenname
    - Anzahl Vorkommen
    - Zeile(n) des Vorkommens
    Die Ausgabe erfolgt als:
    - String in die Konsole (Standard)
    - Array

    Ignoriert werden Variablen in Kommentarzeilen/-blöcken und ebenso Zählervariablen in For-Schleifen.

    Ich prüfe (noch) nicht gegen includierte Konstanten, sodass diese bei einmaliger Verwendung auch als 'ungenutzt' erscheinen. Diese Prüfung werde ich später noch einbauen. Im Moment testet mal, ob es bei diversen Skripten auch funktioniert.
    Es gibt eine bekannte Konstellation, in der ein Kommentar nicht erkannt wird:
    Bsp:

    [autoit]

    $sVariable = 'irgendwas;' ; Kommentar dazu und dieselben 'Stringbegrenzer', wie in der Zuweisung, $sVariable enthält beliebigen String

    [/autoit]

    In dieser Zeile kann der Kommentar nicht lokalisiert werden, da das letzte Semikolon als Stringbestandteil interpretiert wird: ' ; Kommentar dazu und dieselben ' und somit der Variablenname im Kommentar mitgezählt wird. Da dieser Fall sicher sehr unwahrscheinlich ist sehe ich das aber als unkritisch an.

    Die Array-Ausgabe sieht z.B. so aus
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Am einfachsten die Funktion in das SciTE-Menü einbinden "SciTEUser.properties"
    # END => DO NOT CHANGE ANYTHING BEFORE THIS LINE #-#-#-#-#-#
    # 39 Unused Vars
    command.39.*.au3="$(autoit3dir)\autoit3.exe" "$(SciteDefaultHome)\GetUnusedVars.au3" "$(FilePath)" "1" "0"
    command.name.39.*.au3=GetUnusedVars
    command.save.before.39.*.au3=1
    command.is.filter.39.*.au3=1
    command.shortcut.39.*.au3=Ctrl+Shift+Alt+U
    Den Shortcut könnt ihr natürlich anpassen, ebenso, wie den Pfad zur Datei.

    Die Aufrufzeile enthält zwei optionale Parameter, hier: "1" "0"
    Diese stehen für
    Alle-Variablen: "0" (Standard, einmalig) oder "1" (alle Vorkommen) und
    Ausgabe: "1" (Standard, in Konsole) oder "0" (als Array)

    Edit: Kleiner 'Guttenberg-Error' :D (gefixt)

    Hier der Code:

    GetUnusedVars.au3
    [autoit]

    #include-once
    #include <File.au3>
    #include <Array.au3>

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

    If $CmdLine[0] Then
    Local $sFile = $CmdLine[1], $fAll = 0, $fString = 1
    Switch $CmdLine[0]
    Case 3
    $fAll = $CmdLine[2]
    $fString = $CmdLine[3]
    Case 2
    $fAll = $CmdLine[2]
    EndSwitch
    Else
    Exit
    EndIf

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

    ConsoleWrite('+>' & @HOUR & ':' & @MIN & ':' & @SEC & ' Start: Get_Unused_Vars' & @CRLF)
    Local $vReturn = _GetUnusedVarsConst($sFile, $fAll, $fString)
    Local $error = @error
    ConsoleWrite('+>' & @HOUR & ':' & @MIN & ':' & @SEC & ' Ende: Get_Unused_Vars' & @CRLF)
    If @error Then ConsoleWrite('!Fehler: Datei "' & $sFile & ' existiert nicht.' & @CRLF)
    If $fString = 0 Then
    _ArrayDisplay($vReturn)
    Else
    ConsoleWrite($vReturn & @CRLF)
    EndIf

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

    ;===============================================================================
    ; Function Name: _GetUnusedVarsConst
    ; Description: Ermittelt ungenutzte Variablen/Konstanten in einem Skript
    ; Optional können alle Variablen mit Anzahl der Vorkommen ermittelt werden
    ; Ignoriert werden:
    ; Variablen in Kommentarzeilen
    ; Variablen in Kommentarblöcken
    ; Zählervariablen (For-Schleife)
    ; Parameter(s): $sFile Pfad zur Skriptdatei
    ; $fAll 1 - Rückgabe aller Variablen; 0(Standard) - einmalige Variablen
    ; $fString 1(Standard) - Rückgabe in Konsole; 0 - Anzeige Array
    ; Return Value(s): Erfolg Standard Array/String mit nur einmalig auftauchender Variable
    ; Optional Array/String mit allen Variablen
    ; Ausgabe: Funktionsbereich - Variable - Anzahl - Position:Zeile(n)
    ; Fehler 0 @error = 1 $sFile nicht vorhanden
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;===============================================================================
    Func _GetUnusedVarsConst($sFile, $fAll=0, $fString=1)
    Local $oVars = ObjCreate('Scripting.Dictionary')
    Local $oFuncVars = ObjCreate('Scripting.Dictionary')
    Local $aFuncs[1][2] = [[0]] ; [['Funktionsname','var1/Anz1/Zeile(1.),Zeile(2.)..' & '|' & 'var1/Anz1/Zeile(1.),Zeile(2.)..' & '|' & 'var(n)/Anz(n)/Zeile(1.),Zeile(2.)..' ]]
    Local $aFile, $tmp, $aSplit, $aMatch, $inFunc = False, $counterFor = '', $1stChar, $iPos, $sSign, $fSet, $iSemicolon, $skip, $sFuncName
    If Not FileExists($sFile) Then Return SetError(1,0,0)
    _FileReadToArray($sFile, $aFile)
    For $i = 1 To $aFile[0]
    ; Kommentarblöcke werden übersprungen
    ; auskommentierte Zeilen werden übersprungen
    $1stChar = StringLeft(StringStripWS($aFile[$i],1), 1)
    If $1stChar = ';' Then ContinueLoop
    If (StringInStr($aFile[$i], '#cs') Or StringInStr($aFile[$i], '#comments-start')) Then $skip = True
    If (StringInStr($aFile[$i], '#ce') Or StringInStr($aFile[$i], '#comments-end')) Then $skip = False
    If $skip Then ContinueLoop
    Select
    Case StringLeft(StringStripWS($aFile[$i], 1), 4) = 'Func'
    ; Beginn Funktionscode
    ; Funktionsnamen auslesen u. in Func-Array eintragen
    ; Funktionszähler +1
    $inFunc = True
    $aMatch = StringRegExp($aFile[$i], '^(?:[F|f]unc\s+)([_a-zA-Z0-9]+)', 1)
    $sFuncName = $aMatch[0]
    ; Variablen aus Funktionsheader (auch mehrzeilig) auslesen und in $oFuncVars erfassen
    ; steht eine Variable in einem Kommentar hinter dem Header wird sie ignoriert
    $aMatch = StringRegExp($aFile[$i], '(?:[F|f]unc\s+[\d\w]+\()[$,\w\s]*(?:\)?)', 1) ; Codeteil vor mgl. Kommentar oder '_'
    $aMatch = StringRegExp($aMatch[0], '(\$[\d\w]+)', 3)
    If IsArray($aMatch) Then __VarObjectAdd($oFuncVars, $aMatch, $counterFor, $i)
    Case StringLeft(StringStripWS($aFile[$i], 1), 7) = 'EndFunc'
    ; Ende Funktionscode
    ; in $oFuncVars gesammelte Variablen/Anzahl in $aFuncs übertragen
    ; optional ($fAll=True) werden alle Variablen mit Anzahl Vorkommen übertragen
    ; standardmäßig nur Variablen mit einmaligem Vorkommen
    If $oFuncVars.Count Then
    __SetToFuncArray($aFuncs, $oFuncVars, $fAll, $sFuncName)
    $oFuncVars.RemoveAll
    EndIf
    $inFunc = False
    Case Else ; Codezeilen innerhalb oder außerhalb einer Funktion, durch $inFunc markiert
    ; prüfen auf For-Schleife, Selektion Zählervariable
    If StringLeft(StringStripWS($aFile[$i], 1), 3) = 'For' Then
    $aMatch = StringRegExp($aFile[$i], '(?:[F|f]or\s+)(\$[\d\w]+)', 1)
    $counterFor = $aMatch[0]
    EndIf
    ; prüfen auf Ende For-Schleife, Zurücksetzen Zählervariable, nächste Zeile
    If StringLeft(StringStripWS($aFile[$i], 1), 4) = 'Next' Then
    $counterFor = ''
    ContinueLoop
    EndIf
    ; prüfen ob ';' enthalten und wieviel
    StringReplace($aFile[$i], ';', '')
    $iSemicolon = @extended
    $fSet = False
    If $iSemicolon Then
    ; Anzahl der ';' gibt keine Auskunft ob Kommentar od. Wertzuweisung
    ; wenn Wertzuweisung, muß vor und nach dem ; ein ' oder " sein (Stringbegrenzer)
    ; ist eines der Zeichen enthalten könnte es eine Wertzuweisung sein
    ; es braucht nur das letzte Vorkommen geprüft werden, wenn nicht in Stringbegrenzern ist es Kommentar
    ; wenn Kommentar - diesen Teil abtrennen
    ; ABER: wenn letzter Stringbegrenzer vor Semikolon == mit einem Stringbegrenzer im Kommentar ==> Kommentar wird nicht erkannt!
    If StringInStr($aFile[$i], '"') Or StringInStr($aFile[$i], "'") Then ; sind Stringbegrenzer vorhanden
    $sSign = ''
    $iPos = StringInStr($aFile[$i], ';', 1, -1) ; letztes Vorkommen ermitteln
    $aSplit = StringSplit($aFile[$i], '')
    For $j = $iPos -1 To 1 Step -1 ; rückwärts iterieren ab Semikolon
    If $aSplit[$j] = '"' Or $aSplit[$j] = "'" Then
    $sSign = $aSplit[$j]
    ExitLoop
    EndIf
    Next
    ; wenn Stringbegrenzer links gefunden
    If $sSign <> '' Then ; vorwärts iterieren ab Semikolon
    For $j = $iPos +1 To $aSplit[0]
    If $aSplit[$j] = $sSign Then ; davor und danach dasselbe ' od. " ==> also Zuweisung
    $fSet = True
    ExitLoop
    EndIf
    Next
    EndIf
    EndIf
    If Not $fSet Then ; ist Kommentar, nicht Zuweisung
    $aFile[$i] = StringLeft($aFile[$i], StringInStr($aFile[$i], ';', 1, -1) -1)
    EndIf
    EndIf
    ; Variablen selektieren und an $oFuncVars oder $oVars übergeben
    $aMatch = StringRegExp($aFile[$i], '(\$[\d\w]+)', 3)
    If IsArray($aMatch) Then
    If $inFunc = True Then
    __VarObjectAdd($oFuncVars, $aMatch, $counterFor, $i)
    Else
    __VarObjectAdd($oVars, $aMatch, $counterFor, $i)
    EndIf
    EndIf
    EndSelect
    Next
    If $oVars.Count Then __SetToFuncArray($aFuncs, $oVars, $fAll)
    Local $aRet[1][4] = [['Funktionsbereich','Variable','Anzahl','Zeile(n)']], $aSplit2, $sRet = 'Funktionsbereich - Variable - Anzahl - Zeile(n)' & @CRLF
    For $i = 1 To UBound($aFuncs) -1
    $aSplit = StringSplit($aFuncs[$i][1], '|')
    For $j = 1 To $aSplit[0]
    $aSplit2 = StringSplit($aSplit[$j], '/')
    If @error Then ContinueLoop
    $sRet &= $aFuncs[$i][0] & ' - ' & $aSplit2[1] & ' - ' & $aSplit2[2] & ' - ' & $aSplit2[3] & @CRLF
    If $fString = 0 Then
    ReDim $aRet[UBound($aRet)+1][4]
    $aRet[UBound($aRet)-1][0] = $aFuncs[$i][0]
    $aRet[UBound($aRet)-1][1] = $aSplit2[1]
    $aRet[UBound($aRet)-1][2] = $aSplit2[2]
    $aRet[UBound($aRet)-1][3] = $aSplit2[3]
    EndIf
    Next
    Next
    If $fString = 0 Then Return $aRet
    Return $sRet
    EndFunc ;==>_GetUnusedVarsConst

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

    Func __VarObjectAdd(ByRef $oDict, $aMatch, $counterFor, $line)
    Local $aSplit
    For $i = 0 To UBound($aMatch) -1
    If $aMatch[$i] = $counterFor Then ContinueLoop ; Zählervariablen werden nicht gezählt
    If $oDict.Exists($aMatch[$i]) Then
    $aSplit = StringSplit($oDict.Item($aMatch[$i]), '/')
    $oDict.Item($aMatch[$i]) = $aSplit[1] +1 & '/' & $aSplit[2] & ',' & $line
    Else
    $oDict.Add($aMatch[$i], 1 & '/' & $line)
    EndIf
    Next
    EndFunc ;==>__VarObjectAdd

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

    Func __SetToFuncArray(ByRef $aFuncs, ByRef $oDict, $fAll, $sFuncName='')
    Local $aSplit, $colKeys, $sVarCount = ''
    $colKeys = $oDict.Keys
    For $key In $colKeys
    If $sFuncName <> '' Then
    ReDim $aFuncs[UBound($aFuncs)+1][2]
    $aFuncs[UBound($aFuncs)-1][0] = $sFuncName
    EndIf
    If $fAll = 0 Then
    If Not StringRegExp($oDict.Item($key), '(1/\d+)') Then ContinueLoop
    EndIf
    $aSplit = StringSplit($oDict.Item($key), '/')
    $sVarCount &= $key & '/' & $aSplit[1] & '/' & $aSplit[2] & '|'
    If $sFuncName <> '' Then
    $aFuncs[UBound($aFuncs)-1][1] = StringTrimRight($sVarCount, 1)
    $sVarCount = ''
    EndIf
    Next
    If $sFuncName = '' Then
    ReDim $aFuncs[UBound($aFuncs)+1][2]
    $aFuncs[UBound($aFuncs)-1][0] = 'Out_Of_Func'
    $aFuncs[UBound($aFuncs)-1][1] = StringTrimRight($sVarCount, 1)
    EndIf
    EndFunc ;==>__SetToFuncArray

    [/autoit]

    ToDoList:
    - auf includierte Konstanten prüfen
    - auf includierte Globale Variablen prüfen
    - Globale Variablen gegen Variablen in Funktionen abgleichen

    Dateien

    unused_vars.png 25,21 kB – 0 Downloads GetUnusedVars.au3 8,89 kB – 613 Downloads
  • [gelöst] FF4 und FF.au3 möglich?

    • BugFix
    • 18. April 2011 um 23:27

    OK, Danke dir.

  • [gelöst] FF4 und FF.au3 möglich?

    • BugFix
    • 18. April 2011 um 23:03

    Ja, leck mich - Tatsache, so gehts. Aber wie soll man denn auf diese Elementbezeichnungen kommen? Im Quelltext steht doch folgendes:

    Code
    Username:
    	<input type="hidden"
    	name="username"
    	id="username"
    	value="">
    Passwort:
    	<input type="hidden"
    	name="password"
    	id="password"
    	value="">


    Ich weiß schon, warum ich mich bisher immer gegen den FF gesträubt habe. :D
    Aber leider tuts mein geliebtes K-Meleon nicht so richtig unter Win7. :S

  • [gelöst] FF4 und FF.au3 möglich?

    • BugFix
    • 18. April 2011 um 22:25

    OK, ich hatte vermutet, dass deshalb meine Eingabefelder leer bleiben.
    Nun habe ich aber alle Returns ausgewertet, MozRepl funktioniert und somit werden die FF-Funktionen auch ausgeführt.
    Seltsamerweise zeigen alle Funktionen Erfolg - aber meine Felder bleiben leer.

    Spoiler anzeigen
    [autoit]

    #include <FF.au3>

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

    Local $class = '[CLASS:MozillaWindowClass]', $sPath, $hWnd
    Local $url = "http://webmailer.1und1.de/"
    Local $user = "meine-mail@online.de"
    Local $pw = "password"
    Local $btLogin = "https://webmailcluster.1und1.de/img/main_Login_Webmailer.png"

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

    If Not ProcessExists('firefox.exe') Then
    $sPath = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 4.0\bin', 'PathToExe')
    Run($sPath)
    WinWait($class)
    EndIf

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

    If Not WinActive($class) Then
    $hWnd = WinActivate($class) ; ohne jede Wirkung, obwohl ohne Fehler ausgeführt
    WinSetState($hWnd, '', @SW_SHOW) ; -"-
    EndIf

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

    _FFConnect()
    _FFTabAdd("about:blank")
    _FFOpenURL($url)

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

    _FFSetValue($user, "username", "name") ; Funktion erfolgreich - Feld ist aber leer
    ;~ __FFSend: try{window.content.top.document.getElementsByName('username')[0].value='meine-mail@online.de'}catch(e){'_FFCmd_Err';};
    ;~ __FFRecv: [email='meine-mail@online.de'][/email]

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

    _FFSetValue($pw, "password", "name") ; Funktion erfolgreich - Feld ist aber leer
    ;~ __FFSend: try{window.content.top.document.getElementsByName('password')[0].value='password'}catch(e){'_FFCmd_Err';};
    ;~ __FFRecv: password

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

    _FFClick("login_b", "id")
    ;~ __FFSend: try{FFau3.simulateEvent(FFau3.WCD.getElementById('login_b'),'MouseEvents','click');}catch(e){'_FFCmd_Err';};
    ;~ __FFRecv: 1

    [/autoit]


    Und noch etwas Seltsames: Wenn ich obiges Skript auf eine geöffnete FF-Sitzung anwende (das im Moment im Hintergrund ist) werden die Funktionen WinActivate() / WinSetState() erfolgreich ausgeführt, aber das Fenster bleibt trotzdem verdeckt. SetWinOnTop hilft auch nicht. :wacko:

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™