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

Beiträge von Yjuq

  • makeArt | simple ASCII-Art Grafikbibliothek

    • Yjuq
    • 31. Juli 2014 um 23:58
    Code
    [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
    []                                                                  []
    []  []      []  [][][]  []  []  [][][]      [][][]  [][][]  [][][]  []
    []  [][]  [][]  []  []  []  []  []          []  []  []  []    []    []
    []  []  []  []  [][][]  [][]    [][][]      [][][]  [][][]    []    []
    []  []      []  []  []  []  []  []          []  []  [][]      []    []
    []  []      []  []  []  []  []  [][][]      []  []  []  []    []    []
    []                                                                  []
    [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]

    Schönen guten Abend AutoIt Community! :)
    Ich möchte euch meine makeArt UDF vorstellen, mit dieser ist es möglich einfach & schnell ASCII-Art Bilder zu erstellen. Zwar unterstützt diese UDF derzeitig nur die Grundkörper (Punkt, Linie, Kreis, Dreieck und Viereck) aber immerhin lassen sich damit schon ein paar schöne Bilder zaubern.

    Ich wollte mir mal ansehen wie die Grafikbibliotheken arbeiten, dafür habe ich meinen besten Freund Google beansprucht und bin dadurch auf den Begriff „Rasterung“ gestoßen. Das Thema fand ich so interessant, dass ich dies einmal unbedingt programmieren wollte. Jedoch war mir der Teil wo die Bilder auf den Bildschirm ausgegeben werden zu umständlich, daher habe ich mir gedacht ich nehme die einfachste Möglichkeit und arbeite einfach mit Char's. So wurde meine kleine UDF in die Welt gesetzt.

    Zwar ist diese in Ihren Möglichkeiten noch begrenzt, jedoch habe ich vor in naher Zukunft daran weiter zu arbeiten und weitere Funktionen zu schreiben. Sie soll alles können was auch andere große Grafikbibliotheken (wie z.B. GDI oder GDI+) können. Zwar hat dies praktisch gesehen keinen Sinn, bietet mir jedoch eine Möglichkeit mich ein wenig in die Materie einzuarbeiten und zu verstehen wie Grafikbibliotheken Bilder generieren. Zudem bin ich auch auf die abstrakte Idee gekommen ein Spiel mit schöner ASCII Art Grafik zu programmieren, daher hat diese UDF zumindest bei mir auch einen Verwendungszweck. ;D

    Soa, da ich nun viel über meine Motivation geschrieben habe möchte ich euch die UDF auch nicht länger vorenthalten. Feedback und Verbesserungsvorschläge sind gerne gesehen. Die Funktionsbeschreibungen befinden sich in der UDF.

    Spoiler anzeigen
    [autoit]

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    ; [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
    ; [] []
    ; [] [] [] [][][] [] [] [][][] [][][] [][][] [][][] []
    ; [] [][] [][] [] [] [] [] [] [] [] [] [] [] []
    ; [] [] [] [] [][][] [][] [][][] [][][] [][][] [] []
    ; [] [] [] [] [] [] [] [] [] [] [][] [] []
    ; [] [] [] [] [] [] [] [][][] [] [] [] [] [] []
    ; [] []
    ; [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]

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

    ; makeArt_Char
    ; makeArt_Circle
    ; makeArt_Coord
    ; makeArt_Create
    ; makeArt_Line
    ; makeArt_Plane
    ; makeArt_Point
    ; makeArt_Quadrangle
    ; makeArt_Screen
    ; makeArt_Triangle

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    #comments-start | +++ UDF-Beschreibung +++

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

    $makeArt_Screen
    Dies ist eine vorgefertigter Zeichenbereich mit der Größe von 1*1 Elementen.
    Diese Variable kann nach belieben überschrieben und genutzt werden.

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

    makeArt_Char($sChar = Default)
    Mit dieser Funktion können die Standardzeichen geändert werden.

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

    makeArt_Circle(ByRef $asScreen, $nX, $nY, $nR, $vChar = makeArt_Char)
    Zeichnet einen Kreis auf dem Bildschirm $asScreen mit dem Mittelpunkt $nX und $nY und dem Radius $nR.
    Falls $vChar angegeben wird, wird statt dem Standardzeichen mit den angegeben Zeichen der Kreis gezeichnet.

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

    makeArt_Coord(ByRef $asScreen, $nX, $nY, $iFrom = Default, $iMode = $makeArt_Get)
    Verändert den Mittelpunkt und die Achsenausrichtung des Koordinatensystems auf welches gezeichnet wird.
    Alle Koordinaten der Zeichenfunktionen werden relativ vom Mittelpunkt des Koordinatensystems angegeben.
    Mit $nX und $nY kann der mittelpunkt verändert werden. -1 gibt dabei die Mitte der Zeichenbereichs $asScreen an.
    Die Variable $iFrom gibt dabei die Achsenausrichtung des Koordinatensystems an. Dazu sind folgende Konstanten vorgesehen:
    $makeArt_TopLeft :> Die X-Achse zeigt nach Rechts, die Y-Achse zeigt nach Unten
    $makeArt_TopRight :> Die X-Achse zeigt nach Links, die Y-Achse zeigt nach Unten
    $makeArt_BottomLeft :> Die X-Achse zeigt nach Rechts, die Y-Achse zeigt nach Oben
    $makeArt_BottomRight :> Die X-Achse zeigt nach Links, die Y-Achse zeigt nach Oben
    Mit der Variable $iMode kann angegeben werden, ob die Koordinaten ausgegeben oder gesetzt werden sollen. Dazu stehen 2 Konstanten zur Verfügung:
    $makeArt_Get :> Gibt die absoluten Koordinaten aus
    $makeArt_Set :> Setzt den neuen Mittelpunkt des Koordinatensystems

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

    makeArt_Create(ByRef $asScreen)
    Erstellt das gezeichnete Bild und gibt dieses als String zurück.

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

    makeArt_Line(ByRef $asScreen, $nX1, $nY1, $nX2, $nY2, $vChar = makeArt_Char)
    Zeichnet eine Linie auf dem Bildschirm $asScreen von ($nX1 | $nY1) nach ($nX2 | $nY2).
    Falls $vChar angegeben wird, wird statt dem Standardzeichen mit den angegeben Zeichen die Linie gezeichnet.

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

    makeArt_Plane(ByRef $asScreen, $nX, $nY, ByRef $asPlane)
    Zeichnet ein Zeichenbereich $asPlane in ein anderen Zeichenbereich $asScreen an dem Punkt ($nX | $nY) hinein.

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

    makeArt_Point(ByRef $asScreen, $nX, $nY, $vChar = makeArt_Char)
    Zeichnet einen Punkt auf dem Bildschirm $asScreen an dem Punkt ($nX | $nY).

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

    makeArt_Quadrangle(ByRef $asScreen, $nX, $nY, $nWidth, $nHeight, $vChar = makeArt_Char)
    Zeichnet ein Viereck auf dem Bildschirm $asScreen an dem Punkt ($nX | $nY) mit der Breite $nWidth und der Höhe $nHeight.
    Falls $vChar angegeben wird, wird statt dem Standardzeichen mit den angegeben Zeichen das Viereck gezeichnet.

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

    makeArt_Screen($iWidth, $iHeight, $sChar = ' ')
    Erstellt einen Zeichenbereich mit der Breite $iWidth und der Höhe $iHeight.
    Falls $sChar angegeben wird dieser mit den Zeichen gefüllt.

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

    makeArt_Triangle(ByRef $asScreen, $nX1, $nY1, $nX2, $nY2, $nX3, $nY3, $vChar = makeArt_Char)
    Zeichnet ein Dreieck auf dem Bildschirm $asScreen mit den drei Eckpunkten ($nX1 | $nY1), ($nX2 | $nY2) und ($nX3 | $nY3).
    Falls $vChar angegeben wird, wird statt dem Standardzeichen mit den angegeben Zeichen das Dreieck gezeichnet.

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

    #comments-end

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Global $makeArt_Screen = makeArt_Screen(1, 1)
    Global Enum $makeArt_TopLeft, $makeArt_TopRight, $makeArt_BottomLeft, $makeArt_BottomRight, $makeArt_Get, $makeArt_Set

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

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

    Func makeArt_Char($sChar = Default)
    Local Static $makeArt_Char = '+'
    $makeArt_Char = (($sChar <> Default) ? ($sChar) : ($makeArt_Char))
    Return $makeArt_Char
    EndFunc

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

    Func makeArt_Circle(ByRef $asScreen, $nX, $nY, $nR, $vChar = makeArt_Char)
    Local Static $fArc = ATan(1) * 4 / 180
    Local $i

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

    For $i = 0 To 360
    makeArt_Point($asScreen, Sin($i / $fArc) * $nR + $nX, Cos($i / $fArc) * $nR + $nY, ((IsFunc($vChar) ? ($vChar()) : ($vChar))))
    Next
    EndFunc

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

    Func makeArt_Coord(ByRef $asScreen, $nX, $nY, $iFrom = Default, $iMode = $makeArt_Get)
    Local Static $makeArt_nX, $makeArt_nY, $makeArt_iFrom = $makeArt_TopLeft
    Local $aiCoord[2]

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

    Switch $iMode
    Case $makeArt_Get
    If $iFrom = Default Then $iFrom = $makeArt_iFrom
    $aiCoord[0] = ($iFrom = $makeArt_TopRight Or $iFrom = $makeArt_BottomRight) ? (UBound($asScreen, 1) - Round($nX + (($makeArt_nX = -1) ? ((UBound($asScreen, 1) -1) / 2) : ($makeArt_nX))) -1) : (Round($nX + (($makeArt_nX = -1) ? ((UBound($asScreen, 1) -1) / 2) : ($makeArt_nX))))
    $aiCoord[1] = ($iFrom = $makeArt_BottomLeft Or $iFrom = $makeArt_BottomRight) ? (UBound($asScreen, 2) - Round($nY + (($makeArt_nY = -1) ? ((UBound($asScreen, 2) -1) / 2) : ($makeArt_nY))) -1) : (Round($nY + (($makeArt_nY = -1) ? ((UBound($asScreen, 2) -1) / 2) : ($makeArt_nY))))
    Return $aiCoord
    Case $makeArt_Set
    $makeArt_nX = $nX
    $makeArt_nY = $nY
    $makeArt_iFrom = $iFrom
    EndSwitch
    EndFunc

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

    Func makeArt_Create(ByRef $asScreen)
    Local $i, $n, $sRet

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

    For $n = 0 To UBound($asScreen, 2) -1
    For $i = 0 To UBound($asScreen, 1) -1
    $sRet &= $asScreen[$i][$n]
    Next
    $sRet &= @CRLF
    Next

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

    Return StringTrimRight($sRet, 1)
    EndFunc

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

    Func makeArt_Line(ByRef $asScreen, $nX1, $nY1, $nX2, $nY2, $vChar = makeArt_Char)
    Local $b = (Abs($nX2 - $nX1) > Abs($nY2 - $nY1))
    Local $iS = (($b) ? ((($nX2 - $nX1) < 0) ? (-1) : (1)) : ((($nY2 - $nY1) < 0) ? (-1) : (1)))
    Local $nM = $iS * (($b) ? (($nY2 - $nY1) / ($nX2 - $nX1)) : (($nX2 - $nX1) / ($nY2 - $nY1)))
    Local $nY = (($b) ? ($nY1) : ($nX1))
    Local $nX

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

    For $nX = (($b) ? ($nX1) : ($nY1)) To (($b) ? ($nX2) : ($nY2)) Step $iS
    makeArt_Point($asScreen, (($b) ? ($nX) : ($nY)), (($b) ? ($nY) : ($nX)), ((IsFunc($vChar) ? ($vChar()) : ($vChar))))
    $nY += $nM
    Next
    EndFunc

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

    Func makeArt_Plane(ByRef $asScreen, $nX, $nY, ByRef $asPlane)
    Local $i, $n

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

    For $i = 0 To UBound($asPlane, 1) -1
    For $n = 0 To UBound($asPlane, 1) -1
    makeArt_Point($asScreen, $i + $nX, $n + $nY, $asPlane[$i][$n])
    Next
    Next
    EndFunc

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

    Func makeArt_Point(ByRef $asScreen, $nX, $nY, $vChar = makeArt_Char)
    Local $aiCoord = makeArt_Coord($asScreen, $nX, $nY)
    $asScreen[$aiCoord[0]][$aiCoord[1]] = ((IsFunc($vChar) ? ($vChar()) : ($vChar)))
    EndFunc

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

    Func makeArt_Quadrangle(ByRef $asScreen, $nX, $nY, $nWidth, $nHeight, $vChar = makeArt_Char)
    Local $nX2 = $nX + $nWidth
    Local $nY2 = $nY + $nHeight
    makeArt_Line($asScreen, $nX, $nY, $nX2, $nY, ((IsFunc($vChar) ? ($vChar()) : ($vChar))))
    makeArt_Line($asScreen, $nX2, $nY, $nX2, $nY2, ((IsFunc($vChar) ? ($vChar()) : ($vChar))))
    makeArt_Line($asScreen, $nX2, $nY2, $nX, $nY2, ((IsFunc($vChar) ? ($vChar()) : ($vChar))))
    makeArt_Line($asScreen, $nX, $nY2, $nX, $nY, ((IsFunc($vChar) ? ($vChar()) : ($vChar))))
    EndFunc

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

    Func makeArt_Screen($iWidth, $iHeight, $sChar = ' ')
    Local $asScreen[$iWidth +1][$iHeight +1], $i, $n

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

    For $i = 0 To $iWidth
    For $n = 0 To $iHeight
    $asScreen[$i][$n] = $sChar
    Next
    Next

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

    Return $asScreen
    EndFunc

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

    Func makeArt_Triangle(ByRef $asScreen, $nX1, $nY1, $nX2, $nY2, $nX3, $nY3, $vChar = makeArt_Char)
    makeArt_Line($asScreen, $nX1, $nY1, $nX2, $nY2, ((IsFunc($vChar) ? ($vChar()) : ($vChar))))
    makeArt_Line($asScreen, $nX2, $nY2, $nX3, $nY3, ((IsFunc($vChar) ? ($vChar()) : ($vChar))))
    makeArt_Line($asScreen, $nX3, $nY3, $nX1, $nY1, ((IsFunc($vChar) ? ($vChar()) : ($vChar))))
    EndFunc

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

    ; ++++++++++ +++++++++ ++++++++ +++++++ ++++++ +++++ ++++ +++ ++ +

    [/autoit]

    Dazu auch einen kleinen Beispielcode:

    Spoiler anzeigen
    [autoit]

    #include "makeArt.au3"

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

    makeArt_Coord($makeArt_Screen, -1, -1, $makeArt_TopLeft, $makeArt_Set)
    makeArt_Char('**')
    $makeArt_Screen = makeArt_Screen(20, 20, ' ')

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

    makeArt_Point($makeArt_Screen, 0, 0, '++')
    makeArt_Circle($makeArt_Screen, 0, 0, 5)
    makeArt_Quadrangle($makeArt_Screen, -10, -10, 20, 20, '##')

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

    ConsoleWrite(makeArt_Create($makeArt_Screen))

    [/autoit]

    Ich wünsche viel Spaß! :P

  • Einfacher Vokabeltrainer

    • Yjuq
    • 1. Juni 2014 um 12:18

    Hey, danke für deine Mühe!
    Zwar musste ich noch ein paar Sachen korrigieren, hat jedoch nicht ganz so viel Zeit in Anspruch genommen.
    Du hast was gut bei mir :)

  • Einfacher Vokabeltrainer

    • Yjuq
    • 30. Mai 2014 um 20:14

    Schönen guten Abend :)

    Ich bin ja ein Mensch der nicht gerne seine Arbeit auf anderen ablegt, aber in diesem Fall habe ich extrem wenig Zeit. Ich schreibe noch 3 Klassenarbeiten die alle relativ gut ausfallen müssen. Darunter ist selbstverständlich auch mein Lieblingsfach Englisch. Da ich ja besonders gut in Englisch bin, brauche ich nun jemanden der mir einen Vokabel Trainer schreibt. Ich habe nämlich festgestellt dass ich am schnellsten und effektivsten am Computer lerne. Ich hatte mir bereits ein Vokabeltrainer auf meine speziellen Wünsche geschrieben, jedoch ist leider mein USB Stick ins Klos gefallen. (Okey, klingt jetzt wie eine schlechte Ausrede, aber die Geschichte erzähle ich mal wenn ich genug Zeit habe.) Nun brauche ich also jemanden, der mir bis Morgen Abend noch schnell was schreibt. Die Arbeit ist schon bereits am Montag und ich stehe ein wenig unter Zeitdruck. Wenn jemand Lust dazu hat, kann er/sie mir gerne zur Hand gehen. Hier meine Anforderungen:

    Das Interface kann ruhig so einfach wie möglich gestalten sein. Wichtig ist nur dass 24 Vokabeln gleichzeitig angezeigt werden. (Eine Spalte für die Englischen ud eine Spalte für die Deutschen Vokabeln.) Dabei sollen lediglich stetig die deutschen Vokabeln angezeigt werden und die englischen Vokabeln ergänzt werden. Die Vokabeln liegen bereits schon passend in einer Datei vor. In jeder Datei sind jeweils 24 Vokabeln sodass dort nicht extra welche per Zufallsprinzip herausgefischt werden müssen.Ich brauche demnach noch eine Ladefunktion für die Dateien. Der Aufbau der Datei ist immer die gleiche, erst kommt der englische Vokabel, dann ein [TAB] Zeichen und dann der deutsche Vokabel. Danach folgt ein Enter und neue Vokabeln folgen. Zum Schluss sollten die Vokabeln überprüft werden können. Alle falschen Vokabeln sollten mir angezeigt werden (z.B. durch farbliche Hervorhebung) und erneut abgefragt werden. Und das halt solange bis ich sie richtig schreibe.

    Ich hoffe dass reicht an Informationen. Mehr brauch ich nicht. Ich hatte zwar schon hier im Forum geschaut nach Vokabeltrainern, jedoch konnte keiner meiner Ansprüche genügen. Zudem wollte ich nicht auf Softwaren zugreifen, die im Internet herumschwirren. Es ist so, dass ich schonmal gerne ein wenig im Quellcode herumspiele und schonmal das eine oder andere bei genug Zeit hinzufüge. Mein leider vernichteter Vokabeltrainer, trainierte mit mir noch unregelmäßige Werben, Grammatik und zeigte mir Sätze an die einen Fehler (Rechtschreibfehler oder Grammatikfehler) enthalten. Ich hab einfach die Möglichkeit weitere Features hinzuzufügen welche mir das Lernen vereinfachen sollen.

    Ich hoffe es findes sich jemand der mir das macht, würde es ja selber machen, habe aber weder die Zeit und die Nerven. Ich bin nämlich auch ein wenig mit meinen Programmierfähigkeiten eingerostet und es könnte für mich einfach viel zu viel Zeit in Anspruch nehmen die ich auch mit Lernen verbringen könnte.
    LG. Make :)

  • "Warben-Felder" in 2D Array umrechnen

    • Yjuq
    • 25. März 2014 um 23:54

    Ich konnte das Problem ein wenig anders lösen.
    Ein 2 Dimensionales Array lässt sich ja in ein 1 Dimensionales Array umrechnen.
    Wenn ich nun von einer Wabe aus nach...

    Spoiler anzeigen

    [Blockierte Grafik: http://www7.pic-upload.de/25.03.14/zgezo2is19m.gif]

    ... links bewege, verändert sich die Position um -1.
    ... links oben bewege, verändert sich die Position um -6.
    ... rechts oben bewege, verändert sich die Position um -5.
    ... rechts bewege, verändert sich die Position um +1.
    ... rechts unten bewege, verändert sich die Position um +5.
    ... links unten bewege, verändert sich die Position um +4.

    Dabei bin ich immer von der roten Wabe ausgegangen.
    Danach wird die Position (die ich im Eindimensionalen Raum berechnet habe) in eine Koordinate umgerechnet.
    So kann ich die Werte im Array abspeichern. Zudem habe ich das auch direkt dynamisch gehalten.

    Hier der Code:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Dim $aiField[5][5]
    $aiField[2][2] = 1

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

    _MovePlayer($aiField, Random(1, 6, 1))
    _ArrayDisplay($aiField)

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

    Func _MovePlayer(ByRef $aiField, $iMove)
    Local $iPos = _GetPlayer($aiField)
    Local $x = Floor($iPos / UBound($aiField)), $y = Mod($iPos, UBound($aiField))
    Switch $iMove
    Case 1
    $iPos -= 1
    Case 2
    $iPos -= UBound($aiField) +1
    Case 3
    $iPos -= UBound($aiField)
    Case 4
    $iPos += 1
    Case 5
    $iPos += UBound($aiField) -1
    Case 6
    $iPos += UBound($aiField)
    EndSwitch
    $aiField[$x][$y] = 0
    $x = Floor($iPos / UBound($aiField))
    $y = Mod($iPos, UBound($aiField))
    $aiField[$x][$y] = 1
    EndFunc

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

    Func _GetPlayer(ByRef $aiField)
    Local $i, $n
    For $i = 0 To UBound($aiField) -1
    For $n = 0 To UBound($aiField, 2) -1
    If $aiField[$i][$n] Then Return UBound($aiField) * $i + $n
    Next
    Next
    EndFunc

    [/autoit]
  • "Warben-Felder" in 2D Array umrechnen

    • Yjuq
    • 25. März 2014 um 18:10

    Hallo Community!
    Ich habe mal wieder ein Problem bei dem ich nicht weiterkomme. :)

    Folgendes:
    Ich habe ein etwas ungewöhnlicheres Spielfeld. Dieses Spielfeld besteht aus einzelnen Sechsecken die wie Waben aneinander geordnet sind. Hier einmal so ein Spielfeld als ASCII-Art:

    Code
    _       _       _
    / A \ _ / L \ _ / V \
    \ _ / F \ _ / Q \ _ /
    / B \ _ / M \ _ / W \
    \ _ / G \ _ / R \ _ /
    / C \ _ / N \ _ / X \
    \ _ / H \ _ / S \ _ /
    / D \ _ / O \ _ / Y \
    \ _ / I \ _ / T \ _ /
    / E \ _ / P \ _ / Z \
    \ _ / K \ _ / U \ _ /
        \ _ /   \ _ /
    Alles anzeigen


    Dazu habe ich ein 2 Dimensionales Array deklariert welches 7x7 Elemente besitzt. In diesem Array sind die Spielfeld Eigenschaften dokumentiert. Um es für mein Problem einfach zu halten gibt es nur 3 möglichen Zustände.
    „-1“ steht dabei für ein Feld welches nicht begehbar ist. (Im ASCII-Art einfach Weggelassen)
    „0“ steht für ein Feld welches begehbar ist.
    „1“ steht für ein Feld auf welches eine Figur steht.

    Dazu folgende Deklaration:

    [autoit]

    Global $aField[7][7] = [[-1, -1, -1, -1, -1, -1, -1], _
    [-1, 0, 0, 0, 0, 0, -1], _
    [-1, 0, 0, 0, 0, 0, -1], _
    [-1, 0, 0, 1, 0, 0, -1], _
    [-1, 0, 0, 0, 0, 0, -1], _
    [-1, 0, 0, 0, 0, 0, -1], _
    [-1, -1, -1, -1, -1, -1, -1]]

    [/autoit]

    Mein Problem:
    Wegen der ungewöhnlichen Spielfeldform (mit 6 benachbarten Felder) ist es etwas schwierig das 2D Array so zu verändern dass es der Beschaffenheit meines Spielfeldes entspricht. Heißt im Klartext, wenn ich meine Figur (die auf Feld N steht) nach rechts oben (auf das Feld R) ziehe, welche Werte muss ich dann im Array ändern? Von der Logik her wäre der Index [3][3] das Feld N und der Index [2][4] das Feld R. Leider lässt sich das so nicht auf alle Felder übertragen. Wenn ich von dem Feld G nach M ziehe, dann wechsle ich im Array von [2][2] auf [2][3]. Ich hoffe es ist so verständlich wie ich das meine, das Bewegen meiner Figur hat kein strukturiertes Muster im 2D Array. Zumindest ist mir keines bisher aufgefallen.

    Ich habe den Index zu einem Feld folgendermaßen ermittelt:
    Bei meinem Spielfeld habe ich von oben links angefangen zu zählen (A, F, L, Q, V = 5 |+ B, G, M, R, W = 10 |+ C, G, N = 13)
    Dann habe ich bei den „0“ markierten Feldern angefangen zu zählen von links oben und bin so zur Mitte gekommen.
    So habe ich bisher alle Warben-Felder in das 2D Array übertragen.
    Aber wie mache ich das meinem Programm klar?

    Ich könnte da einige Denkansätze gebrauchen.
    Die Schwierigkeit ist dabei, dass das Feld unterschiedlich groß sein kann.
    Die Map soll später nämlich zufällig generiert werden.

    Falls ich mich zu unklar ausgedrückt haben sollte, dann tut es mir sehr leid...
    Besser kann ich’s nicht erklären. ^^

    LG. Make =)

  • Problem mit IF

    • Yjuq
    • 3. März 2014 um 16:35
    [autoit]

    BitAND(BitXOR($Mahnstufe_schon_gesetzt <> 1, $Mahnstufe_schon_gesetzt = 0), BitXOR($Klassenrechnung <> 1, $AG_Rechnung <> "X"))

    [/autoit]
  • Zufallskopierer für MP3

    • Yjuq
    • 3. März 2014 um 05:49

    Erst einmal wäre es sinnvoll zu erwähnen was für Fehler auftauchen...
    Aber beim ersten Start musste ich feststellen, dass noch die alten Funktionsnamen für AdlibRegister und AdlibUnRegister verwerdet werden:

    Spoiler anzeigen
    [autoit]

    ; =============================================================
    ;
    ; Zufallskopierer für Musiktracks in MP3
    ;
    ; Idee: Chicago
    ;
    ; Author: GtaSpider
    ;
    ; =============================================================

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

    #include <file.au3>
    #include <array.au3>
    #include <GUIConstants.au3>
    Opt("GuiOnEventMode", 1)

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

    Global $hwndSpl, $SplNext = 1, $SplText, $FileList, $size = 0
    Global $ListTxt = @ScriptDir & "\List.txt"
    Global $ListTxtOp = FileOpen($ListTxt, 1)
    Global $FilesToCopy[1]

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

    $maingui = GUICreate("MP3-Zufallskopierer", 200, 200, 193, 125)
    ;GUISetOnEvent($GUI_EVENT_CLOSE, "_exit";) ;Da GuigetMsg() nicht mehr funktinoiert, da OnEventMode 1 ist
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    $MusicInp = GUICtrlCreateInput("", 8, 24, 121, 21)
    GUICtrlCreateLabel("Musik Ordner:", 8, 8, 68, 15)
    $TargetInp = GUICtrlCreateInput("", 8, 64, 121, 21)
    GUICtrlCreateLabel("Ziel Ordner:", 8, 48, 68, 15)
    $ChooseBut1 = GUICtrlCreateButton("..", 129, 24, 27, 21, 0)
    GUICtrlSetOnEvent(-1, "_search_path")
    $ChooseBut2 = GUICtrlCreateButton("..", 129, 64, 27, 21, 0)
    GUICtrlSetOnEvent(-1, "_search_path")
    GUICtrlCreateLabel("Größe in mb:", 8, 90, 68, 15)
    $GroesseInp = GUICtrlCreateInput("", 8, 105, 121, 21)
    $StartBut = GUICtrlCreateButton("&Start", 8, 150, 148, 25, 0)
    GUICtrlSetOnEvent(-1, "_Start")
    $Progress = GUICtrlCreateProgress(8, 138, 148, 9)
    GUISetState()

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

    While 1;Damit das Script nicht beendet
    Sleep(100)
    WEnd

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

    Func _search_path()
    $path = FileSelectFolder("", 3, 1, "::{450D8FBA-AD25-11D0-98A8-0800361B1103}")
    If @error Then Return
    If @GUI_CtrlId = $ChooseBut1 Then; wenn als letzes ChosseBut1 gedrückt wurde (der button für den Musik Ordner)...
    If $path <> "" Then GUICtrlSetData($MusicInp, $path);...setze das control $MusicInp (Musik Ordner) mit dem Pfad
    Else; ansonsten (also wenn der button für den Ziel ordner gedrückt wurde) ...
    If $path <> "" Then GUICtrlSetData($TargetInp, $path);...setze das control $TargetInp (Ziel Ordner) mit dem Pfad
    EndIf

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

    EndFunc ;==>_search_path

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

    If FileGetSize($ListTxt) Then _ReadFromList()

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

    Func CLOSEClicked()
    Exit
    EndFunc ;==>CLOSEClicked

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

    Func _Start()
    ;DIESE DATEN MUSST DU NACH DEINEN WÜNSCHEN BEARBEITEN <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    Global $MusicDir = GUICtrlRead($MusicInp) ; Laufwerk auf dem Musik ist >> soll in Gui ausgewählt werden können
    Global $SizeInByte = GUICtrlRead($GroesseInp) * 1048576 ; Berechnet die Größe der zu kopierenden Dateimengen 3750 * 1048576 = ca. 4 GB
    Global $DestDir = GUICtrlRead($TargetInp) ; Laufwerk MP3-Player >> Zielort Auswahl in Gui Ordner oder MP3-Player
    Global $MusicDirName = StringTrimLeft($MusicDir, StringInStr($MusicDir, "", 0, -1))

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

    If Not IsArray($FileList) Then _ReadMusicDir()

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

    $SplText = "Kopiere Daten"
    $hwndSpl = SplashTextOn("", $SplText & @LF & "|", 250, 65, -1, -1, 1, "Courier New")
    AdlibRegister("_SetSpl", 100)

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

    If Not FileExists($DestDir) Then DirCreate($DestDir)

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

    $mb = 0
    $rand = 0
    $InUseRead = FileRead("InUse_do_not_delete.txt")
    $InUse = $InUseRead
    While 1
    $SplText = "Kopiere Daten" & @CRLF & StringTrimLeft($FileList[$rand], StringInStr($FileList[$rand], "", -1, -1))
    $aInUse = StringSplit($InUse, ",")
    $RandInUse = True
    While $RandInUse
    $rand = Random(1, $FileList[0], 1)
    $RandInUse = False
    For $i = 1 To $aInUse[0]
    ConsoleWrite($rand & "," & $aInUse[$i] & @CRLF)
    If $rand = $aInUse[$i] Then
    $RandInUse = True
    ExitLoop
    EndIf
    Next
    WEnd
    $mb += FileGetSize($FileList[$rand])
    If $mb > $SizeInByte Then ExitLoop
    FileCopy($FileList[$rand], $DestDir & "\*.*")
    $InUse &= $rand & ","
    WEnd

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

    FileWrite("InUse_do_not_delete.txt", StringTrimLeft($InUse, StringLen($InUseRead)))

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

    SplashOff()
    EndFunc ;==>_Start

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

    Func OnAutoItExit()
    FileClose($ListTxtOp)
    EndFunc ;==>OnAutoItExit

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

    Func _ReadMusicDir()
    $SplText = "Lese den Musikordner ein" & @LF & $MusicDirName
    $hwndSpl = SplashTextOn("", $SplText & @LF & "|", 250, 40, -1, -1, 1, "Courier New")
    AdlibRegister("_SetSpl", 100) ; <<<<< Hier kommt die Fehlermeldung
    FileDelete("InUse_do not delete.txt")
    $FileList = _FileListToArrayEx($MusicDir, "*.*", 1, '', True)
    SplashOff()
    AdlibUnRegister()
    FileWriteLine($ListTxtOp, $MusicDir)
    For $i = 1 To $FileList[0]
    FileWriteLine($ListTxtOp, StringTrimLeft($FileList[$i], StringLen($MusicDir) + 1))
    Next
    EndFunc ;==>_ReadMusicDir

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

    Func _ReadFromList()
    $SplText = "Lese daten von Datei" & @LF & StringTrimLeft($ListTxt, StringInStr($ListTxt, "", 0, -1))
    $hwndSpl = SplashTextOn("", $SplText & @LF & "|", 250, 65, -1, -1, 1, "Courier New")
    AdlibRegister("_SetSpl", 100)
    _FileReadToArray($ListTxt, $FileList)
    Global $MusicDir = $FileList[1]
    $FileList[0] = $FileList[0] - 1
    _ArrayDelete($FileList, 1)
    For $i = 1 To $FileList[0]
    $FileList[$i] = $MusicDir & "" & $FileList[$i]
    If Not FileExists($FileList[$i]) Then MsgBox(0, "", $FileList[$i])
    Next
    SplashOff()
    EndFunc ;==>_ReadFromList

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

    Func _SetSpl()
    Switch $SplNext
    Case 1
    ControlSetText($hwndSpl, "", "Static1", $SplText & @LF & "./.")
    $SplNext = 2
    Case 2
    ControlSetText($hwndSpl, "", "Static1", $SplText & @LF & "..-..")
    $SplNext = 3
    Case 3
    ControlSetText($hwndSpl, "", "Static1", $SplText & @LF & "...\...")
    $SplNext = 4
    Case 4
    ControlSetText($hwndSpl, "", "Static1", $SplText & @LF & "|")
    $SplNext = 1
    EndSwitch
    EndFunc ;==>_SetSpl

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

    ;===============================================================================
    ; Description: lists all or preferred files and or folders in a specified path (Similar to using Dir with the /B Switch)
    ; Syntax: _FileListToArrayEx($sPath, $sFilter = '*.*', $iFlag = 0, $sExclude = '', $bTmpFile = False)
    ; Parameter(s): $sPath = Path to generate filelist for
    ; $sFilter = The filter to use. Search the Autoit3 manual for the word "WildCards" For details, support now for multiple searches
    ; Example *.exe; *.txt will find all .exe and .txt files
    ; $iFlag = determines weather to return file or folders or both.
    ; $sExclude = exclude a file from the list by all or part of its name
    ; Example: Unins* will remove all files/folders that start with Unins
    ; $iFlag=0(Default) Return both files and folders
    ; $iFlag=1 Return files Only
    ; $iFlag=2 Return Folders Only
    ; $bTmpFile = Boolean value for specifying if using a temp. file
    ; $bTmpFile = True All files are written to a "reserved" .tmp file (Thanks to gafrost) for the example
    ; The Reserved file is then read into an array, then deleted
    ; $bTmpFile = False No .tmp file is used
    ; Requirement(s): None
    ; Return Value(s): On Success - Returns an array containing the list of files and folders in the specified path
    ; On Failure - Returns the an empty string "" if no files are found and sets @Error on errors
    ; @Error or @extended = 1 Path not found or invalid
    ; @Error or @extended = 2 Invalid $sFilter or Invalid $sExclude
    ; @Error or @extended = 3 Invalid $iFlag
    ; @Error or @extended = 4 No File(s) Found
    ; Author(s): SmOke_N
    ; Note(s): The array returned is one-dimensional and is made up as follows:
    ; $array[0] = Number of Files\Folders returned
    ; $array[1] = 1st File\Folder
    ; $array[2] = 2nd File\Folder
    ; $array[3] = 3rd File\Folder
    ; $array[n] = nth File\Folder
    ;===============================================================================

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

    Func _FileListToArrayEx($sPath, $sFilter = '*.*', $iFlag = 0, $sExclude = '', $iRecurse = False, $iShortName = True)
    If Not FileExists($sPath) Then Return SetError(1, 1, '')
    If $sFilter = -1 Or $sFilter = Default Then $sFilter = '*.*'
    If $iFlag = -1 Or $iFlag = Default Then $iFlag = 0
    If $sExclude = -1 Or $sExclude = Default Then $sExclude = ''
    Local $aBadChar[6] = ['\', '/', ':', '>', '<', '|']
    $sFilter = StringRegExpReplace($sFilter, '\s*;\s*', ';')
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    For $iCC = 0 To 5
    If StringInStr($sFilter, $aBadChar[$iCC]) Or _
    StringInStr($sExclude, $aBadChar[$iCC]) Then Return SetError(2, 2, '')
    Next
    If StringStripWS($sFilter, 8) = '' Then Return SetError(2, 2, '')
    If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 3, '')
    Local $oFSO = ObjCreate("Scripting.FileSystemObject"), $sTFolder
    $sTFolder = $oFSO.GetSpecialFolder(2)
    Local $hOutFile = @TempDir & $oFSO.GetTempName
    If Not StringInStr($sFilter, ';') Then $sFilter &= ';'
    Local $aSplit = StringSplit(StringStripWS($sFilter, 8), ';'), $sRead, $sHoldSplit
    For $iCC = 1 To $aSplit[0]
    If StringStripWS($aSplit[$iCC], 8) = '' Then ContinueLoop
    If StringLeft($aSplit[$iCC], 1) = '.' And _
    UBound(StringSplit($aSplit[$iCC], '.')) - 2 = 1 Then $aSplit[$iCC] = '*' & $aSplit[$iCC]
    $sHoldSplit &= '"' & $sPath & $aSplit[$iCC] & '" '
    Next
    $sHoldSplit = StringTrimRight($sHoldSplit, 1)
    If $iRecurse Then
    RunWait(@ComSpec & ' /c dir /b /s /a ' & $sHoldSplit & ' > "' & $hOutFile & '"', '', @SW_HIDE)
    Else
    RunWait(@ComSpec & ' /c dir /b /a ' & $sHoldSplit & ' /o-e /od > "' & $hOutFile & '"', '', @SW_HIDE)
    EndIf
    $sRead &= FileRead($hOutFile)
    If Not FileExists($hOutFile) Then Return SetError(4, 4, '')
    FileDelete($hOutFile)
    If StringStripWS($sRead, 8) = '' Then SetError(4, 4, '')
    Local $aFSplit = StringSplit(StringTrimRight(StringStripCR($sRead), 1), @LF)
    Local $sHold
    For $iCC = 1 To $aFSplit[0]
    If $sExclude And StringLeft($aFSplit[$iCC], _
    StringLen(StringReplace($sExclude, '*', ''))) = StringReplace($sExclude, '*', '') Then ContinueLoop
    Switch $iFlag
    Case 0
    If StringLeft($aFSplit[$iCC], StringLen($sPath)) <> $sPath Then
    If $iShortName Then
    $sHold &= FileGetShortName($sPath & $aFSplit[$iCC]) & Chr(1)
    Else
    $sHold &= $sPath & $aFSplit[$iCC] & Chr(1)
    EndIf

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

    Else
    If $iShortName Then
    $sHold &= FileGetShortName($aFSplit[$iCC]) & Chr(1)
    Else
    $sHold &= $aFSplit[$iCC] & Chr(1)
    EndIf

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

    EndIf
    Case 1
    If StringInStr(FileGetAttrib($sPath & '\' & $aFSplit[$iCC]), 'd') Then ContinueLoop
    If StringLeft($aFSplit[$iCC], StringLen($sPath)) <> $sPath Then
    If $iShortName Then
    $sHold &= FileGetShortName($sPath & $aFSplit[$iCC]) & Chr(1)
    Else
    $sHold &= $sPath & $aFSplit[$iCC] & Chr(1)
    EndIf
    Else
    If $iShortName Then
    $sHold &= FileGetShortName($aFSplit[$iCC]) & Chr(1)
    Else
    $sHold &= $aFSplit[$iCC] & Chr(1)
    EndIf
    EndIf
    Case 2
    If Not StringInStr(FileGetAttrib($sPath & '\' & $aFSplit[$iCC]), 'd') Then ContinueLoop
    If StringLeft($aFSplit[$iCC], StringLen($sPath)) <> $sPath Then
    If $iShortName Then
    $sHold &= FileGetShortName($sPath & $aFSplit[$iCC]) & Chr(1)
    Else
    $sHold &= $sPath & $aFSplit[$iCC] & Chr(1)
    EndIf
    Else
    If $iShortName Then
    $sHold &= FileGetShortName($aFSplit[$iCC]) & Chr(1)
    Else
    $sHold &= $aFSplit[$iCC] & Chr(1)
    EndIf
    EndIf
    EndSwitch
    Next
    $sHold = StringReplace(StringReplace(StringReplace(StringReplace($sHold, Chr(129), "ü"), Chr(132), "ä"), Chr(148), "ö"), Chr(225), "ß")
    If StringTrimRight($sHold, 1) Then Return StringSplit(StringTrimRight($sHold, 1), Chr(1))
    Return SetError(4, 4, '')
    EndFunc ;==>_FileListToArrayEx

    [/autoit]


    Getestet mit AutoIt Version v3.3.10.2

  • Gui ohne Titelleiste erstellen

    • Yjuq
    • 1. März 2014 um 18:31

    Mir Schnuppe :D
    Die WindowsConstants.au3 wird ja inkludiert.
    Zudem binde ich immer die GUIConstants ein, wenn es um GUI's geht ^^

  • Kombinationen ermitteln

    • Yjuq
    • 1. März 2014 um 18:23

    Ach Herjee :)
    Dankeschön ^^

    Mehr kann ich nun wirklich nicht sagen.
    Läuft! =)

  • Kombinationen ermitteln

    • Yjuq
    • 1. März 2014 um 16:05

    Danke für deine Antwort!
    Sorry dass ich es nicht klar formuliert habe:
    Es sollen nur Summanden verwendet werden, die positive Ganzzahlen über 0 sind.
    Also genau die Bedingungen die du oben genannt hast.

    Ich versuch gerade mal diese "Probiermethode" umzusetzen.
    Falls noch jemand andere Vorschläge hat, ich bin ganz Ohr. :)

  • Gui ohne Titelleiste erstellen

    • Yjuq
    • 1. März 2014 um 14:43
    [autoit]

    #include <GUIConstants.au3>

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

    $hGUI = GUICreate('', 800, 600, -1, -1, $WS_POPUPWINDOW)
    GUISetState()

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

    Sleep(1000)

    [/autoit]
  • Kombinationen ermitteln

    • Yjuq
    • 1. März 2014 um 14:29

    Schönen guten Tag! =)
    Ich sitze gerade an einem Problem wozu ich noch keinen Ansatz habe dies zu lösen. Daher kann ich auch keinen Code präsentieren. Ich möchte gerne alle Kombinationen in einen Array abspeichern, die mit wahlweise x Summanden die Summe y ergeben. Dabei sollen nur natürliche Zahlen berücksichtigt werden.

    Beispiel:
    Ich möchte alle Kombinationen ermitteln, welche die Zahl 5 (y) mit 2 Summanden (x) ergibt.

    Code
    1 + 4
    2 + 3
    3 + 2
    4 + 1


    Das Gleiche möchte ich nun für 3 Summanden machen.

    Code
    1 + 1 + 3
    1 + 2 + 2
    1 + 3 + 1
    2 + 1 + 2
    2 + 2 + 1
    3 + 1 + 1


    Dafür würde ich gerne in AutoIt eine Funktion schreiben, die dies für mich erledigt. Jedoch habe ich, wie ich bereits erwähnte, noch keinen Lösungsansatz dafür. Ich bitte um ein paar Anregungen.
    LG. Make =)

  • Tetris

    • Yjuq
    • 25. Februar 2014 um 17:28

    Das dass Skript abstürzt ist mir auch schon aufgefallen.
    Ich glaube das passiert immer dann, wenn man gleichzeitig 2 oder mehrere Reihen zusammen hat.

  • ControlSend auf mehrere Fenster mit demselbem Titel

    • Yjuq
    • 24. Februar 2014 um 00:03

    Sieh dir doch mal den Code von mir an...
    Ich habe dort auch 2 exakt gleiche Fenster, jedoch werden in beide genau der Text hinein geschrieben, den ich möchte!
    Komisch dass es bei dir nicht klappt, was?

    Die Fenster haben (Neben den Titel und den Klassen) ein Handle welches nur einmalig vergeben wird. Dieses Handle ist wie eine ID und wird solange besetzt, wie das Programm läuft. Somit können selbst "gleiche Fenster" unterschieden werden. Wenn du nun das gleiche Verfahren anwendest wie ich, kannst du zielgerichtet auf deine gewünschten Fenster den gewünschten Text senden. Die Betonung liegt auf "zielgerichtet". Bei dir ist das eher ein Blindflug ^^

    €dit:

    [autoit]

    ControlSendAll('[CLASS:Notepad]', '', 15, 'Der zu sendene Text!', 1)

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

    Func ControlSendAll($title, $text, $controlID, $string, $flag = 0)
    Local $avWindow = WinList($title, $text)
    Local $i

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

    If Not IsArray($avWindow) Then Return 0
    For $i = 1 To $avWindow[0][0]
    ControlSend($avWindow[$i][1], '', $controlID, $string, $flag)
    Next

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

    Return 1
    EndFunc

    [/autoit]

    Noch einfacher kann ich dir es nicht machen! ^^
    Die Parameter sind exakt die gleichen wie bei ControlSend().
    Nur wird der Text an alle Fenster gesendet die auf den Titel bzw. der Klasse zutreffen.
    Mehr kann man nun wirklich nicht mehr für dich tun. :D

  • ControlSend auf mehrere Fenster mit demselbem Titel

    • Yjuq
    • 23. Februar 2014 um 22:43
    [autoit]

    ; Zwei Notepad Prozesse minimiert starten:
    Run('notepad.exe', '', @SW_MINIMIZE)
    Run('notepad.exe', '', @SW_MINIMIZE)

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

    ; Kurz Zeit geben damit die Fenster registriert werden können:
    Sleep(100)

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

    ; Nun werden alle Fenster die mit der Klassenbezeichnung "Notepad" registriert sind
    ; in ein Array geladen. Nun können mithilfer deren Handles die Texte gesendet werden:
    $avWindow = WinList('[CLASS:Notepad]')

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

    ; Fenster 1:
    ConsoleWrite(@CRLF & ' Titel: ' & $avWindow[1][0] & @CRLF & ' Handle: ' & $avWindow[1][1] & @CRLF)

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

    ; Fenster 2:
    ConsoleWrite(@CRLF & ' Titel: ' & $avWindow[2][0] & @CRLF & ' Handle: ' & $avWindow[2][1] & @CRLF & @CRLF)

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

    ; An Fenster #1 senden:
    ControlSend($avWindow[1][1], '', 15, 'Fenster #1')

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

    ; An Fenster #2 senden:
    ControlSend($avWindow[2][1], '', 15, 'Fenster #2')

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

    ; Nun nur noch die Fenster einzelnd maximieren und dann schließen:
    WinSetState($avWindow[1][1], '', @SW_MAXIMIZE)
    Sleep(2500)
    ProcessClose(WinGetProcess($avWindow[1][1]))
    Sleep(100)
    WinSetState($avWindow[2][1], '', @SW_MAXIMIZE)
    Sleep(2500)
    ProcessClose(WinGetProcess($avWindow[2][1]))

    [/autoit]
  • Tetris

    • Yjuq
    • 23. Februar 2014 um 02:29

    Sorry, bei so einem langen Code lese ich mich nicht großartig ein. ^^
    Ich gebe dir mal einen Ansatz bzw. Idee um dir selber die Features noch zu programmieren.

    Versuch deine Steine die rechts angezeigt werden in ein Array zu speichern.
    [0] = Anzeige Stein 1
    [1] = Anzeige Stein 2
    [2] = Anzeige Stein 3
    [3] = Gespeicherter Stein

    Nun brauchst du nur noch folgendes zu machen:

    Ist der Aktuelle Stein unten, dann holst du Element [0] heraus und verschiebst [1] nach [0] und [2] nach [1]. In [2] kannst du einen neuen Stein generieren.

    Wird die Shift Taste gedrückt, tauscht du einfach den Inhalt von [0] und [3] aus. Das setzt aber voraus, dass du einen zufälligen Stein vor Beginn in die Ablage generierst.


    Der Code dazu ist nicht alt zu schwierig. Ich weiß nicht wie du es in deinem Skript hast, aber so würde ich das Problem lösen.

  • DllStructCreate und BitFields?!

    • Yjuq
    • 22. Februar 2014 um 20:29

    Mir ist aufgefallen dass ein Programm meist die gleiche Adresse für Variablen verwendet. Warum das so ist kann ich nicht sagen, aber folgender FreeBASIC Code gibt mir immer als Adresse "1638080" oder auch 0x0018FEC0 aus. Wenn ich nun die Adresse beispielsweise mit Cheat Engine überprüfe, wird mir der richtige Wert angezeigt.

    Hier der code:

    Code
    Dim As Integer x = 5
    Print
    Print "  "; @x
    Print
    Sleep

    Die anderen Bits gehören zu dem Wert, der vorab in der Adresse gespeichert wurde. Weil du mit den Bitfelder eben nur einzelne Bits änderst, bleiben die anderen unberührt. Die ganze Adresse wird (obwohl vielleicht nur 2 Bits in der Struktur genutzt werden) für andere Programme gesperrt. Das bedeutet, dass du diese getrost überschreiben kannst.

    ~ Make =)

  • Wie erstellt man Dokumentationen zu einem vorhandenden Autoit Script?

    • Yjuq
    • 22. Februar 2014 um 13:43

    Wie gesagt, wie Dokumentationen wie z.B. die Hilfedatei von AutoIt erstelle ich mit BookME.
    Selbstverständlich muss Text noch selber getippt werden, aber das Design wird als *.html oder auch *.chm Datei generiert.
    Zudem bietet das Programm auch die Möglichkeit selber Vorlagen zu erstellen. So brauchst du diese nur einmal zu erstellen und den Text nur noch hinein schreiben.
    Im Anhang ein einfaches Beispiel ^^

    Dateien

    Example.zip 26,12 kB – 323 Downloads
  • Zahlenrätzel

    • Yjuq
    • 22. Februar 2014 um 13:27

    Dann gäbe es doch eigentlich 4 Zahlen die darauf zutreffen:

    100
    101
    110
    111

    Diese sind alle im Dualsystem und liegen (als Wert im Dezimalsystem) unter 10. Daher einstellig...

  • Zahlenrätzel

    • Yjuq
    • 21. Februar 2014 um 22:21

    Das was da steht ist mir durchaus bekannt.
    Aber das mit der "Wertigkeit" verstehe ich immer noch nicht so ganz.
    Wenn ich die Zahl 53 habe, dann ist die Wertigkeit der ersten Ziffer 10^0 = 1 und der zweiten Ziffern 10^1 = 10?
    Aber was ist dann mit der ganzen Zahl? Wie kann man die Wertigkeit einer ganzen Zahl verstehen?
    Und was ist mit "einstelliger Wertigkeit" gemeint wie in der Aufgabe gefordert?
    Bedeutet dass, das es nur eine Ziffer gibt?
    ~ Make :)

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™