FileListBox und File1_MouseDown()

Hallo,

wie kann man in einer FileListBox feststellen welche Zeile mit der rechten Maustaste selektiert wurde. Es gibt zwar die Koordinaten X und Y, dies sind aber wohl Pixel.

Danke.

Gruß
Gunter

Hallo Gunter,

wie kann man in einer FileListBox feststellen welche Zeile mit
der rechten Maustaste selektiert wurde. Es gibt zwar die
Koordinaten X und Y, dies sind aber wohl Pixel.

ich kann in der FileListBox mit der rechten Maustaste gar keine Zeile selektieren.

Gruß, Rainer

Hallo Rainer,

wenn ich die rechte Maustaste in einer Filelistbox betätige wird der Event File1_MouseDown() ausgeführt. je nach dem welche Zeile ich angeklickt habe, bekomme ich einen andren X und Y Wert.

Gruß
Gunter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Gunter,

wenn ich die rechte Maustaste in einer Filelistbox betätige
wird der Event File1_MouseDown() ausgeführt. je nach dem
welche Zeile ich angeklickt habe, bekomme ich einen andren X
und Y Wert.

das hat nur mit der Mausposition im Fenster zu tun, nicht mit den Zeilen.

Eine Zeile auswählen kannst Du mit der rechten Maustaste so nicht.
Du könntest aus dem y-Wert und der Nummer der obersten angezeigten Zeile die Zeile errechnen, die Du mit rechts geklickt hast und die dann vom Programm anwählen lassen, aber die FileListBox unterstützt Dich dabei nicht.

Gruß, Rainer

Nachtrag
Hi Gunter,

probier mal …

Private Sub File1\_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
 File1.ListIndex = File1.TopIndex + (Y \ 195)
End Sub

… Ob das funktioniert hängt natürlich von der Schriftgröße ab.

Gruß, Rainer

Hallo Rainer,

danke, dann muss ich mir was anderes einfallen lassen.

Gruß
Gunter

Hi Gunter,

danke, dann muss ich mir was anderes einfallen lassen.

… ein eigenes OCX aus zwei Pictureboxen, einem HScroll und einem Steuerelementefeld aus Labels, das die Files in einem gegebenen Directory anzeigt? Bis auf die Möglichkeit, da auch mit der rechten Maustaste arbeiten zu können ist der Code dann vermutlich mit dem der Filelistbox identisch. :smile: Etwas anderes ist das nämlich auch nicht.

Wenn Du ein eigenes OCX bauen willst und damit noch keine Erfahruing hast, wirf einen Blick in die FAQ, da ist ein Beispiel von Alex …

Gruß, Rainer

Hallo Rainer,

werde mich mal gelegentlich damit beschäftigen.

Auf die Schnelle markiere ich jetzt einfach mit der linken Maustaste eine Zeile und werte dies dann aus.

Gruß
Gunter

Hallo Gunter,

Rainer hatte dir bereits einen Weg gezeigt. Dennoch ist dieser sehr riskant :frowning:
Ich habe mal kurz überlegt und bin auf eine andere Variante gestossen :smile:

Anbei der Source. Ist nicht schwer und leicht zu verstehen! Du musst ihn eigentlich nur noch deinen Beduerfnissen anpassen :smile:

Option Explicit

Private Declare Sub mouse\_event Lib "user32" ( \_
 ByVal dwFlags As Long, \_
 ByVal dx As Long, \_
 ByVal dy As Long, \_
 ByVal cButtons As Long, \_
 ByVal dwExtraInfo As Long)

Private Sub File1\_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Static Pos As Long
Static Change As Boolean
Dim Position As Long
 If Button = 2 Then
 Pos = File1.ListIndex
 Change = True
 mouse\_event &H2, 0, 0, 0, 0
 mouse\_event &H4, 0, 0, 0, 0
 Exit Sub
 End If
 If Change Then
 Position = File1.ListIndex + 1
 File1.ListIndex = Pos
 Change = Not Change
 MsgBox " Es wurde das " & Position & " Element in der Liste mit rechts angeklickt :smile:", vbInformation
 End If
End Sub

MfG Alex

Hallo Alex,

das funktioniert prima. Nur so richtig verstanden habe ich es nicht.
Was bewirkt der der mouse_event ?

Danke.

Gruß
Gunter

Hallo Gunter,

Rainer hatte dir bereits einen Weg gezeigt. Dennoch ist dieser
sehr riskant :frowning:
Ich habe mal kurz überlegt und bin auf eine andere Variante
gestossen :smile:

