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

Beiträge von Mars

  • Assembler

    • Mars
    • 14. Dezember 2015 um 18:04

    Da ich meistens ohne AssembleIt programmiere kann ich da keine gute Auskunft geben. Habe dir aber ein kleines Beispiel geschrieben das in deinem Beispielbild via ASM eine Farbe ersetzt. Genutzt wird dafür eine kleine UDF die als Schnittstelle zwischen GDI+ und ASM dient.

    lg
    M

    Dateien

    ImageTool.zip 95,77 kB – 499 Downloads
  • Tastatur gesucht

    • Mars
    • 14. Dezember 2015 um 06:23

    Ich wollte auch schon immer eine mechanische Tastatur haben, allerdings habe ich keine gefunden die mir gefällt und in meinem Preisbereich liegt. Aktuell (seit Anno Tobak, aber sie funktioniert immernoch gut) habe ich die Logitech G110 (normale Tastatur).
    - RGB Beleuchtung (frei einstellbar) Edit: Ich hab gelogen, es ist nur RB
    - Lautstärke, Mediaplayer Buttons
    - Win-Taste deaktivieren
    - 12 programmierbare G Tasten.

    lg
    M

  • Assembler

    • Mars
    • 13. Dezember 2015 um 00:53

    Nur um es mal vorwegzunehmen: elitepvpers ist eine Seite für Personen die ihre Fähigkeiten benutzen um anderen zu schaden (sehr vornehm ausgedrückt). Da ich vermute, dass der Verweis keine Absicht ist, also kann man darüber hinwegsehen. Bitte entferne aber den Link zu diesem Forum, da soetwas gegen unsere Forenregeln verstößt.

    lg
    M

  • Assembler

    • Mars
    • 12. Dezember 2015 um 14:53

    1. Eine <ASM.au3> kenne ich persönlich nicht. Die <FASM.au3> ist ein Include die an vielen Stellen in unterschiedlichen Versionen hochgeladen wurde. Aus dem englischen Forum bekommt man das Original.
    2. FASM.au3 bietet einen Wrapper um mit OP-Codes zu hantieren (es gibt also kein vollständiges Programm, sondern eher einzelne Funktionen die dann in ASM geschrieben sind)
    3. "Hier" kann man die gleichen Assemblerbefehle verwenden wir überall sonst auch. Um die spezielles zu fasm zu finden würde ich einfach deren Webseite benutzen. http://flatassembler.net/

    Ich habe vor geraumer Zeit mal einen wrapper für die FASM.au3 geschrieben. Dadurch wird die Handhabung nochmal ein Stück vereinfacht (meiner Meinung nach).
    AutoIt & ASM

    lg
    M

  • Polizei: Ihr Kind lernt programmieren? Es könnte kriminell sein!

    • Mars
    • 12. Dezember 2015 um 14:45

    Dieses Fehlen von "Unrechtbewusstsein" wie Andy es so schön nennt ist ziemlich oft ein Grund dafür um anderen absichtlich zu schaden. Ich bin (nicht hardcore, sondern nur so zum Spaß) MMORPG Spieler und kenne da so einige Leute die Bots in anderen Spielen haben um Echtgeld zu verdienen (selbstverständlich NUR in anderen Spielen). Das Problem dabei ist, dass diese Leute selbst überhaupt keine Ahnung haben müssen, die ziehen sich den Bot, installieren das Spiel auf allen alten Computern die sie finden, lassen es in 10 Instanzen laufen und haben 50 Bots am start. Das gibt ca. 100-300€ im Monat (nach eigener Aussage einer Person die sowas macht).

    Diese Leute juckt es nicht, dass es durch das verkaufe Spielgeld zu einer Inflation kommt (die jedem auf den Sack geht) oder dass die Bots alle Monster killen die "echte" Spieler für Quests brauchen, oder das irgendwelche Kinder bei ihnen einkaufen. Die haben da keinen Scham, keine Skrupel und vorallem absolut keine Ahnung wie man soetwas programmiert. Das finde ich noch schlimmer, als wenn man selbst der programmierer war, dann hat man wenigstens etwas geleistet.

    Wie wir aus (inzischen) diversen Filmen wissen: Aus großer Kraft folgt große Verantwortung.
    Als guter Programmierer mit viel Ahnung ist man schon fast im Godmode (den ich leider noch lange nicht erreicht habe. Der USB-Bankraub ist mir noch ne nummer zu hoch :D). Man muss eben mit dieser Verantwortung umzugehen wissen.

    M

  • String von Sonderzeichen befreien

    • Mars
    • 26. November 2015 um 20:39

    Sososo, hier gibt es also einen Wettbewerb ?
    Dann schmeiße ich meinen Hut ebenfalls in die Runde. Ist zwar leider langsamer als der RegEx, dafür werden keine "höheren" Stringfunktionen genutzt :)

    AutoIt
    #include <Array.au3>
    
    
    Global $n = 1000
    Global $aResult = [['Bioshade', 0], ['x0r', 0], ['Mars', 0]]
    Global $sString = "a!b'c§d$e%f&g/h(i)j=k?l`m´n'o#p+q*r-s.t,u;v:w_x~y`[z}"
    Global $t
    
    
    ConsoleWrite('Bioshade : ' & _ClearString_Bioshade($sString) & @CRLF & 'x0r      : ' & _ClearString_x0r($sString) & @CRLF & 'Mars     : ' & _ClearString_Mars($sString) & @CRLF)
    
    
    For $i = 0 To $n - 1 Step 1
    
    
    	$t = TimerInit()
    	_ClearString_Bioshade($sString)
    	$aResult[0][1] += TimerDiff($t)
    	$t = TimerInit()
    	_ClearString_x0r($sString)
    	$aResult[1][1] += TimerDiff($t)
    	$t = TimerInit()
    	_ClearString_Mars($sString)
    	$aResult[2][1] += TimerDiff($t)
    
    
    Next
    
    
    $aResult[0][1] = Round($aResult[0][1]/$n, 3) * 1000 & ' µs'
    $aResult[1][1] = Round($aResult[1][1]/$n, 3) * 1000 & ' µs'
    $aResult[2][1] = Round($aResult[2][1]/$n, 3) * 1000 & ' µs'
    _ArrayDisplay($aResult)
    
    
    Func _ClearString_Mars($strWert, $strChars = "-.,:;#+ß'*?=)(/&%$§!~\}][{`´_""")
    	Local Static $aForbidden = BinArray($strChars)
    	Local $sReturn = '', $sMid = ''
    	For $i = 1 To StringLen($strWert) Step 1
    		$sMid = StringMid($strWert, $i, 1)
    		If $aForbidden[Asc($sMid)] Then ContinueLoop
    		$sReturn &= $sMid
    	Next
    	Return $sReturn
    EndFunc
    
    
    Func BinArray($s)
    	Local $a[256]
    	For $i = 1 To StringLen($s) Step 1
    		$a[Asc(StringMid($s, $i, 1))] = 1
    	Next
    	Return $a
    EndFunc
    
    
    Func _ClearString_x0r($strWert)
    	Local $strChars = "-.,:;#+ß'*?=)(/&%$§!~\}][{`´_" & '"'
    	For $i = 1 To StringLen($strChars)
    		$strWert = StringReplace($strWert, StringMid($strChars, $i, 1), "")
    	Next
    	Return $strWert
    EndFunc
    
    
    Func _ClearString_Bioshade($strWert, $strChars = "-.,:;#+ß'*?=)(/&%$§!~\}][{`´_""")
    	$strChars = StringRegExpReplace($strChars, "(.)", "\\$1")
    	$sReturn = StringRegExpReplace($strWert, "[" & $strChars & "]", "")
    	Return StringRegExpReplace($sReturn, "[" & StringRegExpReplace($strChars, "[" & $strChars & "]", "") & "]", "") ;// Fängt Fehlfunktion bei Zeichen ab, die nicht mehr gematched werden, wenn sie escaped werden. BSP: d
    EndFunc
    Alles anzeigen

    lg
    M

  • Wie die Übersicht im Programmcode behalten

    • Mars
    • 26. November 2015 um 18:36

    Ich mache das meistens so:

    - Kleines Skript wächst und wächst. Es wird groß, unübersichtlich, langsam, redundant, usw usw.
    - Überlegen welche Teile des Skripts man zusammenfassen könnte.
    - Diese Teile in eine eigene Datei auslagern und eine UDF daraus machen die als spezialfall das Problem löst welches im Skript vorkommt. (Dadurch wird die UDF relativ flexibel und kann ähnliche Probleme ebenfalls behandeln)
    - Das gleiche gilt rekursiv. Sobald eine UDF mehr als einen Verwendungszweck besitzt sollte sie in mehrere UDFs aufgeteilt werden.
    - Man sollte darauf achten, dass die UDFs möglichst unabhängig voneinander funktionieren und nicht redundant sind. (Schnittmengen mehrerer UDFs lagert man einfach in eine neue UDF aus)
    - Ist alles so strukturiert, und bleiben die Schnittstellen zwischen den Skripten gleich, so kann man einzelne Programmteile verändern/optimieren, ohne das Gesamtwerk zu verändern, oder den Überblick zu verlieren.

    lg
    M

  • einem Wert "$_" vorsetzen, damit man dann mit der Variable rechnen kann.

    • Mars
    • 24. November 2015 um 01:08

    Wie wäre es mit Maps ? (dafür braucht man die Beta)

    AutoIt
    #include <Date.au3>
    
    
    ;~ Global $_datum = '13.10.2012'
    Global $_datum = '24.11.2015'
    
    
    ; Jesus wird mich nicht mehr lieb haben.
    Global $_monat[]
    $_monat['01'] = 1
    $_monat['02'] = 4
    $_monat['03'] = 4
    $_monat['04'] = 0
    $_monat['05'] = 2
    $_monat['06'] = 5
    $_monat['07'] = 0
    $_monat['08'] = 3
    $_monat['09'] = 6
    $_monat['10'] = 1
    $_monat['11'] = 4
    $_monat['12'] = 6
    
    
    ; Tage kann man sowieso nur relativ zum Wochentag bestimmen -> Array !
    Global $_tag = ['sa', 'so', 'mo', 'di', 'mi', 'do', 'fr']
    
    
    Global $_dat_split = StringSplit($_datum, '.', 2)
    
    
    Global $_tageswert = Mod(_DateToDayOfWeekISO($_dat_split[2], $_dat_split[1], $_dat_split[0]) + 1, 7)
    ConsoleWrite('Tageswert: ' & $_tageswert & @CRLF)
    ConsoleWrite('Tag: ' & $_tag[$_tageswert] & @CRLF)
    ConsoleWrite('Monatswert: ' & $_monat[$_dat_split[1]] & @CRLF)
    Alles anzeigen


    lg
    M

  • Rückrechnung

    • Mars
    • 15. November 2015 um 23:38

    Jop. Die einzige Sache bei der man aufpassen muss ist 0x8. Denn 0x8 * 2 = 0x10 und 0x80 * 2 = 0x100, usw. Das geht unserem Kopf der im Dezimalsystem arbeitet manchmal etwas gegen den Strich ;)

  • Rückrechnung

    • Mars
    • 15. November 2015 um 23:32

    Das liegt an der Hexadezimaldarstellung.

    Hex Dez Bin
    0x1 1 000001
    0x2 2 000010
    0x4 4 000100
    0x8 8 001000
    0x10 16 010000
    0x20 32 100000
    usw ... ...


    Dann braucht man nicht so "krumme" große Zahlen :)

  • Rückrechnung

    • Mars
    • 15. November 2015 um 18:10

    Du bist da schon auf dem richtigen Dampfer ;)
    Was du tust ist jedem Bit einen gewissen Sinn zu verleihen. z.B. ist Montag das erste bit, Dienstag das 2te usw. Im Endeffekt sind also alle Zahlen die du benutzt in Binärdarstellung soetwas wie ...00000100000.... Wenn man diese alle Addiert kommt soetwas heraus 001010110101100. Dabei steht jedes Bit für eine Variable. Um diese Bits aus der Zahl wieder zu extrahieren kann man sehr einfach BitAnd benutzen. z.B. um aus 00010010101100 die letzten 7 Stellen (für die 7 Tage) zu bekommen nimmt man einfach BitAnd und die Zahl 127 (1111111b).

    AutoIt
    $taeglich = 0
    $mo = 1
    $di = 2
    $mi = 4
    $do = 8
    $fr = 16
    $sa = 32
    $so = 64
    $woechentlich = 128
      $woechentlich_erste_Woche = 256
      $woechentlich_zweite_Woche = 512
      $woechentlich_dritte_Woche = 1024
      $woechentlich_vierte_Woche = 2048
      $woechentlich_fuenfte_Woche = 4096
      $woechentlich_gerade_Wochen = 8192
      $woechentlich_ungerade_Wochen = 16384
    $monatlich = 32768
      $monatlich_gerade = 65536
      $monatlich_ungerade = 131072
    $viertteljaehrlich = 524288
    $jaehrlich = 1048576
    ; Min & Max Werte
    $taeglich_min = 0
    $taeglich_max = 127
    $woechentlich_min = 128
    $woechentlich_max = 32767
    $monatlich_min = 32768
    $monatlich_max = 524287
    $viertteljaehrlich_min = 524288
    $viertteljaehrlich_max = 1048575
    $jaehrlich_min = 1048576 ; (eigentlich sinnlos, oder? Weil wenn der Wert größer ist als $viertteljaehrlich_max kann es nur $jaehrlich sein. Aber man weiß ja nicht. *blinzeln* )
    $jaehrlich_max = 2097151
    ; Ausgabe 1. Box = 33282 // 2. Box = 35330
    ;~ MsgBox(0,"Terminnummer", "Jeden 2. Di im Monat hat die Nummer: " & ($monatlich + $woechentlich_zweite_Woche + $di) & ".")
    ;~ MsgBox(0,"Terminnummer", "Jeden 2. und 4. Di im Monat hat die Nummer: " & ($monatlich + $woechentlich_zweite_Woche + $woechentlich_vierte_Woche + $di) & ".")
    $Box_1 = 33282 ; bestehend aus: $monatlich + $woechentlich_zweite_Woche + $di
    $Box_2 = 35330 ; Bestehend aus: $monatlich + $woechentlich_zweite_Woche + $woechentlich_vierte_Woche + $di
    
    
    $Box_1 = $viertteljaehrlich + $monatlich + $woechentlich_zweite_Woche + $so
    
    
    ; Um den Tag herauszufinden BitAnd mit 1111111b
    ConsoleWrite('Tag: ' & BitAND($Box_1, 127) & @CRLF)
    
    
    ; Wöchentlich: BitAnd mit 111111110000000b
    ConsoleWrite('Wöchentlich: ' & BitAND($Box_1, 32640) & @CRLF)
    
    
    ; Monatlich: BitAnd mit 111000000000000000b
    ConsoleWrite('Monatlich: ' & BitAND($Box_1, 229376) & @CRLF)
    
    
    ; Jährlich: BitAnd mit 11000000000000000000b
    ConsoleWrite('Jährlich: ' & BitAND($Box_1, 786432) & @CRLF)
    Alles anzeigen

    Edit: Das funktioniert natürlich nicht sooo einfach, wenn man z.B. Mehrere Werde aus einer Sparte gewählt hat. z.B. wenn man Di und So wählt erhält man bei Tag: 66. Diese Zahl muss man dann nach dem gleichen Prinzip wieder auseinandernehmen, wenn man es genau wissen will. 66 = 1000010b. (Da kann man direkt ablesen welche Tage gesetzt sind)

    lg
    M

  • Func Probleme

    • Mars
    • 13. November 2015 um 16:16

    Aaaaaaaaaalso (holen wir mal ganz weit aus).

    1. Includes gehören in die ersten Zeilen des Skripts.
    - Sie können direkt am Anfang nach einem optionalen #Include-Once oder einem #RequireAdmin oder sonstigen Wrapper Anweisungen stehen.
    - Sie können NACH Globalen Variablen stehen

    2. #Include <Skript.au3> Kopiert den kompletten inhalt der Datei Skript.au3 an die Stelle an der #include <Skript.au3> steht.
    - Das heißt, dass Funktionen, sowie Globale Variablen des Includes an diese Stelle kopiert werden.
    - Globale Variablen KÖNNEN in einer Funktion deklariert werden, sollten sie aber nicht.
    - Funktionen können nur außerhalb von Funktionen deklariert werden.

    3. Beispiel

    Hier das Include (ein Skript welches eingebunden werden kann)

    AutoIt: Include.au3
    Global Const $__i_IchBinEineKonstante = 5
    Func GetConst()
    	Return $__i_IchBinEineKonstante
    EndFunc


    Hier das Dazugehörige Skript

    AutoIt: Skript.au3
    #include 'Include.au3'
    
    
    MeineFunktion(GetConst())
    
    
    Func MeineFunktion($sString)
    	ConsoleWrite($sString & @CRLF)
    EndFunc


    Bei der Ausführung wird daraus folgendes:

    AutoIt: Zusammengesetzt
    Global Const $__i_IchBinEineKonstante = 5
    
    
    Func GetConst()
    	Return $__i_IchBinEineKonstante
    EndFunc
    
    
    MeineFunktion(GetConst())
    
    
    Func MeineFunktion($sString)
    	ConsoleWrite($sString & @CRLF)
    EndFunc
    Alles anzeigen

    Dieser Programmcode ist problemlos Lauffähig.

    Benutzt man aber folgendes:

    AutoIt: Falsch.au3
    LadeInclude()
    MeineFunktion(GetConst())
    
    
    Func MeineFunktion($sString)
    	ConsoleWrite($sString & @CRLF)
    EndFunc
    
    
    Func LadeInclude()
    	#include 'Include.au3'
    EndFunc
    Alles anzeigen


    So wird beim Ausführen etwas zusammengesetzt was nicht funktionieren kann:

    AutoIt: Falsch2.au3
    LadeInclude()
    MeineFunktion(GetConst())
    
    
    Func MeineFunktion($sString)
    	ConsoleWrite($sString & @CRLF)
    EndFunc
    
    
    Func LadeInclude()
    	Global Const $__i_IchBinEineKonstante = 5
    
    
    	Func GetConst()
    		Return $__i_IchBinEineKonstante
    	EndFunc
    EndFunc
    Alles anzeigen

    Im falsch zusammengesetzen Skript wird eine Funktion in einer Funktion deklariert, deshalb gibt es einen Fehler. Die Globale Konstante kann man natürlich da lassen wo sie ist, dieses Vorgehen ist grob fahrlässig und verursacht (je nach Arrangement und Einstellungen) eine Interpreterwarnung, aber das Skript ansich wird damit laufen

    Also merken: Includes gehören an den ANFANG Des skripts. Es gibt soetwas wie optionale Includes nicht, da logischerweise alles, auch wenn es nur eventuell gebraucht wird im Programm eingebunden sein muss.

    So einen langen Beitrag schreibe ich selten, lies ihn solange durch bis du ihn verstanden hast.

    lg
    M

  • Protection? Mausklicks funktionieren nicht

    • Mars
    • 6. November 2015 um 03:05

    Also "Programme" die auf Flash-Basis arbeiten kenne ich keine. Da gibt es höchstens Spiele die eine kleine Flash-Umgebung in einem Fenster platzieren, oder Flashgames im sog. Internetz (also im Browser).

    Ich gehe mal davon aus, dass du genauer sagen kannst was du automatisieren willst.

  • Schlimmer Fehler - Programm friert sporadisch nach gewisser Zeit ein - Timer in While-Schleife

    • Mars
    • 16. Oktober 2015 um 16:12

    Hat die Konsole nicht einen Überlaufschutz ?
    Dachte die Arbeitet ab einere gewissen Größe nach dem First in First out Prinzip. (Habe es aber jetzt nicht getestet, dafür müsste ich ja Stundenlang die Konsole vollschreiben lassen :D)

    - Zum Arbeitsspeicher: AutoIt kann maximal 4GB (früher mal 2) adressieren. Dein Error tritt auf, sobald diese erreicht sind.
    - Ini-Funktionen haben ein eingebautes FileOpen und FileClose, genauso wie die FileRead Funktionen. Wenn man überall ohne Handles arbeitet läuft da nichts über. (Jedenfalls meine Erfahrung dazu)
    - Wenn das Skript so viel Speicher braucht wird an irgendeiner Stelle RAM reserviert und nicht wieder freigegeben.
    - Falls du Maps und Arrays kombiniert nutzt wirst du das ändern müssen, da hier ein Memoryleak in AutoIt vorliegt.
    - Handles die nicht freigegeben werden verbrauchen etwas Speicher.
    - Extrem große Arrays (vllt zu Anfang klein und durch ArrayAdd über lange zeit sehr groß).

    Hier kannst du mal ausprobieren wie voll du das RAM bekommst bis der Fehler auftritt. Benutzt wird ein Großes Array mit String einträgen. Bei mir sind die 4GB in einigen Sekunden erreicht und das Skript stürtz ab. Benutzung auf eigene Gefahr, je nach Windowseinstellungen und vorhandenem RAM versucht er Daten auf die Festplatte auszulagern, was ohne SSD ekelhaft werden kann. Das soll nur ein Beispiel sein, wenn der String länger (und nicht immer gleich ist) verbraucht AutoIt wesentlich mehr RAM, so kann man die 4GB auch mit wesentlich kürzeren Arrays erreichen.

    AutoIt
    #include <WinAPIProc.au3>
    
    
    HotKeySet('{ESC}', 'X')
    
    
    Global $iTimer = TimerInit(), $aArray[2^24], $i = 0, $r
    
    
    While True
    	For $o = 0 To 2^10 Step 1 ; in 1024er Schritten
    		$aArray[$i+$o] = 'Hier könnte Ihr Text stehen. Oder auch nicht, denn dieser Text ist nicht Ihr Text, sofern dieser Text nicht Ihr Text ist.' & _
    		'Hier könnte Ihr Text stehen. Oder auch nicht, denn dieser Text ist nicht Ihr Text, sofern dieser Text nicht Ihr Text ist.' & _
    		'Hier könnte Ihr Text stehen. Oder auch nicht, denn dieser Text ist nicht Ihr Text, sofern dieser Text nicht Ihr Text ist.'
    	Next
    	$i += 2^10
    	If $i + 2^10 >= UBound($aArray) Then Exit
    	If TimerDiff($iTimer) > 250 Then
    		$r = _WinAPI_GetProcessMemoryInfo(@AutoItPID)[9]
    		ToolTip('Index: ' & Format($i, True) & @CRLF & 'RAM: ' & Format($r) & @CRLF & 'RAM/Index: ' & Format($r/$i))
    		$iTimer = TimerInit()
    	EndIf
    WEnd
    
    
    Func Format($i, $b = False)
    	Return $b ? $i > 10^6 ? (Round($i/10^6, 2) & 'M') : $i > 10^3 ? (Round($i/10^3, 2) & 'K') : Round($i, 0) : $i > 2^20 ? (Round($i/2^20, 2) & 'MB') : $i > 2^10 ? (Round($i/2^10, 2) & 'KB') : (Round($i, 0) & 'B')
    EndFunc
    
    
    Func X()
    	Exit
    EndFunc
    Alles anzeigen

    lg
    M

  • SendMessage oder PostMessage linksklick ohne Winfokus zu verlieren

    • Mars
    • 16. Oktober 2015 um 13:21

    Möchtest du uns erklären, wie du es angestellt hast ?
    Falls diese Frage nochmal auftaucht kann man auf diesen Thread verweisen.

    lg
    M

  • SendMessage oder PostMessage linksklick ohne Winfokus zu verlieren

    • Mars
    • 16. Oktober 2015 um 07:33

    Es geht hier also um ein Fenster, welches im Hintergrund mit klicks versorgt werden soll. Da gibt es leider ein paar Schwierigkeiten, z.B. unterstützt Windows nicht ohne weiteres mehrere voneinander unabhängige Mauszeiger. Du kannst also keinen Mauszeiger im Hintergrund agieren lassen und den anderen im Vordergrund benutzen.

    Tastatureingaben lassen sich ohne Fokus aber versenden, also schau ob du das Fenster damit steuern kannst.

    lg
    M

  • Funktionspointer in Maps?

    • Mars
    • 15. Oktober 2015 um 22:08

    Als jemand der viel mit Maps herumbastelt ist mir das auch schon mehrfach untergekommen (man neigt irgendwie immer wieder dazu Maps für soetwas zu missbrauchen).

    Es ist ein Bug in AutoIt UND im AU3Check der verhindert, dass es läuft.
    - Den in AutoIt kann man mit Klammern umgehen. (Klammern wandeln den Inhalt in einen Ausdruck (der dann neu interpretiert wird) um. Das ist äquivalent zu einer lokalen Variable in der man das Ergebnis der Klammer zwischenspeichert).
    - Den im AU3Check leider nicht. Dafür muss man ihn komplett abschalten.

    AutoIt
    #AutoIt3Wrapper_Run_AU3Check=n
    
    
    Global $Toast[]
    $Toast.foobar = foobar
    
    
    ; Mit klammern und ohne AU3Check gehts.
    ($Toast.foobar)("lol")
    
    
    Func foobar($s = 'default')
    	MsgBox(0,0,$s)
    EndFunc
    Alles anzeigen

    Edit: Bei der Mentalität der Entwickler könnte es auch ein Feature sein, man weiß es nicht so genau.

    Edit2: Speichere niemals Maps in Arrays. Hier hat AutoIt ein Memoryleak. https://www.autoitscript.com/trac/autoit/ticket/2915

    lg
    M

  • SB-Zitate #7 (2014)

    • Mars
    • 9. Oktober 2015 um 15:00

    Sehr schöne Angelegenheit. Prädikat: Wertvoll :thumbup:

  • Prüfen, ob ein Fenster offen ist, ohne goto

    • Mars
    • 8. Oktober 2015 um 12:13

    Hier gibt es keine If-Schleifen und kein goto. Ansonsten aber alles was das Herz begehrt.

  • If ElseIf

    • Mars
    • 7. Oktober 2015 um 12:53

    Noch weitere Hinweise:

    • Mit Arrays sparst du eine Menge Quellcode
    • Im Code sollten Controls auch in der Reihenfolge erstellt werden, in der sie später auftauchen. (Vorallem wenn sie schön untereinander sortiert sind, im Code herrschen aber Kraut und Rüben)
    • Mit Arrays werden schwierige Sachen einfach (z.B. Alle Ctrls außer das aktuell benutze zu Aktivieren/Deaktivieren)
    • Innerhalb von Funktionen werden LOKALE Variablen benutzt, keine Globalen
    • Eine Einzige Eventfunktion reicht aus um das Fenster zu verwalten. Außerdem behält man so den Überblick...

    Aus Langeweile habe ich etwas herumgebastelt und von deinen Millionen Zeilen Quellcode nur noch eine Hand voll übrig...
    Sowas ist kein Standardservice^^

    AutoIt
    #include <GUIConstants.au3>
    #include <WinAPIShPath.au3>
    
    
    Opt('GUIOnEventMode', 1)
    
    
    Global Const $aStr[] = ['Umbenennungs-Tool für Doku´s', _ ; Titel
    	'', 'Objekt-Nr.:', '', 'Jahr:', _ ; Obere Zeile
    	'Frühjahrswartung', 'Herbstwartung', 'Inspektion', 'Jahreswartung', '', 'ergänzte Version', _ ; Linke Spalte
    	'DDC', 'EAB', 'Elektro', 'GLT', 'Heizung', 'Hygiene', 'Kälte', 'KKL', 'Klima', 'MSR', 'RLT', 'Sanitär', 'TWA', 'WVA', _ ; Rechte Spalte
    	'Datei öffnen', 'Umbenennen'] ; Buttons
    
    
    Global $aFiles = 0 ; Erstmal nicht als Array initialisiert.
    
    
    Global $hGUI = GUICreate($aStr[0], 325, 400) ; Runde zahlen sind sinnvoller -> besserer Überblick
    Global $hInput1 = GUICtrlCreateInput($aStr[1], 75, 20, 125, 20)
    GUICtrlCreateLabel($aStr[2], 15, 24, 55, 17, 2) ; Label die niemals gelesen oder beschrieben werden müssen keine Variablen belegen.
    Global $hInput2 = GUICtrlCreateInput($aStr[3], 75, 50, 125, 20)
    GUICtrlCreateLabel($aStr[4], 15, 54, 55, 17, 2)
    
    
    Global $aCheckLeft[6] ; über 'ergänzte Version' ist ein Platz frei.
    For $i = 0 To UBound($aCheckLeft) - 1 Step 1
    	If $i = 4 Then ContinueLoop
    	$aCheckLeft[$i] = GUICtrlCreateCheckbox($aStr[5 + $i], 75, 90 + $i * 25)
    	GUICtrlSetOnEvent($aCheckLeft[$i], 'EVENT')
    Next
    
    
    Global $aCheckRight[14] ; rechte Seite
    For $i = 0 To UBound($aCheckRight) - 1 Step 1
    	$aCheckRight[$i] = GUICtrlCreateCheckbox($aStr[11 + $i], 225, 16 + $i * 25)
    	GUICtrlSetOnEvent($aCheckRight[$i], 'EVENT')
    Next
    
    
    Global $hBtn1 = GUICtrlCreateButton($aStr[25], 75, 275, 80, 25)
    Global $hBtn2 = GUICtrlCreateButton($aStr[26], 75, 305, 80, 25)
    GUICtrlSetOnEvent($hBtn1, 'EVENT')
    GUICtrlSetOnEvent($hBtn2, 'EVENT')
    GUICtrlSetState($hBtn2, $GUI_DISABLE)
    
    
    GUISetOnEvent(-3, 'EVENT', $hGUI)
    GUISetState()
    
    
    While Sleep(10)
    WEnd
    
    
    Func EVENT()
    	Local $iCtrl = @GUI_CtrlId ; Damit wir das Makro nicht überbeanspruchen...
    	Switch $iCtrl
    		Case $GUI_EVENT_CLOSE
    			Exit
    		Case 7 To 10 ; Das sind die Checkboxen auf der linken Seite
    			Local $bCheck = GUICtrlRead($iCtrl) = $GUI_CHECKED ; Bitte innerhalb von Funktionen Lokale Variablen verwenden.
    			For $i = 7 To 10 Step 1
    				If $i <> $iCtrl Then GUICtrlSetState($aCheckLeft[$i - 7], $bCheck ? $GUI_DISABLE : $GUI_ENABLE)
    			Next
    		Case 11 ; Das ist die Checkbock in der 'ergänzte Version' steht.
    		Case 12 To 25 ; Checkboxen auf der rechten Seite.
    			Local $bCheck = GUICtrlRead($iCtrl) = $GUI_CHECKED
    			For $i = 12 To 25 Step 1
    				If $i <> $iCtrl Then GUICtrlSetState($aCheckRight[$i - 12], $bCheck ? $GUI_DISABLE : $GUI_ENABLE)
    			Next
    		Case 26 ; Öffnen Button
    			Local $sPath = FileOpenDialog('Wähle eine Datei aus!', @StartupDir, '(*.xlsx;*.xls;*.xlsm;*.pdf)', 1 + 2)
    			If @error Then Return ; Falls keine Auswahl getroffen wurde.
    			Local $aSplit = StringSplit($sPath, '|', 2) ; Multiselect ist ausgeschaltet, also braucht man hier nichts ändern...
    			$aFiles = $aSplit ; $aFiles enthält jetzt eine Liste mit Dateien. (nur eine einzige Datei)
    			GUICtrlSetState($hBtn2, FileExists($aFiles[0]) ? $GUI_ENABLE : $GUI_DISABLE)
    		Case 27 ; Umbenennen Button
    			Local $sObjNr = GUICtrlRead($hInput1)
    			Local $sJahr = GUICtrlRead($hInput2)
    			If Not $sObjNr Or Not $sJahr Or Not IsArray($aFiles) Then Return ; Falls die Felder nicht ausgefüllt sind
    			Local $bErgaenzt = GUICtrlRead($aCheckLeft[5]) = $GUI_CHECKED, $sLeft = '', $sRight = ''
    			For $i = 0 To 3 Step 1 ; Die linken Checkboxen ansehen
    				If GUICtrlRead($aCheckLeft[$i]) = $GUI_CHECKED Then
    					$sLeft = $aStr[$i + 5]
    					ExitLoop
    				EndIf
    			Next
    			For $i = 0 To 13 Step 1 ; Die rechten Checkboxen ansehen
    				If GUICtrlRead($aCheckRight[$i]) = $GUI_CHECKED Then
    					$sRight = $aStr[$i + 11]
    					ExitLoop
    				EndIf
    			Next
    			Local $sFinal = _WinAPI_PathRemoveFileSpec($aFiles[0]) & '\' & $sObjNr & '_' & $sLeft & '_' & $sRight & '_' & $sJahr & ($bErgaenzt ? ('_' & $aStr[10]) : '') & _WinAPI_PathFindExtension($aFiles[0])
    			ConsoleWrite($sFinal & @CRLF)
    		Case Else
    			ToolTip('EVENT von Ctrl: ' & $iCtrl)
    	EndSwitch
    EndFunc
    Alles anzeigen


    lg
    M

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™