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

Beiträge von Taz77

  • Hilfe beim Parsen(Regex) von Globalen/Lokalen Variablen aus einer *.au3 Datei

    • Taz77
    • 18. Mai 2013 um 22:19

    Danke BugFix aber leider nicht, da du in deinem Script nur auf normale Globale Variablen mit \$[\d\w]+ prüfst.

    Der Hintergrund warum ich jede Variable einzeln in einer Lokalen/Globalen Deklaration haben will bzw. muss,
    ist das Au3Check mit der Option -v 3 die unbenutzten Variablen nicht findet :/

    So findet die Au3Check die unbenutzte $Var2 nicht:

    [autoit]

    #AutoIt3Wrapper_AU3Check_Parameters=-v 3
    Global $Var1 = 'Test1', $Var2 = 'Test2'
    ConsoleWrite($Var1)

    [/autoit]


    So hingegen schon:

    [autoit]

    #AutoIt3Wrapper_AU3Check_Parameters=-v 3
    Global $Var1 = 'Test1'
    Global $Var2 = 'Test2'
    ConsoleWrite($Var1)

    [/autoit]
    Code
    XXX.au3(3,1) : UNREFED(3):	$Var2
  • Hilfe beim Parsen(Regex) von Globalen/Lokalen Variablen aus einer *.au3 Datei

    • Taz77
    • 18. Mai 2013 um 21:50

    Hallo zusammen,
    Ich versuche mich schon seit Stunden an einer Regex Anweisung um alle Globalen und Lokalen deklarierten Variablen aus einer AutoIt Datei zu Parsen und neu zu erstellen.

    Mir geht es ABER darum, das ich aus:

    [autoit]

    Global Const $ScriptDir = @ScriptDir, $__FILE__ = @ScriptFullPath
    Global $DirTarget = $ScriptDir
    Global $__Modus = 1, $__WriteToConsole = Not @Compiled, $__7zStatus, $__ReturnMsg
    Local $Test = StringRegExpReplace(StringReplace($sString, "'", Chr(26), 0, 2), $sPattern, $sDummy)

    [/autoit]


    das bekomme:

    [autoit]

    Global Const $ScriptDir = @ScriptDir
    Global Const $__FILE__ = @ScriptFullPath
    Global $DirTarget = $ScriptDir
    Global $__Modus = 1
    Global $__WriteToConsole = Not @Compiled
    Global $__7zStatus
    Global $__ReturnMsg
    Local $Test = StringRegExpReplace(StringReplace($sString, "'", Chr(26), 0, 2), $sPattern, $sDummy)

    [/autoit]


    Mein Pattern ist bis jetzt:

    [autoit]

    While 1
    $Str = StringRegExpReplace($Str, "(?i)((?:Global|Local)(?: Const| Static)*)\h+(\$\w+)\h*(=\h*\w+.*\)|=\h*[\w@]+|=\h*[\x22']+.*[\x22']+|)\h*,\h*(\$.*)", "\1 \2\3"&@CRLF&"\1 \4")
    If @Extended <= 0 Then ExitLoop
    WEnd

    [/autoit]


    Was aber leider immer noch nicht richtig funktioniert. Ich bin aber auch leider nicht so "der" regex profi, aber ggf kann mir ja jemand weiterhelfen :)

  • Möglichkeit gesucht, um VOR einer Datei zu schreiben...

    • Taz77
    • 24. April 2013 um 00:36

    Hallo,
    das geht leider nicht, du kannst höchsten das erste mb überschreiben, aber nichts davor setzten.
    Anhängen ist wiederum kein Problem :)

  • Tutorial StringFormat - Warum es guter Stil ist :-)

    • Taz77
    • 24. April 2013 um 00:25

    schade eigentlich.

    PS: Danke für die Fixe Antwort, hatte dazu leider nichts gefunden.

    Edit:
    Ich hab mir mal eine Funktion erstellst, die Parameter in Strings ersetzt. Kann ggf. ganz nützlich sein, gerade in Bezug auf die Übersetzbarkeit ;)

    Funktion:

    [autoit]

    Func _StringSetParameter($sFormat, $1='', $2='', $3='', $4='', $5='', $6='', $7='', $8='', $9='', $10='')
    Return Execute("'" & StringRegExpReplace(StringReplace($sFormat, "'", "''", 0, 2), "%(\d{1,10})", "'&$\1&'") & "'")
    EndFunc

    [/autoit]

    Beispiel:

    [autoit]

    Global $Fehler = 5, $FunktionsName = '_example'
    Global $Lang_DE = 'Es wurden %1 Fehler gefunden, die auf die Funktion "%2" zurückzuführen waren'
    Global $Lang_EN = 'The function "%2" caused %1 errors.'

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

    ConsoleWrite(_StringSetParameter($Lang_EN, $Fehler, $FunktionsName) & @CRLF)
    ConsoleWrite(_StringSetParameter($Lang_DE, $Fehler, $FunktionsName))

    [/autoit]
  • Tutorial StringFormat - Warum es guter Stil ist :-)

    • Taz77
    • 23. April 2013 um 22:59
    Zitat von peethebee

    ...
    3. Schlechte Übersetzbarkeit
    ...
    Die Reihenfolge der Parameter kann sich ändern, die Teilzeichenketten enthalten in aller Regel verschiedene Satzanteile und es ist wesentlich schwerer aus kleinen Fetzen korrekte Übersetzungen zu bauen, wenn man nur die Teilstrings bekommt.
    ...


    Naja, da ändert die AutoIt Funktion StringFormat je leider auch nichts dran:

    [autoit]

    Global $i = 5, $funktionsname = '_example'
    Global $Lang_DE = "Es wurden %i Fehler gefunden, die auf die Funktion %s zurückzuführen waren"
    Global $Lang_EN = "The function %s caused %i errors."

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

    ConsoleWrite(StringFormat($Lang_EN, $i, $funktionsname))

    [/autoit]


    Hier fehlt mir eindeutig die Möglichkeit die Reihenfolge der Platzhalter angeben zu können :(
    Wie in php zb:

    PHP
    $anzahl = 5;
    $ort    = 'Baum';
    
    
    $format = 'Der %2$s enthält %1$d Affen';
    printf($format, $anzahl, $ort);
    
    
    $format = 'Der %2$s enthält %1$d Affen. %1$d Affen sind ziemlich viel für einen %2$s.';
    printf($format, $anzahl, $ort);


    Oder hab ich da was übersehen, und das ist mit der AutoIt Funktion StringFormat auch möglich?

  • Listview filtern

    • Taz77
    • 15. Oktober 2012 um 00:23

    Hi,
    hast du schon eine Lösung gefunden? Würde mich auch brennend interessieren :)

  • Struct via "Struct.Element" ansprechen - Beta 3.3.9.5

    • Taz77
    • 4. Oktober 2012 um 23:39
    Zitat von BugFix

    Aber Sorry an eukalyptus, jetzt haben wir deinen Thread ge-highjackt. :whistling:
    Keine böse Absicht.

    ja, sorry war keine Absicht.

    Aber ... eins muss ich fix noch los werden.
    Mit der Aktuelle Beta ist der ternäre Operator sogar schneller wie ein "If ... Then ... Else ... EndIf" :P

    [autoit]

    Local $Loops = 1000000, $Years = 2, $i, $Test

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

    $Timer = TimerInit()
    For $i = 0 To $Loops
    $Test = ($Years > 1) ? 'Jahre' : 'Jahr'
    Next
    ConsoleWrite(' ternär: ' & TimerDiff($Timer) & @CRLF)

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

    $Timer = TimerInit()
    For $i = 0 To $Loops
    If $Years > 1 Then
    $Test = 'Jahre'
    Else
    $Test = 'Jahr'
    EndIf
    Next
    ConsoleWrite('If...Else: ' & TimerDiff($Timer) & @CRLF)

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

    $Timer = TimerInit()
    For $i = 0 To $Loops
    $Test = _IFOR('$Years > 1', 'Jahre', 'Jahr')
    Next
    ConsoleWrite(' _IFOR:' & TimerDiff($Timer) & @CRLF)

    [/autoit]


    Ergibt bei mir:

    Code
    ternõr: 799.567721673811
    If...Else: 982.689106436273
        _IFOR: 8255.16073135715


    PS: Dein "_IFOR" sprengt da den rahmen :D

  • Struct via "Struct.Element" ansprechen - Beta 3.3.9.5

    • Taz77
    • 4. Oktober 2012 um 17:43

    Ok hast recht, ich hoffe das ist besser :whistling:

    [autoit]

    Local $Format = '', $Years = 2, $Days = 1, $Hours = 0, $Mins = 1, $Secs = 12
    If $Years > 0 Then $Format &= $Years & (($Years > 1) ? ' Jahre ' : ' Jahr ')
    If $Days > 0 Then $Format &= $Days & (($Days > 1) ? ' Tage ' : ' Tag ')
    If $Hours > 0 Then $Format &= $Hours & (($Hours > 1) ? ' Stunden ' : ' Stunde ')
    If $Mins > 0 Then $Format &= $Mins & (($Mins > 1) ? ' Minuten ' : ' Minute ')
    If $Secs > 0 Then $Format &= $Secs & (($Secs > 1) ? ' Sekunden ': ' Sekunde ')
    MsgBox(64, '', $Format)

    [/autoit]


    VS

    [autoit]

    Local $Format = '', $Years = 2, $Days = 1, $Hours = 0, $Mins = 1, $Secs = 12
    If $Years = 1 Then $Format &= $Years & ' Jahr '
    If $Years > 1 Then $Format &= $Years & ' Jahre '
    If $Days = 1 Then $Format &= $Days & ' Tag '
    If $Days > 1 Then $Format &= $Days & ' Tage '
    If $Hours = 1 Then $Format &= $Hours & ' Stunde '
    If $Hours > 1 Then $Format &= $Hours & ' Stunden '
    If $Mins = 1 Then $Format &= $Mins & ' Minute '
    If $Mins > 1 Then $Format &= $Mins & ' Minuten '
    If $Secs = 1 Then $Format &= $Secs & ' Sekunde '
    If $Secs > 1 Then $Format &= $Secs & ' Sekunden '
    MsgBox(64, '', $Format)

    [/autoit]
  • Struct via "Struct.Element" ansprechen - Beta 3.3.9.5

    • Taz77
    • 3. Oktober 2012 um 16:25

    Also ich liebe die ternäre Operatoren,
    und vernünftig angewendet, helfen sie meiner Meinung nach auch den Code übersichtlicher zu machen.

    Beispiel ohne ternären Operator

    [autoit]

    $Var = 75
    If $Var > 0 Then
    $Msg = "Value is positive."
    Else
    $Msg = "Value is negative."
    EndIf

    [/autoit]

    Beispiel mit ternärem Operator

    [autoit]

    $Var = 75
    $Msg = ($Var > 0) ? "Value is positive." : "Value is negative."

    [/autoit]


    Ergebnis: 6 Zeilen vs 2 Zeilen Code

    Thema StringSplit:
    Ich würde es besser finden wenn der Array Index, in der funktion sein würde:

    [autoit]

    StringSplit ( "string", "delimiters" [, flag [, iArrayIndex ] ] )

    [/autoit]


    Ach wäre das schön wenn AutoIt Native assoziative Arrays hätte *Träum* :love:

  • MySQL UDF - mit libmySQL.dll (kein ODBC)

    • Taz77
    • 2. Oktober 2012 um 22:07

    Danke für die Erklärung,
    aber ich bin noch ein wenig verwirrd, denn:
    - Ich habe eine *.au3 Datei die in UTF8 gespeichert ist,
    - dann frage ich die Datenbank ab,
    - welche auch in UTF8 erstellt worden ist.
    - MySql weise ich auch an, das die Daten auch in UTF8 übermittelt werden sollen.

    Also sollte doch dann auch UTF8 ankommen, und nicht ASCII...
    Somit ist _MySQL_Set_Character_Set($MySqlId, 'utf8') doch eigentlich total überflüssig, wenn die Daten auch nicht wie gewünscht ankommen.


    Ich hab ja auch schon mal versucht deine UDF mit der SqlLite zu vergleichen was wo anderes gelöst worden ist.
    Allerdings bin ich auch noch recht neu mit AutoIt unterwegs, und somit nicht wirklich schau daraus geworden,
    speziell was die DLLStructCreate, DLLStructSetData angeht.
    Ich hatte in dem DllCall von dir einfach mal versucht aus dem "str" ein "Wstr" zu machen, aber das hat leider nicht geklapt :whistling:

    Könntest du mir mal ein Beispiel geben, wie ich das ggf mit dem DLLStructCreate, DLLStructSetData und _WinAPI_WideCharToMultiByte machen könnte?
    Dankeschön :)

  • MySQL UDF - mit libmySQL.dll (kein ODBC)

    • Taz77
    • 2. Oktober 2012 um 18:49

    gmmg über die console klappt alles wunderbar.

    @progandy
    danke dir das scheint zu funktionien, wobei das ganze jetzt ziemlich umständlich bzw performance lastig ist, wenn ich die daten aus der datenbank hohle und zb. in einem listview packe.
    Bei ca. 20 spalten und min. 500 daten.
    geht das nicht ggf auch anders?
    Mit der sqllite udf geht es ja auch einfach so, ohne das die daten doppelt umgewandelt werden müssen.
    Wenn ich das richtig verstehe wird der string von utf8 nach ansi umgewandelt, oder?

  • MySQL UDF - mit libmySQL.dll (kein ODBC)

    • Taz77
    • 2. Oktober 2012 um 07:53

    Hallo progandy,
    gute Arbeit, aber kann das sein das die MySql Udf von dir kein Unicode Support hat? ;(

    [autoit]


    _MySQL_Set_Character_Set($MySqlId, 'utf8')
    _MySQL_Real_Query($MySqlId, "INSERT INTO `Tabelle` (`Col1`, `Col2`) VALUES ('Unicode Zeichen: ♜' ,'Test')")

    [/autoit]


    Denn in der Tabelle kommt leider auch nur "Unicode: ?" an, und ja die Tabelle und Spalte ist auch mit "utf8_general_ci" deklariert.
    Bin so langsam am verzewifeln.

    Gruß
    Taz77

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™