ListView1DblClick und Keydown
-
- Beiträge: 230
- Registriert: Di 17. Mär 2009, 10:51
- OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)
ListView1DblClick und Keydown
Moin
Frage:
Wie finde ich beim Ereignis ListView1DblClick heraus ob noch zusätzlich eine Taste gedrückt ist?
Es gibt zwar das OnKeyDown Ereignis, ich weis aber nicht wie ich das jetzt irgendwie zusammenbringen soll.
Zum Hintergrund was ich machen will:
Ich habe hier einen ListView mit einer Reihe von Einträgen
Bsp:
KundeA,RouterA01, 172.168.1.1,T
KundeA,RouterA02, 172.168.1.2,S
Bei einem Doppelklick auf dem Eintrag wird Putty aufgemacht und eine Verbindung zur Hardware hergestellt.
Der letzte Eintrag (T oder S) sagt aus ob standardmäßig eine Telnet, oder SSH Verbindung aufgebaut werden soll.
Soweit funktioniert das schon wunderbar.
Ich möchte jetzt erreichen, das trotz Voreinstellung in der ListView bei einem zusätzlichen
drücken der Taste "Strg" die jeweils nicht voreingestellte Verbindung hergestellt wird.
Wenn also T (Telnet) in der Listview steht wird bei einem Doppelklick auf den Eintrag eine Telnetverbindung aufgemacht.
Wenn ich aber zum Doppelklick zusätzlich die Taste "Strg" drücke soll trotz Voreinstellung hier eine SSH Verbindung hergestellt werden.
Soweit zur Vergeschichte was ich überhaupt erreichen will.
Gruß
Michael
Frage:
Wie finde ich beim Ereignis ListView1DblClick heraus ob noch zusätzlich eine Taste gedrückt ist?
Es gibt zwar das OnKeyDown Ereignis, ich weis aber nicht wie ich das jetzt irgendwie zusammenbringen soll.
Zum Hintergrund was ich machen will:
Ich habe hier einen ListView mit einer Reihe von Einträgen
Bsp:
KundeA,RouterA01, 172.168.1.1,T
KundeA,RouterA02, 172.168.1.2,S
Bei einem Doppelklick auf dem Eintrag wird Putty aufgemacht und eine Verbindung zur Hardware hergestellt.
Der letzte Eintrag (T oder S) sagt aus ob standardmäßig eine Telnet, oder SSH Verbindung aufgebaut werden soll.
Soweit funktioniert das schon wunderbar.
Ich möchte jetzt erreichen, das trotz Voreinstellung in der ListView bei einem zusätzlichen
drücken der Taste "Strg" die jeweils nicht voreingestellte Verbindung hergestellt wird.
Wenn also T (Telnet) in der Listview steht wird bei einem Doppelklick auf den Eintrag eine Telnetverbindung aufgemacht.
Wenn ich aber zum Doppelklick zusätzlich die Taste "Strg" drücke soll trotz Voreinstellung hier eine SSH Verbindung hergestellt werden.
Soweit zur Vergeschichte was ich überhaupt erreichen will.
Gruß
Michael
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: ListView1DblClick und Keydown
Ich habe dir eine Antwort für Delphi, müsstest es ausprobieren ob das genauso unter FPC klappt: http://www.delphi-treff.de/tipps/system ... t-control/
.
-
- Beiträge: 230
- Registriert: Di 17. Mär 2009, 10:51
- OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)
Re: ListView1DblClick und Keydown
So etwas hatte ich gesuchtbaumina hat geschrieben:Ich habe dir eine Antwort für Delphi, müsstest es ausprobieren ob das genauso unter FPC klappt: http://www.delphi-treff.de/tipps/system ... t-control/

