Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tastenkombination über VK_xxxxx abfragen (https://www.delphipraxis.net/131920-tastenkombination-ueber-vk_xxxxx-abfragen.html)

RWarnecke 2. Apr 2009 21:29


Tastenkombination über VK_xxxxx abfragen
 
Hallo zusammen,

ich überprüfe mit folgenden Code die gedrückten Tasten bei einer Komponente :
Delphi-Quellcode:
procedure TForm16.OnAppMsg(var Msg: TMsg; var Handled: Boolean);
begin
  Handled := False;
  if Msg.message = WM_KEYDOWN then
  begin
    if (TV_1.IsEditing) and (TV_1.Tag = 0) then
    begin
      case Msg.wParam of
        VK_BACK, VK_SHIFT, VK_INSERT, VK_DELETE, 47..91, 96..109 :
        begin
          Handled := True;
          EditedTxt := EditedTxt + chr(Msg.wParam);
          NodeEdit := True;
        end;
      else
        if (Msg.wParam = VK_RETURN) and (Msg.lParam <> TVN_ITEMCHANGED) and (not NodeEdit) then
        begin
          ShowMessage('Bitte vergeben Sie einen Namen');
          NodeEdit := False;
          tmpNode.EditText;
        end;
      end;
      Handled := False;
    end;
  end;
end;
Wie kann ich hier nun noch die Tastenkombinationen STRG+C, STRG+X, STRG+V abfragen ?

mleyen 2. Apr 2009 21:50

Re: Tastenkombination über VK_xxxxx abfragen
 
Hier eine Kurzanleitung:
1. Msg.message = WM_KEYDOWN prüfen
2. mit Hier im Forum suchenGetKeyState Strg abfragen
3. falls Strg gedrükt ist, wParam nach deinen gewünschten Keys in Verbindung mit Strg abfragen

RWarnecke 3. Apr 2009 06:27

Re: Tastenkombination über VK_xxxxx abfragen
 
Hallo mleyen,
danke für Deine Antwort. Einzeln bekomme ich das hin mit Deiner Kurzanleitung. Ich habe nur Probleme es in meine Struktur zu übernehmen, da ich mit der Procedure alle Tasten und Tastenkombinationen innerhalb des TreeView's selber behandeln muss. Die Procedure funktioniert auch soweit ganz gut, nur dass ich halt die Tastenkombinationen für die Zwischenablage immer noch ausgesperrt habe. Mein letzter Versuch sieht so aus :
Delphi-Quellcode:
procedure TForm16.OnAppMsg(var Msg: TMsg; var Handled: Boolean);
begin
  Handled := False;
  if (TV_1.IsEditing) and (TV_1.Tag = 0) then
  begin
    if (Msg.message = WM_KEYDOWN) and (GetKeyState(VK_CONTROL) > 0) then
    begin
      case Msg.wParam of
        VK_BACK, VK_SHIFT, VK_INSERT, VK_DELETE, 47..91, 96..109 :
        begin
          Handled := True;
          EditedTxt := EditedTxt + chr(Msg.wParam);
          NodeEdit := True;
        end;
      else
        if (Msg.wParam = VK_RETURN) and (Msg.lParam <> TVN_ITEMCHANGED) and (not NodeEdit) then
        begin
          ShowMessage('Bitte vergeben Sie einen Namen');
          NodeEdit := False;
          tmpNode.EditText;
        end;
      end;
      Handled := False;
    end
    else
    begin
      if (Msg.wParam = Ord('V')) and (Clipboard.HasFormat(CF_TEXT)) then
      begin
        Handled := True;
        EditedTxt := EditedTxt + Clipboard.AsText;
        NodeEdit := True;
      end;
    end;
  end;
end;
Er springt mir auch in die untere IF-Abfrage rein, nur im TreeView wird es nicht angezeigt. Habe ich da noch einen Denkfehler drin ?

mleyen 3. Apr 2009 07:47

Re: Tastenkombination über VK_xxxxx abfragen
 
Moin,
Zitat:

Zitat von RWarnecke
Er springt mir auch in die untere IF-Abfrage rein, nur im TreeView wird es nicht angezeigt. Habe ich da noch einen Denkfehler drin ?

Wenn TV_1 dein TreeView ist, liegt das daran, dass es nur in der IF-Abfrage verwendet wird.

Ich hab jetzt deinen Code nicht so ganz verstanden, aber hier nochmal ein Code-Beispiel zum Abfragen der Tastenkombinationen STRG+C, STRG+X, STRG+V:
Delphi-Quellcode:
procedure TForm16.OnAppMsg(var Msg: TMsg; var Handled: Boolean);
begin

  if Msg.message = WM_KEYDOWN then
  begin // Die KeyDown-Msg brauchen wir
    if GetKeyState(VK_CONTROL) < 0 then
    begin // Wenn Strg gedrückt ist

      case Msg.wParam of
        67, 99: ShowMessage('Strg + c gedrückt');
        86, 118: ShowMessage('Strg + v gedrückt');
        88, 120: ShowMessage('Strg + x gedrückt');
      end;

    end;
  end;

end;

RWarnecke 4. Apr 2009 10:08

Re: Tastenkombination über VK_xxxxx abfragen
 
Zitat:

Zitat von mleyen
Wenn TV_1 dein TreeView ist, liegt das daran, dass es nur in der IF-Abfrage verwendet wird.

Ja, das ist mein TreeView. Die Procedure entstand aus diesem Beitrag.

Deine Case-Anweisung funktioniert soweit schonmal ganz gut. Danke. Nur habe ich leider ein Problem dabei, es wird kein Text aus der Zwischenablage in das Editfeld des TreeViews eingefügt. Mit den einzelnen Buchstaben funktioniert es ohne weiteres. Warum ?

RWarnecke 18. Apr 2009 09:46

Re: Tastenkombination über VK_xxxxx abfragen
 
*push* Hat niemand eine Idee ? *push*

SirThornberry 18. Apr 2009 10:00

Re: Tastenkombination über VK_xxxxx abfragen
 
warum verwendest du eigentlich nicht das OnKeyDown bzw. OnKeyUp? Da bekommst du die Tasten und den Shiftstate gleich mit dazu

RWarnecke 18. Apr 2009 10:53

Re: Tastenkombination über VK_xxxxx abfragen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von SirThornberry
warum verwendest du eigentlich nicht das OnKeyDown bzw. OnKeyUp? Da bekommst du die Tasten und den Shiftstate gleich mit dazu

Das OnKeyDown-Ereignis greift nur innerhalb des TreeViews. Wenn sich eine Node im Editiermodus befindet, dann greift das Ereignis nicht. Deshalb diese Procedure womit ich die Messages abfange. Denn mit dieser Procedure fange ich die Enter-Taste ab und gebe eine entsprechende Meldung aus, wenn immer noch ein vordefinierter Wert in der Node stehen sollte.

Im Anhang mal ein kleine Beispiel inkl. Source. Über ein Kontextmenü kann eine neue Node hinzugefügt werden.

mleyen 18. Apr 2009 12:04

Re: Tastenkombination über VK_xxxxx abfragen
 
Zitat:

Delphi-Quellcode:
EditedTxt := EditedTxt + chr(Msg.wParam);

Ähm in wParam steht doch nur die zuletzt gedrückte Taste.

Füg mal den uses die Unit "Clipbrd" hinzu und kopier folgenden Code mal in deine OnAppMsg Prozedur:
Delphi-Quellcode:
var
  Clpbrd: TClipboard;
begin
  if Msg.message = WM_KEYDOWN then
  begin // Die KeyDown-Msg brauchen wir
    if GetKeyState(VK_CONTROL) < 0 then
    begin // Wenn Strg gedrückt ist

      case Msg.wParam of
        67, 99: ShowMessage('Strg + c gedrückt'); // Das musst du schon selber implementieren ;)
        88, 120: ShowMessage('Strg + x gedrückt'); // "
        86, 118:
        begin // Strg+v | Zwichenablage in EditedTxt haun
          Clpbrd := TClipboard.Create;
          if Clpbrd.HasFormat(CF_TEXT) then
            EditedTxt := EditedTxt + Clpbrd.AsText;
          Clpbrd.Free;
        end;
      end;

    end;
  end;
end;
Ich hoffe das hilft jetzt. :?

taaktaak 18. Apr 2009 12:46

Re: Tastenkombination über VK_xxxxx abfragen
 
Moin Rolf,
alternativ auf den integrierten inplace-editor verzichten und ein eigenes Editierfenster verwenden - wenn gewünscht, kannst du es ja von allem 'drumherum befreien, dass es in der Optik dem inplace-editor entspricht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz