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

Beiträge von Andy

  • Wegfindung

    • Andy
    • 24. August 2013 um 19:07

    Mars, anbei habe ich Hindernisse eingefügt, allerdings steigt dann ab und zu die Func __Area_GetRichtung() mit Rekursionsoverflow aus... ;(

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Global $__aArea[1][1], $__aAreaMap[1][1], $__aAreaUx, $__aAreaUy, $__aAreaStart[2], $__aAreaZiel[2]

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

    ; Nur zum Testen
    Global $aLabel[1][1]

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

    _Test()

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

    Func _Test()
    Local $ix = 10, $iy = 10, $hBtn_Neu, $aStart[2], $aZiel[2], $t, $p, $aPosTest[2]
    Local $hGUI = GUICreate('Test', 400, 445)
    ReDim $aLabel[$iy][$ix]
    _Area_SetSize($ix, $iy)

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

    $hBtn_Neu = GUICtrlCreateButton('Neuer Weg', 10, 410, 100, 25)

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

    For $i = 0 To $ix - 1 Step 1
    For $e = 0 To $iy - 1 Step 1
    $aLabel[$e][$i] = GUICtrlCreateLabel('', $i * (400 / $ix), $e * (400 / $iy), (400 / $ix), (400 / $iy), 0x0201)
    GUICtrlSetBkColor(-1, 0xD0D0D0 + IsInt(($e + $i) / 2) * 0x101010)
    Next
    Next

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

    GUISetState()

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

    While True
    Switch GUIGetMsg()
    Case -3
    Exit
    Case $hBtn_Neu
    Do
    For $i = 0 To 1 Step 1
    $aStart[$i] = Random(0, $ix - 1, 1)
    $aZiel[$i] = Random(0, $ix - 1, 1)
    Next
    Until (Abs($aStart[0] - $aZiel[0]) + Abs($aStart[1] - $aZiel[1])) > (($ix ^ 2 + $iy ^ 2) ^ 0.5 / 2)
    _Area_SetPath($aStart, $aZiel)
    For $i = 0 To $ix - 1 Step 1
    For $e = 0 To $iy - 1 Step 1
    If $i = $aStart[0] And $e = $aStart[1] Then
    GUICtrlSetBkColor($aLabel[$e][$i], 0x4040DD)
    ElseIf $i = $aZiel[0] And $e = $aZiel[1] Then
    GUICtrlSetBkColor($aLabel[$e][$i], 0xDD4040)
    Else
    GUICtrlSetBkColor($aLabel[$e][$i], 0xD0D0D0)
    EndIf
    Next
    Next
    For $y = 0 To $iy - 1 Step 1 ;Hindernisse festlegen
    If $y = 2 Then ContinueLoop
    $__aAreaMap[$y][5] = 1000
    Next

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

    _Area_Calc()
    For $i = 0 To $ix - 1 Step 1
    For $e = 0 To $iy - 1 Step 1
    GUICtrlSetData($aLabel[$e][$i], Round($__aAreaMap[$e][$i], 1))
    Next
    Next

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

    $t = TimerInit()
    $p = _Area_FindPath()
    $t = TimerDiff($t)
    ConsoleWrite('Pfad: ' & $p & ' (' & Round($t, 2) & 'ms)' & @CRLF)

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

    $aPosTest = $__aAreaStart
    $p = StringSplit($p, '', 2)
    For $i = 0 To UBound($p) - 2 Step 1
    Switch $p[$i]
    Case 1 ; Links
    $aPosTest[0] -= 1
    Case 2 ; Oben
    $aPosTest[1] -= 1
    Case 3 ; Rechts
    $aPosTest[0] += 1
    Case 4 ; Unten
    $aPosTest[1] += 1
    EndSwitch
    GUICtrlSetBkColor($aLabel[$aPosTest[1]][$aPosTest[0]], 0x40DD40)
    Next

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

    EndSwitch
    WEnd

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

    EndFunc ;==>_Test

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

    Func _Area_FindPath($aPos = $__aAreaStart)
    If $aPos[0] = $__aAreaZiel[0] And $aPos[1] = $__aAreaZiel[1] Then Return
    Local $sPath = ''
    Local $aList = __Area_GetRichtung($aPos), $tPos[2], $sTemp
    __Area_SortArray2D($aList)
    ;~ If $aList[0][1] = 1 Then Return

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

    ;~ ConsoleWrite('Pos: [' & $aPos[0] & '|' & $aPos[1] & ']' & @CRLF)
    ;~ For $i = 0 To UBound($aList) - 1 Step 1
    ;~ If $aList[$i][1] Then ConsoleWrite($aList[$i][0] & ': ' & $aList[$i][1] & @CRLF)
    ;~ Next
    ;~ ConsoleWrite(@CRLF)

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

    For $i = 0 To UBound($aList) - 1 Step 1
    If Not $aList[$i][1] Then ContinueLoop
    $tPos = $aPos
    Switch $aList[$i][0]
    Case 1 ; Links
    $tPos[0] -= 1
    Case 2 ; Oben
    $tPos[1] -= 1
    Case 3 ; Rechts
    $tPos[0] += 1
    Case 4 ; Unten
    $tPos[1] += 1
    EndSwitch

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

    If $tPos[0] = $__aAreaZiel[0] And $tPos[1] = $__aAreaZiel[1] Then Return $aList[$i][0]
    $sPath = $aList[$i][0]

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

    ;~ Sleep(500)
    ;~ GUICtrlSetBkColor($aLabel[$tPos[1]][$tPos[0]], 0x40DD40)

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

    ;~ ConsoleWrite('tPos: [' & $tPos[0] & '|' & $tPos[1] & ']' & @CRLF)

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

    $sTemp = _Area_FindPath($tPos)
    If Not ($sTemp = -1) Then Return $sPath & $sTemp
    ;~ If $aList[$i][1] Then ConsoleWrite($aList[$i][0] & ': ' & $aList[$i][1] & @CRLF)
    Next
    If Not $sPath Then
    ;~ _ArrayDisplay($aList)
    Return -1
    EndIf
    EndFunc ;==>_Area_FindPath

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

    Func __Area_SortArray2D(ByRef $a)
    Local $c[2], $t[2]
    For $i = 0 To UBound($a) - 1 Step 1
    $t[0] = $a[$i][0]
    $t[1] = $a[$i][1]
    For $e = $i - 1 To 0 Step -1
    $c[0] = $a[$e][0]
    $c[1] = $a[$e][1]
    If $t[1] >= $c[1] Then ExitLoop
    $a[$e + 1][0] = $c[0]
    $a[$e + 1][1] = $c[1]
    Next
    $a[$e + 1][0] = $t[0]
    $a[$e + 1][1] = $t[1]
    Next
    EndFunc ;==>__Area_SortArray2D

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

    Func __Area_GetRichtung($aPos)
    Local $a[4][2] = [[1],[2],[3],[4]] ; LORU
    If $aPos[0] > 0 Then $a[0][1] = $__aAreaMap[$aPos[1]][$aPos[0] - 1]
    If $aPos[1] > 0 Then $a[1][1] = $__aAreaMap[$aPos[1] - 1][$aPos[0]]
    If $aPos[0] < $__aAreaUx - 1 Then $a[2][1] = $__aAreaMap[$aPos[1]][$aPos[0] + 1]
    If $aPos[1] < $__aAreaUy - 1 Then $a[3][1] = $__aAreaMap[$aPos[1] + 1][$aPos[0]]
    Return $a
    EndFunc ;==>__Area_GetRichtung

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

    Func _Area_Calc()
    If Not ($__aAreaStart[0] < $__aAreaUx And $__aAreaStart[1] < $__aAreaUy And $__aAreaZiel[0] < $__aAreaUx And $__aAreaZiel[1] < $__aAreaUy) Then Return -1
    For $x = 0 To $__aAreaUx - 1 Step 1
    For $y = 0 To $__aAreaUy - 1 Step 1
    If $__aAreaMap[$y][$x] <> 1000 Then
    $__aAreaMap[$y][$x] = (($__aAreaZiel[0] - $x) ^ 2 + ($__aAreaZiel[1] - $y) ^ 2) ^ 0.5 + 1
    EndIf
    Next
    Next
    EndFunc ;==>_Area_Calc

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

    Func _Area_SetPath($aStart, $aZiel)
    $__aAreaStart = $aStart
    $__aAreaZiel = $aZiel
    EndFunc ;==>_Area_SetPath

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

    Func _Area_SetTitle($x, $y, $bBlocked)
    If $x < $__aAreaUx And $y < $__aAreaUy Then $__aArea[$y][$x] = $bBlocked
    EndFunc ;==>_Area_SetTitle

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

    Func _Area_Reset()
    ReDim $__aArea[1][1]
    $__aArea[0][0] = ''
    $__aAreaMap = $__aArea
    $__aAreaUx = 1
    $__aAreaUy = 1
    $__aAreaStart[0] = ''
    $__aAreaStart[1] = ''
    $__aAreaZiel[0] = ''
    $__aAreaZiel[1] = ''
    EndFunc ;==>_Area_Reset

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

    Func _Area_SetSize($x, $y)
    _Area_Reset()
    ReDim $__aArea[$y][$x]
    $__aAreaMap = $__aArea
    $__aAreaUx = $x
    $__aAreaUy = $y
    EndFunc ;==>_Area_SetSize

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


    //EDIT
    ahhh, habe mir das mal genauer angeschaut, du errechnest nicht von jedem freien Feld den Abstand sondern gehst davon aus, dass der Weg Hindernisfrei ist :rofl:
    Wieso du dir aber dermassen die Finger brichst weiss ich nicht :P
    Starte am Start
    Springe auf jedes freie Nachbarfeld und notiere dort den Abstand zum bereits berechneten Feld (plus dessen Wert) , dieses ist der "Wert" des neuen Feldes
    Fülle so das gesamte Spielfeld aus
    Gehe vom Ziel aus immer auf das nächste Feld mit dem kleinsten Wert, bis du bei Start bist


    Texos, du hast den Algorithmus nicht verstanden...Wenn das Feld einen bestimmten Wert hat , dann musst du nicht in einem weiteren Array oder Index diesen Wert nochmal speichern.
    Wenn ein Feld bspw den Wert 1000 hat, dann wird dort nie "hingelaufen", weil alle anderen angrenzenden Felder einen kleineren Wert haben.

  • Wegfindung

    • Andy
    • 24. August 2013 um 18:28

    Hi,
    beim A*-Algo musst du einfach nur das "diagonale" Gehen weglassen^^

    Letztendlich läuft es darauf hinaus, jedes Feld des Spielfelds vom Start ausgehend zu bewerten und diese Werte zu addieren. Am Ziel angekommen geht man dann rückwärts auf dem "kürzesten" Weg, d.h. immer zum Feld mit dem kleinsten Wert. Das Prinzip ist sehr einfach.
    Bei einem TD mit mehreren Creeps würde ich es so machen, dass zusätzlich zum Wert des Feldes auch noch das "Gewicht" des Creeps mit addiert wird. Dann würde ein von einem Creep besetztes Feld nur im absoluten Notfall mehrfach besetzt werden, trotzdem wäre aber ein Stau vermeidbar bzw, ggf wäre ein längerer Weg einem Stau vorzuziehen.

    Bei deinem Beispiel sieht der Weg länger aus als er ist, da nicht der "gerade" Weg zum Ziel genommen wird^^.
    Das war auch bei meinem A* Algo so, das konnte ich aber über die Bewertung der Diagonalen einstellen.
    Da bei dir nur Waagrecht und Senkrecht gegangen werden kann, solltest du das Feld, das auf der "Luftlinie" zum Ziel liegt, bei gleichem Wert vorziehen....So läuft die Figur auch "diagonal" über das Spielfeld, statt bspw. ganz nach unten und dann ganz nach rechts zu laufen. Der eigentliche Weg ist zwar genauso lang, aber es sieht einfach doof aus^^

  • Passwörter

    • Andy
    • 24. August 2013 um 14:08
    Zitat

    Wenn man sein Programm wirklich sichern will muss man eben auf eine richtige Programmiersprache umsteigen (z.B. Assembly).

    Sobald man an die ausführbare Datei herankommt ist es völlig unerheblich mit welchen Mitteln gesichert oder verschlüsselt wurde!
    Dann ist es nur eine Frage des Aufwandes und der Hartnäckigkeit, ein Programm zu knacken.

  • Passwörter

    • Andy
    • 24. August 2013 um 13:53

    Hi,
    das würde zutreffen, wenn bspw. nur ein Passwort verwendet wird. Dann kann man es natürlich "hartkodiert" direkt im Script verwenden. Was aber alles nichts nützt, denn wenn dekompiliert wird ist es völlig schnurz, ob das Passwort im Klartext oder gehashed oder sonstwie verschlüsselt im Script steht.
    Der Hash oder die Verschlüsselung machen nur dann Sinn, wenn sie "außerhalb" des Scriptes stehen, bspw. in der Registry oder in einer Datei (*.ini)
    Verschlüsselte Passwörter in externe Dateien (Registry oder *.ini) schreiben ist imho suboptimal. Ist die Passwortdatei beschädigt oder nicht im Zugriff, gibt es Stress!
    Die EXE ist immer im Zugriff, man braucht nur eine Datei und kann beliebig viele und große Passwörter anhängen.

  • Passwörter

    • Andy
    • 24. August 2013 um 13:13

    Hi,
    in letzter Zeit wurden einige Anfragen gestellt bzgl. der Speicherung von Passwörtern bei kompilierten Scripten. Der Sinn sei mal dahingestellt...

    Am einfachsten ist es, die Passwörter direkt in der EXE-Datei zu speichern aber wo dort?
    Man könnte auf die Idee kommen, ein Passwort im PE-Header der EXE zu speichern, aber einige Virenscanner überprüfen diesen Bereich und warnen mit Vorhandensein von bspw. "Dropper.Gen" (jaja, im DOS-Stub wurde "früher" auch gerne mal rumgeschrieben und sog. Dropper eingefügt, was aber absolut garnichts mit einem Virus o.ä. zu tun hat)
    Dann könnte man weitere ungenutzte Bereiche innerhalb der EXE-Datei beschreiben, aber dazu müsste man einigen nicht unerheblichen Aufwand betreiben (in Assembler ist alles sooo viel einfacher 8 ) !
    Am allereinfachsten ist es, man hängt das Passwort einfach an die EXE an :D

    Spoiler anzeigen
    [autoit]

    ;Password an EXE-Datei anhängen

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

    $password = InputBox("Password in Exe speichern", "Bitte Password eingeben", "")
    If StringLen($password) = 0 Then Exit (MsgBox(0, "Password in Exe speichern", "Programm abgebrochen! Bitte gültiges Password eingeben"))

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

    $exefile = FileOpenDialog("Password in Exe speichern", @ScriptDir, "(*.EXE)")
    If $exefile = "" Then Exit (MsgBox(0, "Password in Exe speichern", "Programm abgebrochen! Bitte EXE-Datei auswählen"))

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

    $file = FileOpen($exefile, 17) ;Datei binär öffnen
    FileSetPos($file, 0, 2) ;Position auf letztes byte
    FileWrite($file, $password) ;schreiben
    FileFlush($file) ;sicher ist sicher
    FileClose($file) ;schliessen

    [/autoit]


    Es macht Sinn, das Passwort zu "hashen", erstens ist es dann unleserlich, zweitens auch halbwegs "sicher", da es nirgendwo im Klartext steht!

    Wie fragt man das Passwort in der gestarteten EXE-Datei ab?

    Spoiler anzeigen
    [autoit]

    ;zu schützende Scriptdatei
    ;in eine EXE kompilieren
    $password = InputBox("Password", "Bitte Password eingeben:", "")

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

    $file = FileOpen(@ScriptFullPath, 16) ;EXE-datei öffnen
    FileSetPos($file, -StringLen($password), 2) ;Position auf Ende der Datei
    $pw = BinaryToString(FileRead($file, StringLen($password))) ;Password aus EXE lesen
    fileclose($file)

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

    MsgBox(0, "Password", "Das Password " & $password & " ist " & stringleft("richtig!",($pw = $password)*8)&stringleft("falsch!",($pw <> $password)*7))

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

    Also zuerst das zu schützende Script zu einer EXE kompilieren.
    Dann das 1. Script aufrufen und damit dann das einzugebende Passwort an die EXE anhängen.
    EXE aufrufen und Passwort eingeben.

    Wer mag, kann das Passwort auch in der *.AU3-Datei einfügen
    Einfach als Kommentar in die letzte Scriptzeile schreiben, dann funktioniert auch die Au3-Version :D

  • AutoInstaller zerbircht mir den Kopf

    • Andy
    • 23. August 2013 um 11:06
    Zitat

    Das hängt nur von den eigenen Fähigkeiten ab. Ich garantiere dir, dass ich eine GUI mit diversen Elementen ohne Koda mindestens genauso schnell, aber sauberer erstelle als irgendwer mit Koda.

    Was nichts anderes heisst, als dass Koda wesentlich verbessert gehört!
    Den Ansatz finde ich nicht schlecht, und ich bin überzeugt, dass auch die "Pro´s" Koda nutzen würden, wenn es einen Vorteil hätte!
    Im Visual Studio schreibt sich niemand (ernsthaft) seine GUI selbst, der dort enthaltene Editor ist viel zu gut, um die Zeit mit "in der Hilfe suchend nach den passenden Befehlen"-rumgehopse zu verschwenden!
    Ich jedenfalls wäre ohne die Hilfe ganz schön aufgeschmissen, gerade eine GUI mit mehreren (nicht ständig benutzten) Elementen klicke ich mir gerne in Koda zusammen, um dann "nachher" den Code zu bearbeiten und anzupassen!

  • NumberConvert.au3 - Jedes System in jedes andere konvertierbar!

    • Andy
    • 23. August 2013 um 08:59
    Zitat

    Das bedeutet demnach, dass deine Funktion nicht richtig arbeitet.

    So ist es, kommentiert man das "Errorhandlling", also die ersten 5 Zeilen in der Funktion aus, funktioniert sie...im 64-Bit-Zahlenraum.

  • Bei Random Befehl einzelne (bereits erstellte) Zahlen ausschließen

    • Andy
    • 20. August 2013 um 15:39
    Zitat

    Ob Andy es herausgefordert hat ?

    Hat er!!!! 8o
    :thumbup:

  • Bei Random Befehl einzelne (bereits erstellte) Zahlen ausschließen

    • Andy
    • 20. August 2013 um 12:04

    hmmm, dann wird das Script aber HÄSSLICH!

    Spoiler anzeigen
    [autoit]

    $s = 7 ;magic number ^^
    $b = $s ;event vorbelegen für ersten start
    $gui = 0 ;dito
    While $b <> -3 ;solange bis fenster geschlossen
    If $b > 2 And $b < 52 Then ;irgendein button gedrückt
    If $gui <> 0 Then GUIDelete($gui) ;neue GUI
    $gui = GUICreate("Lottozahlen", $s ^ 3, $s ^ 3) ;GUI erstellen
    Dim $a[$s ^ 2 ], $z = 0 ;variablen definieren
    Do
    $rnd = Random(0, $s ^ 2-1, 1) ;zufallszahl erzeugen
    If $a[$rnd] = "" Then ;wenn noch nicht gezogen
    $a[$rnd] = $s ;belegen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $rnd = ' & $rnd & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $z += 1 ;anzahl erhöhen
    EndIf
    Until $z = $s - 1 ;solange bis anzahl =6
    For $i = 0 To $s ^ 2 - 1 ;buttons erstellen
    GUICtrlCreateButton($i + 1, (Mod($i, $s)) * $s ^ 2, Int($i / $s) * $s ^ 2, $s ^ 2, $s ^ 2) ;buttons zeichnen
    If $a[$i] Then GUICtrlSetBkColor(-1, 0xFF0000);und wenn treffer, einfärben
    Next
    GUISetState() ;gui sichtbar machen
    EndIf
    $b = GUIGetMsg() ;und events abfangen
    WEnd

    [/autoit]
  • Bei Random Befehl einzelne (bereits erstellte) Zahlen ausschließen

    • Andy
    • 20. August 2013 um 11:08

    Hi,
    da MUSS ich doch meinen Senf dazugeben^^

    Spoiler anzeigen
    [autoit]


    $s = 7 ;magic number ^^
    $gui = GUICreate("Lottozahlen", $s ^ 3, $s ^ 3) ;GUI erstellen
    Dim $a[$s ^ 2+1], $z = 0 ;variablen definieren
    Do
    $rnd = Random(1, $s ^ 2, 1) ;zufallszahl erzeugen
    If $a[$rnd] = "" Then ;wenn noch nicht gezogen
    $a[$rnd] = $rnd ;belegen
    $z += 1 ;anzahl erhöhen
    EndIf
    Until $z = $s - 1 ;solange bis anzahl =6
    For $i = 0 To $s ^ 2 - 1 ;buttons erstellen
    GUICtrlCreateButton($i + 1, (Mod($i, $s)) * $s ^ 2, Int($i / $s) * $s ^ 2, $s ^ 2, $s ^ 2) ;buttons zeichnen
    If $a[$i+1] Then GUICtrlSetBkColor(-1, 0xFF0000);und wenn treffer, einfärben
    Next
    GUISetState() ;gui sichtbar machen
    While GUIGetMsg() <> -3 ;umd events abfangen
    WEnd

    [/autoit]
  • Fehler in GDIPlus.au3

    • Andy
    • 17. August 2013 um 09:38
    Zitat

    Da wohl niemand daran gedacht hat für diesen Fall Errorhandling einzubauen, um das ganze wirklich idiotensicher zu machen, beschwert sich AutoIt halt über das Array das keins ist.

    Ein Hoch auf die Programmierkunst!
    Genau wegen dieser "Fehler" werden für die einfachsten (Win-API)-Funktionen Errorhandlings eingebaut, und zwar dermassen viele, dass bei den meisten Funktionen das Errorhandling bei weitem das Maß überschreitet bzw. die Ausführungsgeschwindigkeit extrem verlangsamt!
    Wenn ein simpler "Sin()" in C++ bis zu 5x länger dauert wie der Inline-ASM-Code (Aufgrund des Errorhandlings ! ) dann kann man sich ansatzweise Vorstellen wie viel schneller u.a. GDI wäre, wenn man auf die "Fehler"-Abfragen weitgehend verzichten könnte....
    Erschwerend kommt noch dazu, dass die "Programmierer" nicht mal in der Lage sind, die "Fehler" auszuwerten, s. u.a. diesen Thread :huh:

    Genau aus diesem Grund weigere ich mich mittlerweile, sog. UDF´s zu publizieren!
    Die "Anwender" dieser Funktionen gehen selbstverständlich davon aus, dass es weder nötig ist, Funktionsbeschreibungen zu lesen, noch auf die Syntax oder die Datentypen zu achten....
    Um alle diese "Fehler" (wohlgemerkt nicht die der Funktion, sondern der ignoranten oder faulen Anwender) abzufangen, muss man einen simplen 20-Zeiler auf 100 Zeilen "bloaten".
    Wie hier im Thread gezeigt, hilft auch das nicht, wenn die Errormessages nicht in einer Messagebox angezeigt werden. Simples SetError() ist somit völlig überflüssig ;(
    Ein Hoch auf die Programmierkunst!

  • Ich weis nicht wie ich Controlclick anwenden muss

    • Andy
    • 15. August 2013 um 23:59

    Hi,
    schön, dass du den Threadtitel geändert hast^^ jetzt hagelt es Hilfen, jede Wette :thumbup:

    Zitat

    Achso ok, und noch was, kann sein das WinWaitActive nicht tut? Weil wenn ich WinWaitActive("Titel") eingebe und starte passiert nichts, gebe ich statt dessen sleep(...) ein dann funktioniert der darauffolgende Befehl

    Ja, ein Sleep() ist nie verkehrt! Ich wähle je nach Fenstertyp und Anwendung bis zu 2 Sekunden!!!
    Das Problem an Windows ist, dass es völlig Eventbasiert ist! So kann es sein, dass zwar die Information "Fenster aktiv" abgefeuert wurde, aber diese Information noch nicht in den entsprechenden Listen enthalten ist (oder das Fenster ist bei weitem noch nicht so weit...).
    Wenn du dann "zu früh" den Befehl "Drück den Button" gibst....dann hat Windows sich mal wieder selbst überholt, das ist an der Tagesordnung!
    Also entweder Wartezeiten einplanen (mit Sleep() geht das am einfachsten) oder mehrfach und ggf. mit verschiedenen Funktionen Ereignisse abfragen (kritisch s. o.)

  • Ich weis nicht wie ich Controlclick anwenden muss

    • Andy
    • 15. August 2013 um 22:22

    Hi,
    der Controlclick-Befehl funktioniert einwandfrei...
    Definitiv liegt es nicht am ControlClick(), sondern an dem, der diesen Befehl nicht richtig anwendet!

    Zitat

    Kann mit jemand sagen was ich falsch gemacht habe?

    Wie jetzt, also gehst du doch davon aus, dass DU den Fehler verursachst?! Wieso schreibst du das dann nicht so in die Überschrift zum Thread anstatt den Programmierern von AutoIt "die Schuld" zuzuschieben? ?(

    Schau dir mal die Parameter genauer an, und nimm den "Advanced Class" als Parameter ;)

    [autoit]

    ControlClick("Piriform CCleaner", "", "CLASS:Button; INSTANCE:2")

    [/autoit]


    dann noch (siehe Hilfe) den Button (links/rechts) und die Anzahl der Klicks uswusf

  • Wechselnde ControlID und Instanz

    • Andy
    • 15. August 2013 um 09:29

    Hi,

    Zitat

    Ist doch etwas seltsam oder. Ist das Prog, das ich steuern will vielleicht einfach scheiße geschrieben, dass die Controls nicht sauber abgebaut werden oder sowas?

    Willkommen in der Windows-Welt!
    Die meisten von M$ oder deren Programmiersprachen erstellten Programme kümmern sich einen SCHEISS! um die von M$ "vorgegebenen" Windows-Konventionen! Da werden in den Fenstern irgendwelche esoterischen (teilw. Browser ! ) - Plugins verwendet um Listen, Tabellen und deren Controls zu verwenden um jeden Zugriff auf den Inhalt wirkungsvoll zu verhindern, "Tastatursteuerung" (bspw. Tab führt ins nächste Edit/Feld/Menüpunkt/Button) wird völlig ignoriert und schlussendlich findet man heraus, dass es "eindeutige Handles" garnicht gibt (s. quote) !
    Und das wird alles nicht besser, sondern in letzter Zeit schlimmer...den "neuen" tollen Programmiersprachen sei Dank...
    Ich habe wohl oder übel in letzter Zeit dienstlich wieder häufiger auf "PushTheButton" (sic) zurückgreifen müssen, weil eine Automatisierung auf anderem Weg garnicht möglich ist/war ;(

  • Ca. 500 € Laptop Kaufberatung

    • Andy
    • 15. August 2013 um 07:38

    Hi,
    habe mir im letzten Jahr einen Samsung NP305E7A-S01DE geschossen für 450€ incl Win7-64.
    17´´ mattes Display, Quadcore A6-3450 mit integrierter Grafik Radeon 6520G und zusätzlichem Grafikchip Radeon 7400M, zufriedenstellender Tastatur, im Standardbetrieb lautloser Lüfter und per Mausklick (ich hasse Touchpads) anpassbarerem Takt (400MHz bis 2.7Ghz) und somit Laufzeit bis zu 5.5h.
    Der Prozessor ist für alle bisherigen Aufgaben völlig ausreichend, bei Grafikanwendungen werden die beiden Grafikchips im Verbund geschaltet und erlauben auch das eine oder andere Gerendere/Gezocke...
    Ich würde das Gerät nicht mehr eintauschen wollen.
    Für jemanden, der auf die Grafikanwendungen(fast) völlig verzichten kann, wäre einer der neuen Intel-Chips sicher interessant, allerdings ist das Preis/Leistungsverhältnis bei AMD bei weitem besser...
    Für vergleichbare Rechenleistung/Ausstattung/Display ist bei Intel der übliche "Marktführer"-Aufschlag von 100-150€ fällig!

  • C++ Dll & Autoit

    • Andy
    • 13. August 2013 um 12:01

    Bei M$ kann man den 64-Bit-Compiler auch in das kostenlose Visual Studio einbinden
    http://msdn.microsoft.com/en-us/library/…s(v=vs.90).aspx

  • DHCP Client emulieren

    • Andy
    • 13. August 2013 um 06:56

    misterspeed,
    sehr schön erklärt und auch fein aufbereitet! :thumbup:
    Das auseinanderfrickeln von derart komplizierten Protokollen ist schon eine Heidenarbeit für sich, bei unbekannten Protokollen bzw. Formaten kommt noch das Testen und Reingeneering dazu 8o , das tu ich mir aber heutzutage nur noch bei einfachen Sachen an^^

    Allerdings beobachte ich den Thread seit dessen Erstellung :rolleyes:
    Der TE hat ein Problem, welches er nicht mal ansatzweise äussert. Es ist immer noch nicht klar, wieso und weshalb überhaupt WAS gemacht werden soll....
    Und wenn ich dann lese

    Zitat

    Leider gibt es in dem RFC keine eindeutige Syntax, so wie "DHCPDISCOVER [param1] [param2]" oder so.
    Nur gaannnzz viel Text
    Kann man so etwas in der Art irgendwo finden?

    ist mir schon klar, dass wieder mal "der Arm aus der Sonne gelegt" werden soll.
    Die RFC zum Thema listen definitiv alles auf, was an Informationen benötigt wird. Wieso findest DU die Informationen in dem "gaaaanzzz viel Text", der TE aber nicht? Wieso kannst du Scripte zur Verdeutlichung erstellen, der TE aber nicht?

    Wieder mal ein schönes Beispiel dafür, dass die c&p-Generation nicht in der Lage ist, aus Bergen von Informationen (RFC, Wiki, google) das Gesuchte rauszuziehen :huh:

  • C++ Dll & Autoit

    • Andy
    • 12. August 2013 um 18:56

    Hi,

    Zitat

    Üblicherweise ist entweder dein Programm mit allen DLLs 64 bit oder alles ist 32 bit.

    kann man so stehen lassen^^

    Allerdings gibt es noch eine weitere Möglichkeit, eine Dlll gleichzeitig für 32+64Bit zu verwenden!
    Die Funktionen in der Dll werden dann nicht direkt angesprungen, sondern über eine Art "Wrapper". Dieser erkennt Anhand des Aufrufs und der Konventionen, ob ein 32-Bit- oder 64-Bit-Call vorliegt und springt dann die eigentliche Funktion mit den "richtigen" Parametern an.
    Imho aber überflüssig, da es wohl nur bei SEHR speziellen Funktionen einen Vorteil von 64- zu 32-Bit-Funktionen gibt.
    2 Dll´s, eine als dll32 und die andere als dll64 compiliert und damit hat es sich idR....

  • Image Host | Bitte um Meinung

    • Andy
    • 12. August 2013 um 09:47

    Einfach, Usability 100% !
    :thumbup:

  • Absurder For-Schleifen Verlauf bei floats in 3.3.8.1 (Stable)?

    • Andy
    • 3. August 2013 um 16:09

    AspirinJunkie,

    Zitat

    Das Ergebnis wird hier lediglich gerundet.

    Na, dass weiss ich doch!! :D
    Daher auch mein Statement:

    Zitat

    Die Frage bleibt aber, ob der Prozessor richtig rechnet oder das Ergebnis "richtig" dargestellt wird

    was ehrlich gesagt aber völlig unerheblich ist, denn das was "dort steht" ist per definitionem erstmal richtig (s. BILD-Zeitung).
    Es bleibt anderen überlassen, die Darstellung zu interpretieren bzw. "richtiges" von "falschem" zu unterscheiden!
    Würde das Consolewrite() die von dir genannte printf()-Funktion nutzen, wäre der "Fehler" im Startpost niemals aufgefallen, er hätte aber weiterhin bestanden!!! Oder doch nicht?

    Denn wie James in seinem Beispiel gezeigt hat, macht diese Diskussion nur dann Sinn, wenn die Anzahl der relevanten Nachkommastellen im Vorfeld festgelegt wird.
    Wenn ich mit

    [autoit]

    For $i = 2 to 3.5 Step 0.025

    [/autoit]

    definitiv 3 Nachkommastellen festlege, dann MUSS! in der nächsten Zeile

    [autoit]

    $i=round($i,3)

    [/autoit]

    oder eine Entsprechung auftauchen, alles andere führt zu verfälschten Ergebnissen!

    Die Frage stellt sich nun, warum der Compiler/Interpreter das nicht weiss ;)

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™