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

Beiträge von misterspeed

  • Autoit EXE an Taskleiste anheften (Windows 7)

    • misterspeed
    • 29. September 2012 um 10:05

    Noch nie gehört, ist ja der Hammer...


    Der Vollständigkeit halber hier ein Link von MS zum Thema, demnach kann man diesen wirklich tollen "Schutz" ganz simpel durch Setzen oder Löschen von Registry Einträgen aushebeln:

    http://social.technet.microsoft.com/Forums/en-US/w…c-91bcd2a98445/


    EDIT: Verdammt der Thread hier ist ja noch von 2010... naja denkemal das Thema ist dennoch noch aktuell für den ein oder anderen und betrifft vielleicht auch Windows 8.

  • Brauche Resourcenspaarende Variante um eine Exel Tabelle einzulesen.

    • misterspeed
    • 28. September 2012 um 19:29
    Zitat von Techmix

    misterspeed: Bei wirklich GROSSEN CSV-Dateien ist diese Möglichkeit viiiiel schneller als mit _FileReadToArray - Da ich einfach Fileread verwende und anschliessend eben mit StringSplit trenne.

    Glaube ich dir prinzipiell, allerdings macht _filereadtoarray() so ziemlich das selbe. Der Unterschied ist, dass deine Funktion z.B. nur auf @CRLF splitten kann. Besitzt die CSV hingegen lediglich @LF oder @CR für den Zeilenumbruch, was leider nicht selten so ist, dann würde deine Funktion scheitern, _filereadtoarrray hingegen nicht. Das mag zwar etwas langsamer, dafür aber auch zuverlässiger sein. Ein weiterer Nachteil deiner Lösung könnte die Nutzung von _arraydelete() sein, dürfte btw auch unnötig sein den Eintrag zu löschen, da man die Indizes auch anderweitig anpassen kann. Wenn ich mich recht entsinne glänzt diese Funktion auch nicht unbedingt durch Performance, müsste man aber testen. Nicht böse gemeint, viele Wege führen nach Rom, die einen schneller, die anderen zuverlässiger.

  • Brauche Resourcenspaarende Variante um eine Exel Tabelle einzulesen.

    • misterspeed
    • 28. September 2012 um 18:46

    Also mal grundlegendes zur Performance und RAM Verbrauch:

    20mb RAM Verbrauch sind nicht wirklich viel und meiner Meinung nach akzeptabel, schon alleine deswegen, weil RAM Zugriffe bedeutend schneller als Festplattenzugriffe sind und du die Daten ja scheinbar noch aufbereiten und mit den SQL Tabelleninhalten abgleichen willst.


    Daher würde ich wie folgt vorgehen:

    1. Du brauchst ein Array. Da du von CSV Strukturen sprichst sinnvollerweise ein 2D Array. Dieses beinhalte den kompletten Dateiinhalt der jeweils relevanten Datei.
    2. Du liest die Datei in einem Rutsch mit _filereadtoarray ein und machst dir daraus ein 2D Array, Alternativ direkt per fileRead und stringsplit auf Zeilenumbrüche, was evtl ein kleiner Performace vorteil ist.
    3. Jetzt durchläufst du das CSV Array, bevorzugt nur einmal, da jeder Durchlauf wertvolle Zeit kostet.
    4. Während des Durchlaufs machst du deine Vergleiche und schreibst in die relevanten Tabellen sofern notwendig. Du kannst ja jeden CSV Datensatz problemlos mit multiplen Tabellen abgleichen.
    5. Sobald die CSV Datei abgearbeitet ist wird das 2D Array gelöscht und die nächste CSV eingelesen, RAM Verbrauch wächst nicht an und ist immer nur von der Dateigröße und Datensatzanzahl der aktuellen CSV abhängig, da der alte Inhalt der vorherigen Datei nicht mehr benötigt und gelöscht wird.

    Fertig, alle SQL Tabellen mit allen Dateien synchronisert.

    Hier ein Beispiel zum CSV einlesen und dem möglichen Aufbau im allgemeinen: Nicht getestet, auch nicht das CSV parsing, sorry keine Zeit gerade...

    Spoiler anzeigen
    [autoit]


    #include <array.au3>
    #include <file.au3>

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

    Global $aCSVfileList = _FileListToArray(@ScriptDir,"*.csv",1) ; liste der CSV Filenames

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

    for $i=1 To $aCSVfileList[0]
    _syncDB(@ScriptDir & "\" & $aCSVfileList[$i])
    Next

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

    Func _syncDB($csvFile)
    Local $aCSV2D[1][1]
    _csvTo2DArray($csvFile,$aCSV2D)
    Local $tableString = _getTablesForCSV($csvFile) ; bsp: "Table1|Table3|Table11"

    ; sofern nicht schon beim einlesen würdest du dann hier das 2d Array durchlaufen und den SQL Abgleich vornehmen
    for $i = 0 To UBound($aCSV2D)-1
    for $j = 0 to ubound($aCSV2D,2)-1
    ;sqlstatements für die jeweilegen Datensätze, je nach tabelle vllt auch noch mit switch case oder vergleichbarem arbeiten
    _addSQL($aCSV2D[$i][$j],$tableString) ; dorf prüfste vorher ob vllt schon vorhanden, oder veraltet... und nutzt das korrekte sql statment
    Next
    Next


    EndFunc

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

    Func _csvTo2DArray($csvFile,ByRef $a2D,$delim = ";")
    Local $aCSV
    _FileReadToArray($csvFile,$aCSV)
    ;_arraydisplay($aCSV) ; debuging

    Local $aTemp = StringSplit($aCSV[1],$delim)
    Local $col = $aTemp[0]

    ReDim $a2D[UBound($aCSV)-1][$col]

    For $i=1 To $aCSV[0]
    $aTemp = StringSplit($aCSV[$i],$delim)
    If $aTemp[0] < 2 Or $aTemp[0] > $col Then
    if $aTemp[0] < 2 Then ConsoleWrite("parse error: no split possible for " & $aCSV[$i] & @CRLF)
    if $aTemp[0] > $col Then ConsoleWrite("parse error: split returned more columns as allowed for " & $aCSV[$i] & @CRLF)
    ContinueLoop
    EndIf

    For $j=1 to $aTemp[0]
    $a2D[$i-1][$j-1]=$aTemp[$j]
    ; hier könnte btw auch schon der Abgleich mit den SQL Tabellen erfolgen,
    ; würde einen erneuten Arraydurchlauf sparen und das 2d Array wäre bereits nach Funktionsende überflüssig oder müsste garnichterst erstellt werden
    Next
    next
    ;_arraydisplay($a2D) ; debuging
    EndFunc

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

    Func _getTablesForCSV($csvFile)
    switch $csvFile
    case @ScriptDir & "\preise.csv"
    $tables = "Table1|Table3|Table11"
    Case @ScriptDir & "\firmen.csv"
    $tables = "Table5|Table7"
    ;case ...
    endswitch

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

    return $tables
    EndFunc

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

    Func _addSQL($data,$tableString)
    $aTemp = StringSplit($tableString,"|")
    for $i = 1 to $aTemp[0] ; für jede relevante tabelle in Bezug auf die CSV
    ; prüfen und richtiges sqlstatement
    ; statemnts könnten in einem array gesammelt werden und dann in einem rutsch mit
    ; einer executeSQLstatemnts() Funktion evtl zusammengefasst und optimiert ausgeführt werden...
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • (mal wieder ein) Timer Problem

    • misterspeed
    • 28. September 2012 um 17:07
    Zitat von Micha_he

    ... und in dem script aus #3 wird der Timer in der "äußeren" Do-Until-Schleife immer wieder mit dem TimerInit() zurückgesetzt, bis die Schleife auf Grund des beendeten Downloads verlassen wird. Daher erhältst Du immer nur einige ms.

    Nein das Timer Zurücksetzen dürfte nicht das eigentliche Problem sein, da die "do until" Schleife durch die "while" Schleife solange "pausiert" wird bis letztlich die Abbruchbedingung für die "do until" Schleife erreicht wird und somit, sofern es denn funktionieren würde, der Timer nur solange in der "do until" Schleife resetet wird bis der Upload tatsächlich startet, was prinzipiell ja nicht verkehrt wäre. Funktioniert aber nur dann wenn die Abbruchbedingung der "do until" nicht von vornherein schon gegeben ist und sich im ersten Durchlauf auch nichts daran ändert, so wie ich das in meinem Posting mal gemutmaßt habe.

    Wie gesagt ich bezweifle, dass der Mauscursor alleine ein zuverlässiges Kriterium sein kann.

  • TimerDiff/TimerInit will nicht mit großen Zahlen rechnen

    • misterspeed
    • 28. September 2012 um 16:30

    Freut mich, dass du auch noch andere Sprachen lernst und zumindestens die Grundlagen der Programmierung geläufig sind. Dann sollte Autoit ja keine besondere Herausforderung sein, sehr ähnliche Syntax wie PHP. Allerdings gebe ich zu, dass ich selbst nie wirklich PHP gelernt habe und nur ein wenig JAVA und C behersche. Autoit ist meiner Meinung nach die einzige Sprache in der ich sehr gute Kenntnisse habe. Nach mehreren Jahren Autoit fällt es einem aber auch wesentlich leichter sich auf andere Sprachen einzulassen und man weiß in etwa nach was man suchen muss wenn man bestimmte Dinge in der fremden Sprache umsetzen will.

    Kleiner Nachtrag noch zum aktuellen Script, weils mir eben aufgefallen ist...

    Dir fehlen Includes für die GUI wenn du meinen Vorschlag mit der Button (de)aktivierung umsetzen willst. In der Hilfe zu guictrlsetstate() sollten diese im Beispiel vorhanden sein. Wenn ich mich recht entsinne brauchst du für die Konstante $GUI_DISABLE usw. das #include <GUIConstantsEx.au3>.

    Bezüglich meiner Abneigung gegen Privatsupport habe ich dir ja bereits in deiner PN geantwortet.

  • TimerDiff/TimerInit will nicht mit großen Zahlen rechnen

    • misterspeed
    • 28. September 2012 um 14:59

    Nein warum sollte ich dich für dumm halten. Sieh es einfach als wertvolle Wissenserweiterung durch jemanden der wesentlich länger Erfahrung mit Autoit hat und ähnliche Programme schon viele male geschrieben hat.
    Um Arrays und Schleifen wirst du auf Dauer jedenfalls nicht rumkommen, wenn du ernsthaft programmieren willst, weder in Autoit noch in anderen Sprachen. Das sind 2 wesentliche Grundfunktionen einer jeden Programmiersprache und sollten frühst möglich verstanden werden. Dazu findest du hier im übrigen auch anwenderfreundliche Tutorials (glaube von Bugfix).

    Wie dem auch sei, viel Erfolg beim Autoit erlernen. ;)


    PS: Ich hatte meinen Beitrag noch einige male editiert nachdem du gepostet hast, vielleicht nochmal anschaun oder einfach fragen wenn manche Dinge so für dich unklar sind. Schliessen brauchst du den Thread nicht, editiere einfach deinen ersten Beitrag und setze das Threadpräfix von "offen" auf "gelöst".

  • TimerDiff/TimerInit will nicht mit großen Zahlen rechnen

    • misterspeed
    • 28. September 2012 um 14:22

    Ich steig zwar noch nicht ganz durch, aber mal paar Dinge die mir aufgefallen sind und erstmal nichts mit der eigentlichen Berechnung zu tun haben:

    1. Die Variablen $Pause und $Gesamt sind nicht deklariert, siehe Warnung von Scite Syntax check
    2. Ein Arbeitstag sollte zwar nicht mehr als 24h haben, aber darf doch gerne auch mehr als eine Pause haben oder nicht? Jedenfalls erlaubst du mehrere Pausenstarts verhaust dir dabei aber deine csv Struktur und gibst einen falschen Gesamtpausenwert in der ini (und csv?) an.
    3. Deine CSV wird auch bei Feierabend verhunzt, weil hier eines der doppelten "Semikolons" fehlt (bin ich gerade unsicher, da du scheinbar teilwerte mit einem einzelnen semikolon trennst... kA sieht komisch aus). Allgemein ist es ungewöhnlich ein doppeltes Trennzeichen zu verwenden und nicht wirklich konform mit einer CSV. Ein einfaches ohne Leerzeichen zwischen den Werten würde eher dem gängigen Schema entsprechen


    Allgemein verstehe ich noch nicht ganz wozu du überhaupt ini und csv brauchst. Die ini scheint ja nur temporär zu sein und wird bei jedem Arbeitsbeginn überschrieben, also unnötig?


    Hier mal eine Struktur die ich vorschlagen würde:

    in der csv speicherst du nur folgende Dinge und zwar nicht bei jeder Aktion, sondern erst bei Feierabend.

    Code
    Datum;Arbeitsbeginn;Feierabend;PausenzeitGesamt;AnzahlDerPausen;AnwesenheitGesamt;AnwesenheitAbzüglichPause
    28.09.2012;13:22:43;13:27:43;00:00:30;1;00:05:00;00:04:30

    Im Script selbst arbeitest du am besten mit einem Array, welches folgende Infos enthält und während dem Scriptverlauf aktualisiert wird:

    [autoit]


    global $aDate[7]
    $aData[0]="hier steht das heutige Datum" ; wird bei Programmstart ins Array geschrieben
    $aData[1]="hier steht die Uhrzeit Arbeitsbeginn" ; wird bei Arbeitsbeginn ins Array geschrieben
    $aData[2]="hier steht die Uhrzeit Feierabend" ; wird am Ende bei Feierabend ins array geschrieben
    $aData[3]="hier steht die Gesamtzeit aller Pausen" ; muss bei jedem Pauseende mit der vorherigen Pausenzeit addiert werden (timeadd oder dateadd oder sowas gibts denke ich.... ???)
    $aData[4]="hier steht die Gesamtanzahl der Pausen" ; ubound($aPause)-1 --> bei der 2D Array Variante, siehe unten
    $aData[5]="hier steht die Differenz von Arbeitsbeginn und Ende" ; wird bei Feierabend ins Array geschrieben
    $aData[6]="hier berechnest du die Differenz von der Gesamtzeit minus der Pausenzeit" ; wird auch erst bei feierabend geschrieben

    [/autoit]

    als zweites Array würde ich noch ein Pausenarray einplanen:

    [autoit]


    global $aPause[3]
    $aPause[0]="Start aktuelle Pause" ; wird bei jedem Pausenstart neu gesetzt
    $aPause[1]="Ende aktuelle Pause" ; wird bei jedem Ende der Pause neu gesetzt
    $aPause[2]="Summe der Pausenzeiten" ; wird immer aktualisiert wenn die Pause beendet wird (dateadd/timeadd... ???)
    ;eigtl unnötig, wir haben im data array ja bereits eine Pausengesamtzeit, kannst das Pausenarray also theoretisch auch mit 2 simplen variablen für start und Ende ersetzen... und die summe dann immer im aData array ersetzen...

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

    ;alternativ und vorallem besser wäre ein 2d array, in dem du jede pause mit den einzelzeiten speicherst und diese dann am ende in aData in addierter Form ausgibst:

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

    global $aPause[1][3]

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

    $aPause[0][0]="Start Pause"
    $aPause[0][1]="Ende Pause"
    $aPause[0][2]="Pausenzeit"

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

    ;neue Pause hinzufügen:

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

    redim $aPause[ubound($aPause)+1][3] ; macht dein array eine Zeile größer

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

    $aPause[ubound($aPause)-1][0]="Start Pause 1" ; schreibt jeweils in die neue und letzte Zeile des Arrays...
    $aPause[ubound($aPause)-1][1]="Ende Pause 1" ; schreibt jeweils in die neue und letzte Zeile des Arrays...
    $aPause[ubound($aPause)-1][2]="Pausenzeit 1" ; schreibt jeweils in die neue und letzte Zeile des Arrays...

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

    ;usw.

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

    ;am Ende dann die Pausenzeiten in einer Schleife addieren und in $aData vermerken:

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

    dim $pauseTimeTotal="00:00:00"
    for $i=1 to ubound($aPause)-1
    $pauseTimeTotal = _dateAdd($pauseTimeTotal,$aPause[$i][2]) ; achtung pseudocode, bitte hilfe auf richtigen funktionsnamen und parameter anwendung prüfen...
    next
    $aData[3]=$pauseTimeTotal
    $aData[4]=ubound($aPause)-1

    [/autoit]

    Der Button zum Pause starten sollte im übrigen deaktiviert werden, wenn eine Pause bereits läuft und noch nicht beendet wurde, genauso wie der Button zum Beenden der Pause deaktiviert werden sollte wenn garkeine Pause läuft. Das Selbe gilt für Feierabend und Arbeitsbeginn. Nur so kannst du fehlerhafte Dateneingaben verhindern.

    [autoit]


    guictrlsetstate($control,$GUI_DISABLE)
    guictrlsetstate($control,$GUI_ENABLE)

    [/autoit]


    Vorteil ist:

    Du kannst jetzt bei Programmende z.B. prüfen ob überhaupt der Arbeitstag ordentlich beendet wurd, wenn nicht fehlen noch Arrayeinträge.
    Der Arbeitstag kann nur beendet werden wenn zuvor die Pause beendet wurde.
    Ausserdem würde ich noch eine Funktion schaffen um die Pausenzeit zu korriegieren, wenn "Pause beenden" vergessen oder zu spät gedrückt wurde. In Verbindung mit dem 2D Array könntest du das sekundengenau anhand der Start und Endzeit machen und die Summe neu berechnen lassen. Ist aber erstmal nicht so wichtig. Schön wäre zusätzlich noch ein Counter der permanent die Differenz zwischen aktueller geleisteter Arbeitszeit und der Regelarbeitszeit angibt, so dass man sieht wann man endlich den schönen Feierabend Button drücken darf. Aber auch das wäre nur eine Spielerei.

    Bei Programmende oder Feierabend schreibst du dann deine CSV durch aneinanderreihen der Arrayeinträge:

    [autoit]


    $dataString=""
    for $i=0 to ubound($adata)-1
    $dataString &= $aData[$i] & ";"
    next
    filewrite($csv,stringtrimright($dataString,1) & @crlf) ; stringtrimright entfernt das letzt semikolon, weil zuviel...

    [/autoit]

    Um das ganze perfekt zu machen bastelst du dir dann noch eine Listviewübersicht die dir die geammelten Daten der CSV schön übersichtlich und nach Monat filterbar anzeigt und vielleicht noch statisch auswertet, wie durchschnittliche Pausenzeit / durchschnittliche Pausenanzahl pro Tag / Minus oder Plusstunden zur Regelarbeitszeit usw. Jaja alles sehr aufwendig und jedemenge Arbeit, aber nett wäre es jedenfalls ;)

  • TimerDiff/TimerInit will nicht mit großen Zahlen rechnen

    • misterspeed
    • 28. September 2012 um 12:43

    Man kann sich die eigene Umrechnung aber auch etwas vereinfachen und auf das Abschneiden von Nachkommastellen via int() verzichten, wenn man datediff() einfach mehrmals aufruft und die Ergebnisse zusammensetzt. Erleichtert wie bei mir z.B eine fallabhängiege Ausgabe im passenden Format. Bei mir war es nicht wichtig immer eine sekundengenaue Zeit anzugeben, weil das Programm teils wochenlang läuft und dann Tag + Stunden völlig ausreichen. Die Lösung von Mars schaut auf den ersten Blick aber auch fehlerfrei aus und liefert vermutlich korrekte Ergebnisse. Allerdings fehlen bei ihm die Tage in der Ausgabe, sofern das für dich relevant sein sollte.

    Spoiler anzeigen
    [autoit]


    #include <date.au3>

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

    Global $totalRuntime = _NowCalc()

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

    sleep(3000)
    $tString1 = getFormatedTimeDiff($totalRuntime)

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

    sleep(60000)
    $tString2 = getFormatedTimeDiff($totalRuntime)
    msgbox(0,"","diff1: " & $tString1 & @crlf & "diff2: " & $tString2 & @crlf)

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

    func getFormatedTimeDiff($time)

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

    local $timeString, $now, $days, $hours, $minutes, $seconds

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

    $now = _NowCalc()

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

    $days = _DateDiff( 'D',$time,$now)
    $hours = _DateDiff( 'h',$time,$now)
    $minutes = _DateDiff( 'n',$time,$now)
    $seconds = _DateDiff( 's',$time,$now)

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

    If $days < 1 Then
    If $hours < 1 Then
    If $minutes < 1 Then
    $timeString = $seconds & " seconds."
    Else
    $timeString = $minutes & " minutes and " & $seconds-($minutes*60) & " seconds."
    EndIf
    Else
    $timeString = $hours & " hours and " & $minutes-($hours*60) & " minutes."
    EndIf
    Else
    $timeString = $days & " days and " & $hours-($days*24) & " hours."
    endif

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

    return $timeString
    endfunc

    [/autoit]

    EDIT: Dein Script habe ich noch nicht angesehn. Kann ich also gerade auch noch nichts dazu sagen was schief läuft...
    EDIT2: Auf den ersten Blick denke ich aber, dass Mars Lösung eher für dich geeignet ist.

  • (mal wieder ein) Timer Problem

    • misterspeed
    • 27. September 2012 um 16:06

    Und was passiert wenn der Cursor <>1 ist wenn du die do until Schleife betrittst und 100ms nicht ausreichen bis sich der cursor ändert?

    Du startest den Timer, der Cursor ist <>1.
    Du schläfst 100ms.
    Deine while Schleife wird direkt übersprungen. weil der cursor <> 1 ist und die Bedingung nicht erfüllt ist.
    Deine do until Schleife wird ebenfalls verlassen, weil die Bedingung erfüllt ist.

    Ergebnis: eine Zeit im 100ms Bereich mit kleiner Abweichung, weil die Timer eben nicht 100% genau sind.

    Davon ab noch einige Anmerkungen:

    1. kann man externe Fenster mit den Window Managment Funktionen wie controlclick, controlsend oder controlcommand und viele weitere sehr viel besser und zuverlässiger steueren als mit mouseclick oder send
    2. sleeps sind ebenfalls unzuverlässig, besser benutzt man Funktionen wie winwait, winexists oder wingettitle um auf eine Veränderung zu warten und den nächsten Script Schritt zu starten
    3. ist der mousecursor vermutlich kein zuverlässiger Indikator für einen erfolgreichen Upload. Was passiert, wenn ein anderes Programm oder Windows dazwischen funkt und den Mauscursor verändert? Ich denkemal, dass es viel besser wäre den Windowtext oder title des Progressfensters zu überwachen, sofern es sowas geben sollte.

  • Möglichst faules speichern von Einstellungen

    • misterspeed
    • 27. September 2012 um 15:35

    Wie im anderen Thread kein lauffähiges Beispielscript mit gui und Speicher / Lese Funktion. Ich bastel mir den Kram nicht selbst zusammen...
    Davon ab hast du doch bereits Tipps/Lösungen bekommen, die du mit "geht nicht" kommentiert hast. Was erwartest du ohne Testscript und einer nichts sagenden Fehlerbeschreibung?

  • TrayCreate Item, Restart, Exit

    • misterspeed
    • 26. September 2012 um 13:12
    Zitat von General Kaboom

    Du kannst aber ein Programm nicht beenden, und es trotzdem eine meldung anzeigen lassen.

    Klar kann ich das, aber hat ja nix mit dem Thema zu tun und ich mache auch nichts derartiges in meinen Beispielen...

    Zitat von General Kaboom

    In diesem Fall wäre das Programm selbst nicht gestoppt, es würde lediglich in einer endlosschleife auf einen Buttonpress warten

    Ist ja wohl auch beabsichtigt. Er will seine Funktion im Fehlerfall neustarten, oder abbrechen können und nicht das Script ansich beenden. Zum beenden hat er schliesslich seinen exit Button im Tray... ohne seine Funktion kann ich aber auch nur spekulieren was er denn nun genau haben möchte.

  • TrayCreate Item, Restart, Exit

    • misterspeed
    • 26. September 2012 um 13:04
    Zitat von DanielZ86

    Es läuft, aber noch nicht so wie ich es mir vorgestellt habe.
    Ich möchte falls ein Fehler aufrtitt bsp. Windows meldet Datei in Benutzung oder ähnliches, sodass mein Skript nicht weiter läuft das ich trotzdem auf Restart klicken kann und das mein Skript wieder von vorne beginnt.
    Kurzfassung: Skrip wird ausgeführt---Fehlermeldung von Windows----Skript stoppt---Mit Restart neu starten.

    Geht natürlich auch und wäre bedeutend besser als das Script komplett zu beenden und neuzustarten. Poste doch einfach dein eigentliches Script. Am besten gleich in das Beispielscript als Funktion einbauen...

  • TrayCreate Item, Restart, Exit

    • misterspeed
    • 26. September 2012 um 12:57
    Zitat von General Kaboom

    Ich vermute bei RUN nach If @Compiled.
    Was das zweite soll bin ich mir nicht sicher...vieleicht sollte dort eine Funktion rein um das Skript zu kompilieren ö.Ö

    Hä? Wenn du willst, dass sich ein Script selbst neustartet, dann musst du dafür eine Fallunterscheidung zwischen kompilierten und nicht kompilierten Zustand machen, weil im nicht kompilierten Zustand nicht einfach die au3 direkt ausgeführt werden kann, sondern der autoit interpreter zum interpretieren der au3 benötigt wird. Nichts anderes mache ich an besagter Stelle. was den Neustart an sich betrifft würde ich aber auch mal den Sinn hinterfragen, denn normalerweise gibt es auch andere und bessere Wege um ein Script wieder auf Ursprungszustand zurückzusetzen.

    Da er aber bisher kein richtiges Script hat kann man auch schlecht Alternativen vorschlagen.


    Zitat von DanielZ86


    Danke.
    Wo oder wie platziere ich jetzt mein Skript(das eigentliche Skript).
    Irgendwie stehe ich auf dem Schlauch.

    Kommt ja drauf an was für ein Script. Wenn du alles per traymenü machen willst füge eben mehr Menüpunkte hinzu und rufe in deiner switch case Abfrage eine Funktion zum Menüpunkt auf.
    Wenn du zusätzlich eine GUI haben willst, dann erstell eben eine vor deiner while Schleife.

    Beispiel für neue Funktion:

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon

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

    $restartCounter = 0
    If $cmdline[0]=1 Then $restartCounter=$cmdline[1]

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

    Opt("TrayMenuMode",1)
    $Restart = TrayCreateItem("RESTART")
    $test = TrayCreateItem("TEST")
    $Exit = TrayCreateItem("EXIT")
    TraySetState()

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

    if $restartCounter > 0 Then TrayTip ( @ScriptName, "Das Script wurde bereits zum " & $restartCounter & ". mal neu gestartet.",10)

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

    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = $Restart
    restart()
    Case $msg = $test
    meintest()
    Case $msg = $Exit
    Exit
    EndSelect
    WEnd

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

    func meintest()
    msgbox(0,"test","blahblah")
    endfunc

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

    func restart()
    $restartCounter += 1
    If @Compiled Then
    ;ConsoleWrite('"' & @ScriptFullPath & '" ' & $restartCounter & @CRLF)
    Run('"' & @ScriptFullPath & '" ' & $restartCounter)
    Else
    ;ConsoleWrite('"' & @AutoItExe & '" "' & @ScriptFullPath & '" ' & $restartCounter & @CRLF)
    run('"' & @AutoItExe & '" "' & @ScriptFullPath & '" ' & $restartCounter)
    EndIf
    Exit
    endfunc

    [/autoit]
  • TrayCreate Item, Restart, Exit

    • misterspeed
    • 26. September 2012 um 12:12

    Hier mal was das funktioniert ;)

    Spoiler anzeigen
    [autoit]


    #NoTrayIcon

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

    $restartCounter = 0
    If $cmdline[0]=1 Then $restartCounter=$cmdline[1]

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

    Opt("TrayMenuMode",1)
    $Restart = TrayCreateItem("RESTART")
    $Exit = TrayCreateItem("EXIT")
    TraySetState()

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

    if $restartCounter > 0 Then TrayTip ( @ScriptName, "Das Script wurde bereits zum " & $restartCounter & ". mal neu gestartet.",10)

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

    While 1
    $msg = TrayGetMsg()
    Select
    ; Case $msg = 0 ; unnötig
    ; ContinueLoop
    Case $msg = $Restart
    $restartCounter += 1
    If @Compiled Then
    ;ConsoleWrite('"' & @ScriptFullPath & '" ' & $restartCounter & @CRLF)
    Run('"' & @ScriptFullPath & '" ' & $restartCounter)
    Else
    ;ConsoleWrite('"' & @AutoItExe & '" "' & @ScriptFullPath & '" ' & $restartCounter & @CRLF)
    run('"' & @AutoItExe & '" "' & @ScriptFullPath & '" ' & $restartCounter)
    EndIf
    Exit
    Case $msg = $Exit
    Exit
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • flexibler Variabelname für Gui

    • misterspeed
    • 26. September 2012 um 11:28

    Genau. In eine Schleife verpackt schauts dann so aus:

    [autoit]


    for $Z = 1 to $K_Array[0][0]
    $K_Array[$Z][0]=GUICtrlCreateCheckbox("export", $K_Array[$Z][1], $K_Array[$Z][2], $K_Array[$Z][3], $K_Array[$Z][4])
    next

    [/autoit]
  • Ini-Datei vor Lesern schützen

    • misterspeed
    • 25. September 2012 um 14:01

    Kannste bei M$ nachlesen:

    http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx

  • Autovervollständigung im GUICtrlCreateInput

    • misterspeed
    • 24. September 2012 um 23:51

    Verschiedene Formatierungen wie z.B. zwei Farben kannste nur mit richedit Feldern machen.

    Die Autovervollstämdigung selbst ist kein Problem. Brauchst halt ein Array das du bei jeder Inhaltsänderung des Edits durchläufst und die Anfangsbuchstaben mit dem Inhalt des Edit vergleichst. Sobald der Edit String mit den Anfangsbuchstaben eines Arrayeintrages übereistimmt schreibst du den Treffer mit setdata ins edit. Sinnvoll wäre es auch den cursor danach wieder auf die richtige Position zu setzen. Und das edit während der Änderung kurz zu deaktivieren, damit niemand schreibt bevor der cursor wieder an richtiger Stelle ist. Soviel jedenfalls zur Theorie.

  • Trolled by variable?!

    • misterspeed
    • 24. September 2012 um 14:10
    Zitat von autoBert

    Im übrigen habe ich mir jetzt die Mühe gemacht und siehe da: immer noch kein Fehler:

    Öhm ja, weil du das LV befüllst bevor du wm_notify mit dem Fehler darin registrierst/ausführst. Da zattoo das LV in einer Funktion befüllt kann man vermuten, dass er wm_notify vorher registriert. Aber du hast natürlich recht, dass ohne Script grundsätzlich nur lustige Ratespiele möglich sind und ich für meinen Teil werde zattoo's Threads zukünftig ignorieren, wenn er keine brauchbaren Scripte postet. ;)

  • Ini-Datei vor Lesern schützen

    • misterspeed
    • 24. September 2012 um 13:48

    Grundsätzlich wie Autobert schon schrieb. Ich handhabe das so:

    Erstmal wird geprüft ob die ini existiert, wenn nicht wird eine mit vordefinierten Standardwerten erstellt.
    Danach werden alle Schlüssel geprüft. Im Quellcode befinden sich dafür alle erlaubten Werte für alle Schlüssel oder sofern keine festen Wertvorgaben möglich sind, eine Regel für die erlaubten Werte des Schlüssels.
    Sofern der Wert der ini keinem erlaubten Wert entspricht wird der definierte Standardwert genommen und glechzeitig auch in der ini auf Standard zurückgesetzt.
    Bei Zahlen oder Zahlbereichen ist das recht einfach, sofern nur boolean Strings "True/False" erlaubt sind ebenfalls sehr simpel.
    Wenn Dateipfade erlaubt sind rate ich zu einer Prüfung mit fileexists().
    Bei beliebigen Strings genügt eine Prüfung auf Sonderzeichen/Umlaute die ggf. ersetzt werden müssen und die Stringlänge.

    Hat man all diese Dinge geprüft wüsste ich nicht was ein Anwender noch groß falsch machen könnte um den Programmablauf zu stören.


    Um ein manuelles Verändern der ini zu verhindern muss man diese im übrigen nicht komplett verschlüsseln. Man könnte auch einen Zusatzschlüssel verwenden, welcher eine Checksumme aller Schlüssel enthält. Stimmt die Checksumme nicht wird die ini mit Standardwerten neu erstellt. Klar gilt auch hier, dass man theoretisch leicht durch decompilen an den Checksummen Algorythmus kommt und damit dann letzten Endes auch gültige Checksummen für eigene ini Dateien berechnen oder die Checksummen Prüfung einfach komplett deaktivieren kann.

  • Trolled by variable?!

    • misterspeed
    • 24. September 2012 um 13:12

    Ich habs mir eben echt überlegen müssen ob ich die Lösung posten soll, denn verdient haste es nicht...

    Autobert und alle anderen waren wohl blind. Der Fehler entsteht durchaus in der wm_notify Funktion die du gepostet hast. Zumindestens wenn du das nicht inzwischen selbst geändert hast nachdem ich dich bereits gestern darauf aufmerksam gemacht habe, dass du nachschauen sollst ob die Variable doppelt verwendet und somit überschrieben wird. (Punkt 1)


    [autoit]


    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListView.au3>
    #include <WindowsConstants.au3>

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

    $Form1 = GUICreate("Form1", 625, 443, 193, 125)
    $FileListView = GUICtrlCreateListView("test|test", 8, 8, 609, 409)
    _GUICtrlListView_SetColumnWidth($FileListView, 0, 175)
    _GUICtrlListView_SetColumnWidth($FileListView, 1, 441)
    GUISetState(@SW_SHOW)

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

    ConsoleWrite("ID: " & $FileListView & @CRLF)
    $FileListView = GUICtrlGetHandle($FileListView) ; da ist dein fehler aus wm_notify, du überschreibst die control id mit dem control handle...
    ConsoleWrite("Handle: " & $FileListView & @CRLF)

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

    $aDirContent=_FileListToArray(@ScriptDir)

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

    For $i=1 to $aDirContent[0]
    $debug=GUICtrlCreateListViewItem(@ScriptDir & "|" & $aDirContent[$i],$FileListView)
    ;ConsoleWrite($debug & @CRLF) ; <-- 0 = Fehler, siehe Hilfe
    next

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

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™