Leider kennt Lazarus den "GetAsyncKeyState" nicht, oder ich muß noch eine mir unbekannt Unit einbinden.
Fehlermeldung: unit1.pas(72,34) Error: Identifier not found "GetAsyncKeyState"
Code: Alles auswählen
function KeyPressed(Key: Integer): Boolean;
// für Shift=vk_shift, für Control=vk_control, für Alt=vk_menu
begin
KeyPressed := (GetAsyncKeyState(Key) and $8000 <> 0);
end;
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
if KeyPressed(vk_control) then label1.caption:='Control+Button1';
end;
-
- Beiträge: 152
- Registriert: Mo 3. Feb 2014, 14:07
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: ListView1DblClick und Keydown
In Delphi ist das in der Unit "Windows". Du kannst auch alternativ GetKeyState versuchen.
.
Re: ListView1DblClick und Keydown
Könntest auch, wenn Du statt DblClick einfach OnMouseDown abfängst wie folgt abfragen (IMHO Systemunabhängig):
Code: Alles auswählen
procedure TForm1.ListView1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (ssDouble in Shift) and (ssCtrl in Shift)
then ShowMessage('Strg und Doppelklick');
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 230
- Registriert: Di 17. Mär 2009, 10:51
- OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)
Re: ListView1DblClick und Keydown
Super, das funktioniert sogar (und ich bin extra früher aufgestanden...Michl hat geschrieben:Könntest auch, wenn Du statt DblClick einfach OnMouseDown abfängst wie folgt abfragen (IMHO Systemunabhängig):Code: Alles auswählen
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if (ssDouble in Shift) and (ssCtrl in Shift) then ShowMessage('Strg und Doppelklick'); end;

Danke für den Tip!
Nachfrage:
Woher hast Du die Werte "ssDouble" und "ssCtrl"? In welcher Datei stehen die, falls ich noch mal etwas vergleichbares suche?
Besonders auf den ersteren währe ich nicht gekommen, obwohl der eigentlich selbsterklärend ist.
Gruß
Michael
Re: ListView1DblClick und Keydown
Shift ist vom Typ TShiftState (definiert in Classesh.inc). Um das herauszufinden, brauchst Du nur im Quelltexteditor Strg (Ctrl) + linke Maustaste auf TShiftState zu klicken. Damit gelangst Du zur Deklaration von TShiftState (TShiftState = set of TShiftStateEnum;). TShiftStateEnum stellt die Werte (eine Zeile weiter oben deklariert)catweasel hat geschrieben:Woher hast Du die Werte "ssDouble" und "ssCtrl"? In welcher Datei stehen die, falls ich noch mal etwas vergleichbares suche?
Code: Alles auswählen
TShiftStateEnum = (ssShift, ssAlt, ssCtrl,
ssLeft, ssRight, ssMiddle, ssDouble,
// Extra additions
ssMeta, ssSuper, ssHyper, ssAltGr, ssCaps, ssNum,
ssScroll,ssTriple,ssQuad,ssExtra1,ssExtra2);
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 230
- Registriert: Di 17. Mär 2009, 10:51
- OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)
Re: ListView1DblClick und Keydown
Seltsam finde ich das die Abfrage if then else scheinbar nicht richtig funktioniert.
Sobald ein else drin ist bekomme ich immer die Ausgabe vom else Zweig.
-> geht nicht
-> geht
Habe ich da irgend was nicht richtig verstanden, oder ist da noch irgendwo ein Bug?
Sobald ein else drin ist bekomme ich immer die Ausgabe vom else Zweig.
-> geht nicht
Code: Alles auswählen
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ((ssDouble in Shift) and (ssCtrl in Shift))
then ShowMessage('Strg und Doppelklick gedrückt')
else ShowMessage('Nur Doppelklick') ;
end;
Code: Alles auswählen
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ((ssDouble in Shift) and (ssCtrl in Shift))
then ShowMessage('Strg und Doppelklick gedrückt');
end;
Re: ListView1DblClick und Keydown
Versuchs mal eher so:OnMouseDown wird schon aufgerufen, wenn Du nur 1 Klick gemacht hast, daher ist ssDouble im ersten Aufruf false. Damit wird das Showmessage geöffnet und Du kommst gar nicht mehr dazu, einen 2. Klick an die TListview zu senden.
Code: Alles auswählen
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssDouble in Shift then
if ssCtrl in Shift
then Showmessage('Ctrl gedrückt')
else Showmessage('nur Mousebutton gedrückt');
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 230
- Registriert: Di 17. Mär 2009, 10:51
- OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)
Re: ListView1DblClick und Keydown
OK, ich glaube das habe ich verstanden. Ich verstehe allerdings nicht das es nicht funktioniert wenn ich die Information (gedrückt oder nicht ) zur Weiterverarbeitung erst einmal in eine Variable packe. Die globale Variable "ausgabe" ist immer leer ("").Michl hat geschrieben:Versuchs mal eher so:OnMouseDown wird schon aufgerufen, wenn Du nur 1 Klick gemacht hast, daher ist ssDouble im ersten Aufruf false. Damit wird das Showmessage geöffnet und Du kommst gar nicht mehr dazu, einen 2. Klick an die TListview zu senden.Code: Alles auswählen
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if ssDouble in Shift then if ssCtrl in Shift then Showmessage('Ctrl gedrückt') else Showmessage('nur Mousebutton gedrückt'); end;
Das geht nicht.
Code: Alles auswählen
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssDouble in Shift then
if ssCtrl in Shift
then ausgabe:='Ctrl gedrückt'
else ausgabe:='nur Mousebutton gedrückt';
Showmessage(ausgabe);
end;
Re: ListView1DblClick und Keydown
???
Code: Alles auswählen
if ssDouble in Shift then begin
if ssCtrl in Shift
then Ausgabe:='Ctrl gedrückt'
else Ausgabe:='nur Mousebutton gedrückt';
ShowMessage(Ausgabe);
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 230
- Registriert: Di 17. Mär 2009, 10:51
- OS, Lazarus, FPC: Win10 64Bit // Linux Mint 20.0 - (L 2.2.0 FPC 3.2.2)
Re: ListView1DblClick und Keydown
Danke, ich hab´s nicht erkannt.
Michl hat geschrieben:???Code: Alles auswählen
if ssDouble in Shift then begin if ssCtrl in Shift then Ausgabe:='Ctrl gedrückt' else Ausgabe:='nur Mousebutton gedrückt'; ShowMessage(Ausgabe); end;