Doppelklick auf Liste?

05/07/2010 20:05 mipez#1
Ich habe eine Liste (GUICtrlCreateList)... wenn ich einen Doppelklick auf einen Eintrag mache, soll eine Funktion ausgeführt werden.

Mir gehts also um den Doppelklick, ne Idee?

EDIT: Vllt ist's wichtig - ich benutz OnEventMode
05/08/2010 14:26 .nAno#2
PHP Code:
Func _DoubleClick (  )
Local $controlID$read$timestamp$dll$executed
$controlID 
3
$read 
GUICtrlRead ($controlID)

$dll DllOpen "user32.dll" )
$timestamp TimerInit()
$executed False

Do
    If 
_IsPressed "01"$dll ) And GUICtrlRead $controlID ) = $read And Then

            $executed 
True
            MsgBox 
0"""Du hast " $read " zweimal angeklickt!")

    EndIf
Until TimerDiff $timestamp ) > 750 Or $executed
DllClose 
$dll )
EndFunc 
Das hab ich jetzt mal kurzfristig zusammengeschustert, solltest vllt. noch einbauen, dass er nicht reagiert, wenn man auch außerhalb der anzusteuernden Schaltfläche klickt ;)
Musst natürlich noch die Misc.au3 in dein Script einbinden.
05/08/2010 15:54 mipez#3
Erstmal danke, aber geht das nicht auch mit GUICtrlSetOnEvent?
05/08/2010 16:06 .nAno#4
Das hier ist die Funktion die du in GUICtrlSetOnEvent einbauen musst, wenn man weiss wie geht das aber normalerweise auch mit GUIGetMsg ;)
05/08/2010 16:23 mipez#5
Quote:
Originally Posted by .nAno View Post
Das hier ist die Funktion die du in GUICtrlSetOnEvent einbauen musst, wenn man weiss wie geht das aber normalerweise auch mit GUIGetMsg ;)
Hrm...
PHP Code:
If GuiCtrlRead($liste) <> "" Then 
Problem wäre hier nur, dass ich eine beliebige Anzahl an Einträgen habe. Und es soll ja für jeden Eintrag eine angepasste Funktion ausführen...
05/08/2010 17:28 .nAno#6
Wo liegt das Problem?
Tausch die MsgBox doch einfach gegen eine Switch-Case Anweisung aus in der alle Alternativen aufgeführt sind.
Falls der Inhalt der List aus nem Array stammt kannst du aber besser ne Überprüfung mit einer For-Schleife machen ;)
05/08/2010 21:45 mipez#7
Quote:
Originally Posted by .nAno View Post
Wo liegt das Problem?
Tausch die MsgBox doch einfach gegen eine Switch-Case Anweisung aus in der alle Alternativen aufgeführt sind.
Falls der Inhalt der List aus nem Array stammt kannst du aber besser ne Überprüfung mit einer For-Schleife machen ;)
Ich blick nich durch dein Codeschnipsel durch ;D
05/09/2010 13:34 .nAno#8
Hier mal der gesamte Code, die MsgBox, die anzeigt was man 2mal angeklickt hat, kann einfach gegen deine Funktion ausgetauscht werden, der Rest sollte sich von selbst erklären ;)

Ich hab außerdem noch ne kleine Extra-Funktion erstellt, die das alles noch ein wenig fehlerfreier macht

PHP Code:
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>

AutoItSetOption "GuiOnEventMode" )

#Region ### START Koda GUI section ### Form=
$Form1 GUICreate("Form1"633447192124)
$List1 GUICtrlCreateList(""4816273305)
GUICtrlSetData $List1"1|2|3|4|5|6" )
GUICtrlSetOnEvent $List1"_DoubleClick" )
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1=1

WEnd

Func _Exit 
()
Exit
EndFunc

Func _MouseOverControl 
()
Local $WindowPos$ControlPos$MousePos
Dim $WindowPos
$ControlPos$MousePos

$WindowPos 
WinGetPos ( @GUI_WinHandle )
$ControlPos ControlGetPos ( @GUI_WinHandle"", @GUI_CtrlId )
$MousePos MouseGetPos ()


If 
$MousePos[0] > $WindowPos[0] + $ControlPos[0] And  $MousePos[1] > $WindowPos[1] + $ControlPos[1] And $MousePos[0] < $WindowPos[0] + $ControlPos[0] + $ControlPos[2] And $MousePos[1] < $WindowPos[1] + $ControlPos[1] + $ControlPos[3Then
    
Return True
Else
    Return 
False
EndIf
EndFunc

Func _DoubleClick 
(  )
Local $controlID$read$timestamp$dll$executed
$controlID 
= @GUI_CtrlId
$read 
GUICtrlRead ($controlID)

$dll DllOpen "user32.dll" )
$timestamp TimerInit()
$executed False

Do
    If 
_IsPressed "01"$dll ) And GUICtrlRead $controlID ) = $read And _MouseOverControl () Then

            $executed 
True
            MsgBox 
0"""Du hast " $read " zweimal angeklickt!")

    EndIf
Until TimerDiff $timestamp ) > 750 Or $executed
DllClose 
$dll )
EndFunc 
05/09/2010 13:42 HardCore.1337#9
Ist so alles richtig, aber ein Tipp um dir Schreibarbeit zu ersparen.
Die Hilfe sagt, das bei _IsPressed der Parameter zur Dll Angabe Optional ist. Das bedeutet, du kannst den ganzen Code mit DllOpen und so weg lassen ;)
05/09/2010 13:44 .nAno#10
Ich weiss, nur ich habs mir so angewöhnt, um mögliche Fehler die dadurch entstehen könnten zu vermeiden^^
05/09/2010 14:15 mipez#11
Hm... dieses @GUI_CtrlId kapier ich iwie nich ganz... wärs nich sinnvoller die ID der Liste einzusetzen?
05/09/2010 14:27 .nAno#12
@GUI_CtrlID ist nen Makro, der die ID der zuletzt angeklickte GUIControl zurückgibt

Das entspricht der ID der ListBox, wenn du sie zuletzt angeklickt hast (was bei OnEventMode der Fall sein muss um die Funktion mit dem Makro aufzurufen ;)
05/09/2010 14:29 mipez#13
K, ich habs...

EDIT: Also kann ich das Makro für jedes beliebiges Control verwenden?

Ach ja...
PHP Code:
Func _play()
    
$mis3 _GUICtrlListBox_GetCount($playlist)
For 
$i 0 To $mis3 -1
    $liste 
_GUICtrlListBox_GetText($playlist,$i)
    If 
FileExists($listeThen
        _SoundPlay
($liste)
        Switch 
GUiGetMsg ()
        Case 
$GUI_EVENT_CLOSE
        
Exit
        Case 
$stop
        _SoundStop
($liste)
        
ExitLoop
        
EndSwitch
    Else
        
MsgBox(0,"Error","Couldn't find file on this path")
        
ExitLoop
    
EndIf
Next
EndFunc 
Problem: $stop-Button funzt net :>
Hab aber schon zig mal die Hilfe durchgekramt...
05/09/2010 14:35 .nAno#14
Du nutzt (immernoch) GUIOnEventMode, oder?

GUIGetMsg () funzt während diese Option aktiviert ist nicht, du müsstest die also deaktivieren
05/09/2010 14:46 mipez#15
Quote:
Originally Posted by .nAno View Post
Du nutzt (immernoch) GUIOnEventMode, oder?

GUIGetMsg () funzt während diese Option aktiviert ist nicht, du müsstest die also deaktivieren
Ahem, $GUI_EVENT_CLOSE funktioniert xD