ListView1DblClick und Keydown

Rund um die LCL und andere Komponenten
Antworten
catweasel
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

Beitrag von catweasel »

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

baumina
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

Beitrag von baumina »

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

catweasel
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

Beitrag von catweasel »

baumina 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/
So etwas hatte ich gesucht :)
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;

baumina
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

Beitrag von baumina »

In Delphi ist das in der Unit "Windows". Du kannst auch alternativ GetKeyState versuchen.
.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ListView1DblClick und Keydown

Beitrag von Michl »

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;  

catweasel
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

Beitrag von catweasel »

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; 
Super, das funktioniert sogar (und ich bin extra früher aufgestanden... :D )
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

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ListView1DblClick und Keydown

Beitrag von Michl »

catweasel hat geschrieben:Woher hast Du die Werte "ssDouble" und "ssCtrl"? In welcher Datei stehen die, falls ich noch mal etwas vergleichbares suche?
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)

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);     
bereit.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

catweasel
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

Beitrag von catweasel »

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

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;
-> geht

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;
Habe ich da irgend was nicht richtig verstanden, oder ist da noch irgendwo ein Bug?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ListView1DblClick und Keydown

Beitrag von Michl »

Versuchs mal eher so:

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; 
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

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

catweasel
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

Beitrag von catweasel »

Michl hat geschrieben:Versuchs mal eher so:

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; 
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.
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 ("").

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;

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: ListView1DblClick und Keydown

Beitrag von Michl »

???

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;  

catweasel
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

Beitrag von catweasel »

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; 

Antworten