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

  • Concatenates Operator und Anderes

    • BugFix
    • 25. Februar 2014 um 09:08

    zu a)
    Das ist in AutoIt in der Form nicht möglich.
    Du könntest alternativ Folgendes anwenden:

    [autoit]

    For $i = 1 To 10
    Assign('Var_' & $i, $i)
    Next
    ConsoleWrite(Eval('Var_5') & @LF)

    [/autoit]

    Aber zum Einen ist Assign/Eval als schlechter Stil verpönt und zum Anderen generieren derartig erstellte Variablen einen Error bei der Syntaxprüfung, da sie erst zur Laufzeit existieren. Du könntest sie also nur mit Eval ansprechen.
    Und warum willst du Arrays vermeiden? Berührungsängste? Das legt sich spätestens dann, wenn du merkst, wie sehr du dir die Arbeit im Skript damit vereinfachen kannst.

    zu b)
    AutoIt kann mit einigen Objekten umgehen. Dazu gehört auch dein Bsp. Internet Explorer.
    Und somit ist der Punkt das übliche Trennsymbol zu den Methoden und Eigenschaften dieses Objektes. Eine Übersicht darüber kannst du dir bei MSDN suchen.

  • FireBird.au3 mit FDB Datenbank - ExecuteSelect Rückgabewert

    • BugFix
    • 21. Februar 2014 um 15:55

    Meine Lösung basiert auf der Verwendung von ODBC-Treibern (steht so auch im Funktionskopf ;))
    Hast du evtl. keine ODBC-Treiber installiert (standardmäßig nicht der Fall)? Hier findest du eine Auswahl.

  • Bei zweitem Fenster funktioniert "GUISetOnEvent($GUI_EVENT_PRIMARYDOWN,..." nicht

    • BugFix
    • 21. Februar 2014 um 11:56
    Zitat von DOheim

    ($bState) ? (GUISetState(@SW_SHOW, $hChild)) : (GUISetState(@SW_HIDE, $hChild))


    Das ist ein ternärer Operator und seit der 3.3.10.. in der Stable. Ich vermute mal, du hast eine ältere Version. Kannst du auch als ganz normales If-Then-Else schreiben. Ternäre Operatoren sind ausschließlich "Syntactic Sugar". Wer es also süß mag... ;)

  • FireBird.au3 mit FDB Datenbank - ExecuteSelect Rückgabewert

    • BugFix
    • 21. Februar 2014 um 11:35

    Aus deinem Skript ist nicht ersichtlich, wie du SQL-Execute vollziehst. (FireBird.au3 ist eine UDF, solltest du drauf verlinken, wenn du diese verwendest. Mir ist sie nicht bekannt.)

    Hier mal die Funktionen, die ich mir für die Interaktion mit Firebird erstellt habe:

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ; Function Name: _oSQLDB_Connect($connStr)
    ; Description:: erstellt eine Objektreferenz auf eine Firebird-DB
    ; Parameter(s): $connStr Connection-String enthält die Verbindungsparameter
    ; Requirement(s): Firebird und installierte FB-ODBC-Treiber
    ; Return Value(s): Erfolg Referenz des ADODB-Objektes
    ; Fehler 1, @error 1
    ; Author(s): BugFix
    ;===============================================================================
    Func _oSQLDB_Connect($connStr)
    Local $objConnection = ObjCreate("ADODB.Connection")
    If Not IsObj($objConnection) Then Return SetError(1,0,1)
    $objConnection.Open($connStr)
    Return $objConnection
    EndFunc ;==>_oSQLDB_Connect

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

    ;===============================================================================
    ; Function Name: _oSQLDB_Execute($oConn, $strCommand, $Options=-1)
    ; Description:: führt Kommandostring (SQL-Sequenz) aus
    ; Parameter(s): $oConn Referenz des FB-Objektes
    ; $strCommand Kommandostring
    ; optional $Options CommandTypeEnum (http://msdn.microsoft.com/en-us/library/ms675946(VS.85).aspx) oder
    ; ExecuteOptionEnum (http://msdn.microsoft.com/en-us/library/ms676517(VS.85).aspx)
    ; Return Value(s): Eine Recordset Objekt-Referenz, ein Stream oder Nichts
    ; Author(s): BugFix
    ;===============================================================================
    Func _oSQLDB_Execute($oConn, $strCommand, $Options=-1)
    Local $recAffected
    Return $oConn.Execute($strCommand, $recAffected, $Options)
    EndFunc ;==>_oSQLDB_Execute

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

    ;===============================================================================
    ; Function Name: _oRecSet_Close($oRecSet)
    ; Description:: Beendet ein RecordsetObjekt
    ; Parameter(s): $oRecSet Referenz des Objektes
    ; Author(s): BugFix
    ;===============================================================================
    Func _oRecSet_Close($oRecSet)
    $oRecSet.Close
    EndFunc ;==>_oRecSet_Close

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

    ;===============================================================================
    ; Function Name: _oSQLDB_Close($oConn)
    ; Description:: Beendet eine Firebird-Verbindung
    ; Parameter(s): $oConn Referenz des FB-Objektes
    ; Author(s): BugFix
    ;===============================================================================
    Func _oSQLDB_Close($oConn)
    $oConn.Close
    EndFunc ;==>_oSQLDB_Close

    [/autoit]


    Und hier mal ein Beispiel:

    [autoit]

    Global $data_source = "Lw:/PFAD/DEINER/FB-DB" ; Notation mit "/" beachten!!
    Global $strConnection = "DRIVER=Firebird/InterBase(r) driver; UID=SYSDBA; PWD=masterkey; DBNAME=" & $data_source & ";"

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

    Global $oFB, $oRS, $sql_str, $arTables, $arFieldType

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

    $oFB = _oSQLDB_Connect($strConnection)
    If Not IsObj($oFB) Then
    MsgBox(0, 'Datenbank', 'keine Verbindung')
    _close()
    EndIf

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

    ; #### alle UserTabellen auslesen ####
    $sql_str = "SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0 ORDER BY RDB$RELATION_NAME;"
    $oRS = _oSQLDB_Execute($oFB, $sql_str)
    $arTables = $oRS.GetRows
    _ArrayDisplay($arTables)

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

    ; #### alle UserTabellen mit Feldnamen und FeldTypen ####
    $sql_str = "SELECT RDB$RELATION_NAME, RDB$FIELD_NAME, RDB$FIELD_SOURCE FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME NOT CONTAINING '$' order by RDB$RELATION_NAME, RDB$FIELD_NAME;" ;[0]=Feld, [1]=Tabelle, [2]=Typ-Länge
    $oRS = _oSQLDB_Execute($oFB, $sql_str)
    $arFieldType = $oRS.GetRows ; Tabelle-Feld-Datentyp
    _ArrayDisplay($arFieldType)

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

    _close()

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

    Func _close()
    If IsObj($oRS) Then _oRecSet_Close($oRS)
    If IsObj($oFB) Then _oSQLDB_Close($oFB)
    Exit
    EndFunc

    [/autoit]
  • Simple Filename Replacer: mehrere Dateien gleichzeitig umbenennen; aufrufbar per Kontextmenü

    • BugFix
    • 21. Februar 2014 um 10:45
    Zitat von zemkedesign

    Aber bei einer Mehrfachselektion ruft Windows für jede Datei eine separate Instanz des Programms auf. Diese verschiedenen Instanzen müssen einen Master aushandeln; alle anderen Instanzen werden zu Slaves und kommunizieren mit dem Master. Windows startet die Instanzen manchmal auf die Millisekunde gleich, sodass es eine Herausforderung war.


    Das hast du dir dann wohl etwas komplizierter als erforderlich gestaltet. ;)
    Hier eine einfache Lösungsvariante.

  • Tipps für ein Programm

    • BugFix
    • 10. Februar 2014 um 15:20

    Weil das aus deinem Text nicht hervorgeht: Wo befindet sich denn das Gegenstück zu dem Ordner, den du synchronisieren möchtest?
    Vielleicht ist es lohnenswert mit Hardlinks zu arbeiten? Würde dir die Arbeit der Synchronisation abnehmen.

  • Welche AutoIt Version nutzt ihr?

    • BugFix
    • 6. Februar 2014 um 20:54

    Für mich ist 3.3.8.1 die letzte Version, die ich nutze.
    Ich kann nicht nachvollziehen, was für Verschlimmbesserungen vorgenommen werden, statt sich mal dazu zu entschließen die echten Schwachpunkte auszumerzen.
    Dazu zähle ich:
    - derselbe Operator für Zuweisung und Vergleich
    - Zählervariablen, die auch außerhalb der Schleife weiter existieren
    - Datentyp Variant ( Ich weiß, dass vielen dieser Datentyp gefällt, aus meiner Sicht fördert er nur eine schlampige Programmierweise. )
    - fehlende Unterscheidung von Gross- / Kleinschreibung
    Letztlich sind das alles Faktoren, die für mich dazu führen AutoIt nur noch auf Nebenschauplätzen anzuwenden.
    Hauptsächlich werde ich mich in Zukunft mit Lua und Python beschäftigen.

  • Array2DSortFree - negative Zahlen

    • BugFix
    • 31. Januar 2014 um 23:26

    Tricksen wird hier schwerfallen, da wir ja zeitgleich mehrere Spalten sortieren, ist ein Nacheinander der Sortierung nicht möglich.
    Ich werde mal noch ein bischen Grübeln, vielleicht habe ich eine Eingebung. ;)

  • Array2DSortFree - negative Zahlen

    • BugFix
    • 31. Januar 2014 um 23:05

    Ging schnell - hab mir den Code nochmal angesehen.
    Um überhaupt nummerisch sortieren zu können muß ich die SQL-Funktion "Abs" nutzen, ansonsten ist der Inhalt aus Sicht von SQLite ein String. "Abs" wiederum macht was der Name sagt: es liefert den absoluten Wert. Bei negativen Zahlen wird somit das Vorzeichen gekillt.

    Das Problem ist Folgendes:
    AutoIt-Arrays sagen uns nichts über den Inhalt. Ist die Ziffer eine Ziffer? Oder soll sie als Zahl genutzt werden? Der Scheiß-Datentyp Variant spuckt uns hier mitten ins Gesicht.
    (Jeden weiteren Tag, den ich was mit AutoIt mache könnte ich mich mehr über diesen Dreck aufregen. Ist doch nun wirklich nicht problematisch den Nutzer zu zwingen, festzulegen, was für Daten er überhaupt verwenden will. :evil: )
    Und aus diesem Variant-Grund kann ich beim Erstellen der Datenbank keine Datentyp-orientierten Felder erstellen - ich weiß ja nie, was kommt. Also muss ich die Felder als Variant lassen und mit "Abs" den nummerischen Vergleich erzwingen - mit besagtem Problem bei negativen Zahlen.

    Fazit: Eine allgemeingültige Funktion, die auch negative Zahlen sortiert, ist so nicht möglich.
    Dazu müßtest du dann fallbezogen jeweils eine Datenbank mit konkreter Datentyp-Struktur erstellen.

  • Array2DSortFree - negative Zahlen

    • BugFix
    • 31. Januar 2014 um 22:46

    Pooh - da bin ich im Moment überfragt.
    Leider ist SQLite ja genauso dreckig wie AutoIt, was Datentypen und den Umgang damit angeht.
    Ich werde mir das nochmal anschauen, ist ja doch schon ein paar Tage alt. Muss ich mich mal wieder reinfinden.

  • Suche Workaround RegExp Repeating Character Pattern Limit

    • BugFix
    • 31. Januar 2014 um 09:24

    Die max. Länge des Matches ist durch die Regex Engine limitiert auf 65500 und ein paar Zerquetschte.
    Die Länge von 25 in seinem Bsp. war nur zur Verdeutlichung.

  • Suche Workaround RegExp Repeating Character Pattern Limit

    • BugFix
    • 30. Januar 2014 um 23:53

    Habs dann doch noch gleich fertiggestellt, geht tadellos und schwuppdifix ;)
    Du brauchst die angehängten Includes dafür.

    [autoit]


    #include "LuaInline.au3"
    _Lua_StartUp() ; == Initialisiert Lua, Shutdown automatisch bei AutoIt-Ende

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

    Global $sLua = _
    " local pathStr = 'C:\\Code_AutoIt\\TEST\\String.txt'" & _ ; == Dateipfad zum Einlesen
    " local pathOut = 'C:\\Code_AutoIt\\TEST\\Separated.txt'" & _ ; == Dateipfad für Ergebnis (jede Zeile ein Wert)
    " local fh = io.open(pathStr)" & _
    " local sString = fh:read()" & _
    " fh:close()" & _
    " " & _
    " local iMax = 80000" & _ ; <<<<<< Hier die Max Länge angeben <<<<<<<<
    " local sTmp, tResult = '', {}" & _
    " " & _
    " local Merge = function(_v)" & _
    " if _v == nil then" & _
    " tResult[#tResult+1] = sTmp" & _
    " elseif (#_v + #sTmp) > iMax then" & _
    " tResult[#tResult+1] = sTmp" & _
    " sTmp = _v" & _
    " else" & _
    " sTmp = sTmp.._v" & _
    " end" & _
    " end" & _
    " " & _
    " for v in sString:gmatch('(%b[])') do" & _
    " v = v:gsub('[%[%]]', '')" & _
    " Merge(v)" & _
    " end" & _
    " Merge()" & _
    " " & _
    " local sWrite = ''" & _
    " for i = 1, #tResult do" & _
    " sWrite = sWrite..tResult[i]..'\n'" & _
    " end" & _
    " fh = io.open(pathOut, 'w+')" & _
    " fh:write(sWrite)" & _
    " fh:close()"

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

    _Lua_DoString($sLua)

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

    ConsoleWrite('FERTIG !' & @LF)

    [/autoit]

    Edit:
    Du wolltest das unbedingt in ein Pattern pressen, das ist aber der Aufgabe schlicht und einfach nicht angemessen. Ein generisches Abarbeiten der Matches ist hier effektiver.

    Das generische Bearbeiten, wie ich es dort in Lua gemacht habe, läßt sich aber auch in AutoIt per Callback-Funktion erledigen. Und ist (zumindest bei der Dateigröße von 800 kb) nicht spürbar langsamer als in Lua. Bei größeren Dateien könnte die Speed von Lua spürbar werden.

    AutoIt-Variante:

    [autoit]

    $pathStr = 'C:\Code_AutoIt\TEST\String.txt'
    $pathOut = 'C:\Code_AutoIt\TEST\Separated.txt'
    $sString = FileRead($pathStr)
    $iMax = 80000
    Global $sMatch, $sTmp

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

    _StringRegExpReplace_Callback($sString, "(\[.+?\])", "__CallBack_Match('\1')")
    __CallBack_Match() ; letzten Inhalt von $sTmp noch anfügen

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

    ;~ ConsoleWrite($sMatch & @LF)
    FileWrite($pathOut, $sMatch)

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

    Func __CallBack_Match($s='')
    $s = StringRegExpReplace($s, '[\[\]]', '')
    If $s = '' Then
    $sMatch &= @CRLF & $sTmp
    ElseIf (StringLen($sTmp) + StringLen($s)) > $iMax Then
    $sMatch &= @CRLF & $sTmp
    $sTmp = $s
    Else
    $sTmp &= $s
    EndIf
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _StringRegExpReplace_Callback
    ; Description ...:
    ; Syntax ........: _StringRegExpReplace_Callback($sString, $sPattern, $sCallback[, $sBefore = ''[, $sAfter = '']])
    ; Parameters ....: $sString
    ; $sPattern
    ; $sCallback
    ; $sBefore
    ; $sAfter
    ; Return values .: None
    ; Author ........: Taz77 (Markus Ehmig <autoit at ehmig dot net>)
    ; Since .........: 2012/04/23
    ; Modified ......: 2013/05/11
    ; Remarks .......: Achtung! Das ' wird temporär im $sString durch \x1a ersetzt, wenn im plattern danach gesucht werden soll, muss nach \x1a enstelle von ' gesucht werden
    ; Related .......:
    ; Link ..........:
    ; Example .......: No
    ; ===============================================================================================================================
    Func _StringRegExpReplace_Callback($sString, $sPattern, $sCallback, $sBefore='', $sAfter='')
    Local $Str = Execute("'" & StringRegExpReplace(StringReplace($sString, "'", Chr(26), 0, 2), $sPattern, $sBefore&"'&" & $sCallback & "&'"&$sAfter) & "'")
    If @error then
    ConsoleWrite('_StringRegExpReplace_Callback error! Pattern: "'&$sPattern&'", Callback: "'&$sCallback&'"' & @LF)
    Return $sString
    EndIf
    Return StringReplace($Str, Chr(26), "'", 0, 2)
    EndFunc

    [/autoit]

    Dateien

    LuaInline.au3 13,39 kB – 332 Downloads LuaSource.au3 451,85 kB – 403 Downloads
  • Suche Workaround RegExp Repeating Character Pattern Limit

    • BugFix
    • 30. Januar 2014 um 22:14

    OK, ich teste das mal aus. Aber vor morgen abend werde ich da nicht zu kommen - aber ist nicht vergessen.

  • Suche Workaround RegExp Repeating Character Pattern Limit

    • BugFix
    • 30. Januar 2014 um 21:26

    Hast du mal so eine Musterdatei?
    Ich könnte probieren, ob das mit Lua realisierbar ist. Ich habe ja eine UDF zur Verwendung von Lua-Inline in AutoIt erstellt. Ich kann aber vorab nicht sagen ob das Pushen solch großer Datenmengen auf den Lua Stack anstandslos funktioniert.

  • Umlaute in der Konsole

    • BugFix
    • 30. Januar 2014 um 19:47

    Wer will US-ASCII?
    gesucht ist: Windows-Westeuropäisch, und das ist nunmal 1252. ;)

  • Suche Workaround RegExp Repeating Character Pattern Limit

    • BugFix
    • 30. Januar 2014 um 18:32

    Alternativvariante:
    - Lösche alle "[" "]" und ","
    - übrig bleibt der gewünschte Inhalt
    - jetzt häckseln in Teile fester Länge

    [autoit]


    $s = StringRegExpReplace("DEIN_STRING", "[\[\],]", "")
    $aMatch = StringRegExp($s, ".{1, " & $iMaxLen & "}", 3)

    [/autoit]
  • Suche Workaround RegExp Repeating Character Pattern Limit

    • BugFix
    • 30. Januar 2014 um 17:51

    So richtig kann ich dir nicht folgen.
    Du hast einen String, tausende Zeichen lang mit Gruppen von"[irgendwas]" getrennt durch Kommata - richtig?
    Und was ist jetzt der Knackpunkt, was macht es unmöglich den Teil zwischen den Klammern abzufragen? Ich sehe da kein Hindernis.

  • Suche Workaround RegExp Repeating Character Pattern Limit

    • BugFix
    • 30. Januar 2014 um 17:01

    Vielleicht erklärst du mal, was du vorhast, damit man dein Problem nachvollziehen kann.
    Was für einen Text willst du parsen, was soll dabei rauskommen?

  • SciTE - Select Statement

    • BugFix
    • 29. Januar 2014 um 22:28

    Hi,
    i2c hat die Idee hierzu gehabt. Ich habe es mal umgesetzt:

    Man markiert Code, aktiviert einen Shortcut, eine Auswahlliste popt auf. Man wählt ein Statement und dann wird der markierte Code in das Statement eingebettet. Hat das Statement mehrere Blöcke wird der Code im ersten Block eingefügt.
    Bsp.:

    [autoit]


    ; == vorher:
    MsgBox(0, 'Test', 'Blub')

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

    ; == in der Liste wurde "If-Then" gewählt: "|" ist die anschließende Cursorposition
    If | Then
    MsgBox(0, 'Test', 'Blub')
    EndIf

    [/autoit]

    Bilder sagen mehr als 1000 Worte: V I D E O

    Ich habe eine Version für SciTE4AutoIt und eine für SciTE-RU erstellt.

    Installation
    Code
    SciTE4AutoIt
    			- "SelectStatement.lua" in den Lua-Skriptordner kopieren
    
    
    			- In "SciTEStartup.lua" anfugen
    				LoadLuaFile("SelectStatement.lua", "DIRECTORY")
    
    
    			- Shortcut erstellen, (SciTEUser.properties)
    				command.NR.*.au3=Statement.ShowStatementList()
    
    
    		SciTE-RU
    			- "SelectStatementRU.lua" in den Lua-Skriptordner kopieren
    
    
    			- In "COMMON.lua" einfugen
    				dofile("PATH\\SelectStatement.lua")
    				Statement.Handler()
    
    
    			- Shortcut erstellen,
    				command.NR.*.au3=Statement.ShowStatementList()
    
    
    	Anwendung:
    
    
    		- Code markieren
    		- Shortcut aufrufen
    		- der Code wird in das Statement eingebettet
    Alles anzeigen


    Edit:
    Folgende Statements stehen zur Auswahl

    Code
    "If-Then"           
    "If-Then-Else"      
    "If-Then-ElseIf"    
    "If-Then-ElseIf-Else"
    "For-Loop"          
    "While-Loop"        
    "Do-Until"          
    "With-EndWith"      
    "Func-EndFunc"

    Dateien

    SelectStatement.lua 2,55 kB – 511 Downloads SelectStatementRU.lua 2,55 kB – 518 Downloads
  • Source verschwunden, obfuscated source unobfuscaten?

    • BugFix
    • 29. Januar 2014 um 09:33

    OMFG - habt ihr keinen Frisör?

    Ich denke mal, dass weiter Ergüsse zu dieser Thematik nicht erforderlich sind.

    [CLOSED]

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™