Listvieweintragung - Problem

  • Hallo

    Ich hatte schon vor einiger Zeit maleine Frage gestellt wegen meines Maus - Macro Rekorder. Damals wars mein Problem das zuviele Einträge bei einem Mausklick gemacht werden. Jetzt ist mein Problem in etwa umgekehrt :)

    Das Skript:

    Spoiler anzeigen
    [autoit]

    ;################Marco Rekorder################
    ;##################BlackFx#####################
    #include <WindowsConstants.au3>
    #include <Misc.au3>
    #include <GUIListView.au3>
    HotKeySet("{ESC}","_exit")
    Opt("GUIOnEventMode",1)
    Global $Status = 0
    ;-------------GUI Erstellen---------------
    $TitelGUI = GUICreate("Macro Tool - BlackFx",420,405,-1,-1,$WS_POPUPWINDOW)
    $font = "Arial"
    GUISetFont(8, 400, 0, $font)
    $StatusLabel = GUICtrlCreateLabel("Herzlich Willkommen ",160,385)
    GUICtrlCreateLabel("Status:",110,385)
    GUICtrlCreateButton("Aufnahme",30,60,85,25)
    GUICtrlSetOnEvent(-1,"_Aufnahme")
    GUICtrlCreateButton("Pause",30,90,85,25)
    GUICtrlSetOnEvent(-1,"_Pause")
    GUICtrlCreateButton("Stopp",30,120,85,25)
    GUICtrlSetOnEvent(-1,"_Stopp")
    GUICtrlCreateButton("Beenden",30,250,85,25)
    GUICtrlSetOnEvent(-1,"_exit")
    $BefehlLV = GUICtrlCreateListView("Befehl|Wert(e)",165,30,250,350)
    _GUICtrlListView_SetColumnWidth($BefehlLV,0,80)
    _GUICtrlListView_SetColumnWidth($BefehlLV,1,165)
    GuiSetState(@SW_SHOW,$TitelGUI)
    ;-----------/--GUI Erstellen--/------------
    ;------------- Funktionen ---------------
    while 1
    If $Status = 1 Then ;<===== Wenn Maustaste gedrückt, dann Eintrag in Listview mit Position und Rechts oder Links
    If _IsPressed(01) Then
    $pos = MouseGetPos()
    GUICtrlCreateListViewItem("MausL|"&$pos[0]&","&$pos[1],$BefehlLV)
    Do
    Sleep(10)
    Until Not _IsPressed(01)
    EndIf
    If _IsPressed(02) Then
    $pos = MouseGetPos()
    GUICtrlCreateListViewItem("MausR|"&$pos[0]&","&$pos[1],$BefehlLV)
    Do
    Sleep(10)
    Until Not _IsPressed(02)
    EndIf
    EndIf
    WEnd
    func _Aufnahme() ;<===== Starten der Aufnahme
    If $Status = 0 then _GUICtrlListView_DeleteAllItems($BefehlLV)
    Global $Status = 1
    GUICtrlSetData($StatusLabel,"Aufnahme")
    EndFunc
    func _Pause() ;<===== Pause mit der Möglichkeit des weiterführen der Aufnahme
    If $Status = 1 then
    Global $Status = 2
    $ZaehlerLV = _GuiCtrlListView_GetItemCount($BefehlLV)
    _GUICtrlListView_DeleteItem($BefehlLV,$ZaehlerLV-1)
    GUICtrlSetData($StatusLabel,"Aufnahme pausiert")
    EndIf
    EndFunc
    func _Stopp() ;<===== Stoppen der Aufnahme mit anschließenden Speichern
    If $Status = 1 then
    Global $Status = 0
    $ZaehlerLV = _GuiCtrlListView_GetItemCount($BefehlLV)
    _GUICtrlListView_DeleteItem($BefehlLV,$ZaehlerLV-1)
    $Speichern = MsgBox(4,"Speichern...","Befehlsliste speichern?")
    GUICtrlSetData($StatusLabel,"Aufnahme gestoppt")

    ElseIf $Status = 2 then
    $Speichern = MsgBox(4,"Speichern...","Befehlsliste speichern?")
    GUICtrlSetData($StatusLabel,"Aufnahme gestoppt")
    EndIf
    EndFunc
    func _Exit()
    exit
    EndFunc
    ;-----------/- Funktionen --/------------

    [/autoit]

    Die Funktion: Bei einem klick auf "Aufnahme" werden sämtliche Mausklickaktionen (Rechts & Links) aufgenommen und mit Position ins ListView geschrieben. Bei einem klick auf den Pause-Button wird die Aufnahme pausiert und kann mit einem klick auf "Aufnahme" fortgesetzt werden. Der klick auf dem Stopp-Button beendet die Aufnahme und fordert zum speichern auf. Nachdem der Benutzer gespeichert (oder nicht gespeichert) hat kann mit klick auf "Aufnahme" ein neues Skript erstellt/aufgenommen werden. Das alte wird aus dem ListView gelöscht

    Mein Problem: Bei einem klick auf den Pause oder Stopp Button wird ja die letzte Mausaktion miterfasst und ins ListView geschrieben. Dabei kann es beim Ausführen zu unerwünschten Nebenwirkungen kommen. Gelöst habe ich das Problem im Moment recht ... sagen wir mal ... provisorisch. Der letzte ListView - Eintrag wird einfach rausgelöscht. Somit sieht man kurzzeitig den Befehl und Wert. Dies ist sicherlich kein Beinbruch, aber nicht wirklich schick. Ich habe schon verschiedene Sachen probiert und wollte gerne eine etwas ansprechendere Variante haben.

    Meine Frage: Hat jemand schonmal eine ähnliches Problem gehabt und erfolgreich gelöst .... Oder fällt jemanden eine bessere und einfacher Lösung ein als meine?

    Falls irgendwelche weitere Verbesserungen oder Hinweise am Skript nötig sind dann gleich mitteilen. Bin über jeden Tipp froh.

    P.S.: Das Skript ist gekürzt und beinhaltet nur die für die Frage notwendigen Bestandteile (zwegs Zeilenumfang). Das Speichern und weitere Funktionen sind im kompletten Skript vorhanden und funktionieren. :)

    Danke schonmal im Voraus.

    Ihr :rock:

    Einmal editiert, zuletzt von Prixma (6. Januar 2011 um 11:22)

  • Dann schreibe deine Werte doch nicht zuerst rein :rofl:
    sondern Prüfe diese zuerst einmal ob "Pause" oder "Stopp" gedrückd wurde 8o

    lg PCeumel

  • Danke erstmal ... ich schau es mir mal an.

    Es sollte schon Event bleiben, da ich:

    1. Keine Lust hab alles jetzt auf GetMsg umzuschreiben^^

    2. Der Übersicht halber

    • Offizieller Beitrag

    Hatte gerade Langeweile. :D

    Spoiler anzeigen
    [autoit]

    ;################Marco Rekorder################
    ;##################BlackFx#####################
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Misc.au3>
    #include <GUIListView.au3>
    #include <array.au3>
    HotKeySet("{ESC}", "_exit")
    Opt("GUIOnEventMode", 1)
    Global $Status = 0
    ;-------------GUI Erstellen---------------
    $TitelGUI = GUICreate("Macro Tool - BlackFx", 420, 405, -1, -1, $WS_POPUPWINDOW)
    $font = "Arial"
    GUISetFont(8, 400, 0, $font)
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, "_MouseEvent")
    GUISetOnEvent($GUI_EVENT_SECONDARYUP, "_MouseEvent")
    $StatusLabel = GUICtrlCreateLabel("Herzlich Willkommen ", 160, 385)
    GUICtrlCreateLabel("Status:", 110, 385)
    Global $hStart = GUICtrlCreateButton("Aufnahme", 30, 60, 85, 25)
    GUICtrlSetOnEvent(-1, "_Aufnahme")
    Global $hPause = GUICtrlCreateButton("Pause", 30, 90, 85, 25)
    GUICtrlSetOnEvent(-1, "_Pause")
    Global $hStop = GUICtrlCreateButton("Stopp", 30, 120, 85, 25)
    GUICtrlSetOnEvent(-1, "_Stopp")
    GUICtrlCreateButton("Beenden", 30, 250, 85, 25)
    GUICtrlSetOnEvent(-1, "_exit")
    $BefehlLV = GUICtrlCreateListView("Befehl|Wert(e)", 165, 30, 250, 350)
    _GUICtrlListView_SetColumnWidth($BefehlLV, 0, 80)
    _GUICtrlListView_SetColumnWidth($BefehlLV, 1, 165)
    GUISetState(@SW_SHOW, $TitelGUI)
    ;-----------/--GUI Erstellen--/------------
    While 1
    Sleep(10)
    WEnd
    ;------------- Funktionen ---------------
    Func _mouseEvent()
    Local $a = GUIGetCursorInfo()
    If IsArray($a) Then
    If $a[4] = $hPause Or $a[4] = $hStop Or $a[4] = $hStart Then Return
    EndIf
    If $Status = 2 Then Return
    Local $pos = MouseGetPos()
    Switch @GUI_CtrlId
    Case -8
    GUICtrlCreateListViewItem("MausL|" & $pos[0] & "," & $pos[1], $BefehlLV)
    Case -10
    GUICtrlCreateListViewItem("MausR|" & $pos[0] & "," & $pos[1], $BefehlLV)
    EndSwitch
    EndFunc ;==>_mouseEvent
    Func _Aufnahme() ;<===== Starten der Aufnahme
    If $Status = 0 Then _GUICtrlListView_DeleteAllItems($BefehlLV)
    $Status = 1
    GUICtrlSetData($StatusLabel, "Aufnahme")
    EndFunc ;==>_Aufnahme
    Func _Pause() ;<===== Pause mit der Möglichkeit des weiterführen der Aufnahme
    If $Status = 1 Then
    $Status = 2
    GUICtrlSetData($StatusLabel, "Aufnahme pausiert")
    EndIf
    EndFunc ;==>_Pause
    Func _Stopp() ;<===== Stoppen der Aufnahme mit anschließenden Speichern
    If $Status = 1 Then
    $Status = 0
    $Speichern = MsgBox(4, "Speichern...", "Befehlsliste speichern?")
    GUICtrlSetData($StatusLabel, "Aufnahme gestoppt")

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

    ElseIf $Status = 2 Then
    $Speichern = MsgBox(4, "Speichern...", "Befehlsliste speichern?")
    GUICtrlSetData($StatusLabel, "Aufnahme gestoppt")
    EndIf
    EndFunc ;==>_Stopp
    Func _Exit()
    Exit
    EndFunc ;==>_Exit
    ;-----------/- Funktionen --/------------

    [/autoit]
  • Zum Glück gibt es noch Leute mit langeweile xD

    Ich danke dir erstmal Raupi. Ich werds mir mal anschauen und versuchen in mein Skript einzubauen.