Anbei der Source. Ist nicht schwer und leicht zu verstehen! Du
musst ihn eigentlich nur noch deinen Beduerfnissen anpassen :smile:

Hallo Gunter,

das funktioniert prima. Nur so richtig verstanden habe ich es
nicht.
Was bewirkt der der mouse_event ?

wenn Alex nicht so schreibfaul gewesen wäre *fg*, hätte er mit Konstanten gearbeitet:

Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4

mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0

Dann hättest Du gesehen, daß Alex da für Dich die Linke Maustaste drückt und anschließend wieder los lässt.

Du drückst die rechte Maustaste, das Programm dann für Dich die linke. Es passiert das selbe, als würdest Du selbst die linke Taste drücken.
Wenn Du im Klick-Ereignis dann noch etwas anderes machen willst, was nicht passieren soll, wenn Du die rechte Maustaste drückst, hast Du mit dem Code ein Problem.

Gruß, Rainer

Hallo Rainer,

alles klar. Vielen Dank ihr beiden.

Gruß
Gunter

Dann hättest Du gesehen, daß Alex da für Dich die Linke

Maustaste drückt und anschließend wieder los lässt.

Du drückst die rechte Maustaste, das Programm dann für Dich
die linke. Es passiert das selbe, als würdest Du selbst die
linke Taste drücken.
Wenn Du im Klick-Ereignis dann noch etwas anderes machen
willst, was nicht passieren soll, wenn Du die rechte Maustaste
drückst, hast Du mit dem Code ein Problem.

Hallo Gunter,

Hallo Gunter, Rainer

Rainer hat schon das wesentliche dazu gesagt :smile:
Vom Prinzip her, wird wenn du die rechte Maustaste drueckst, durch die API Mouse_Event die linke Maustaste gedrueckt.
Das hat zur Folge das der aktuelle Eintrag selektiert wird!
Aber du hast gesehen das die API Mouse_Event 2 mal aufgerufen wird!
Das ist nötig, denn einmal druecken wir die Taste nach unten und dann lassen wir sie wieder los!
Das hat zur Folge, das das Ereignis erneut ausgelöst wird! Deswegen wird dort ein Flag gesetzt (Change) worauf wir dann reagieren. Bevor wir den Mausklick simulieren, speichern wir uns aber die Position des selektierten Eintrages. Wenn wir dann die Maustaste im simulierten Zustand wieder loslassen, hat sich ja der selektierte Eintrag geaendert. Diesen setzen wir dann einfach wieder auf sein Ursprung. Nur mit dem kleinen Unterschied, das wir vorher noch den alten selektierten Zustand uns merken :smile:

das funktioniert prima. Nur so richtig verstanden habe ich es
nicht.
Was bewirkt der der mouse_event ?

wenn Alex nicht so schreibfaul gewesen wäre *fg*, hätte er mit
Konstanten gearbeitet:

Ja ja *ggg* du weisst das ich net viel von Konstanten halte, Rainer *feix*

Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4

Richtig :wink:

mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0

Dann hättest Du gesehen, daß Alex da für Dich die Linke
Maustaste drückt und anschließend wieder los lässt.

Jups, die eleganteste Lösung in meinen Augen :wink:

Du drückst die rechte Maustaste, das Programm dann für Dich
die linke. Es passiert das selbe, als würdest Du selbst die
linke Taste drücken.
Wenn Du im Klick-Ereignis dann noch etwas anderes machen
willst, was nicht passieren soll, wenn Du die rechte Maustaste
drückst, hast Du mit dem Code ein Problem.

Einspruch!
Wenn das der Fall ist, wird vor dem simulierten Mausklick eine globale Variable die als Flag dient gesetzt. Im Klick Ereignis haetten wir dann die Variable abgefragt und je nachdem welchen Zustand sie hat, haetten wir dann darauf reagieren koennen oder nicht :wink:

Dim Simulation as Boolean

Private Sub File1\_Klick()
If Simulation then
 'Soll was gemacht werden, wenn ein Mausklick simuliert ist?
 'Ja, dann Source hier herein :wink:
else
 Simulation=False
 'Der Source
end if




> Gruß, Rainer


MfG Alex
1 Like

Hi Alex,

Einspruch!
Wenn das der Fall ist, wird vor dem simulierten Mausklick eine
globale Variable die als Flag dient gesetzt. Im Klick Ereignis
haetten wir dann die Variable abgefragt und je nachdem welchen
Zustand sie hat, haetten wir dann darauf reagieren koennen
oder nicht :wink:

OK, Du hast recht! :smile: Das Problem lässt sich so umgehen.

Dake!

Gruß, Rainer