Delphi-PRAXiS

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.

RWarnecke 18. Apr 2009 13:00

Re: Tastenkombination über VK_xxxxx abfragen
 
Zitat:

Zitat von taaktaak
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.

Moin Ralph,
dann muss ich das Editierfenster ja selber zeichnen. So wie es mleyen in seinem letzten Beitrag geschrieben hat, funktioniert es schon mal. Jetzt muss ich nur noch ausschneiden und kopieren einfügen. Ich bin nur gerade an einem anderen Fall dran, deshalb habe ich es noch nicht weiter ausprobiert.

RWarnecke 27. Apr 2009 18:00

Re: Tastenkombination über VK_xxxxx abfragen
 
Zitat:

Zitat von mleyen
Ich hoffe das hilft jetzt. :?

Noch nicht hundertprozentig. In meinem Testprogramm funktioniert das ganze wunderbar. Nur wenn ich es auf das Programm CodeOrakel übernehmen will, komme ich nicht in die IF-Abfrage GetKeyState(VK_CONTROL), obwohl ich die STRG-Taste gedrückt halte. Kann es sein, dass ich da ein Problem mit den Messages habe ?

Edit : Was wären typische Merkmale dafür, dass ich mir irgendwo die Messages blockiere ?

shmia 27. Apr 2009 18:27

Re: Tastenkombination über VK_xxxxx abfragen
 
Muss das Editieren wirklich so restriktiv abgesichert sein?
Folgende Situation:
Benutzer editiert Knotennamen (name ist noch leer) und entscheidet sich spontan zuerst einen anderen Knoten nochmal zu ändern.
Er kommt jetzt aber aus dem Editor nicht raus. :wall:
Es kann auch nicht mal kurz auf einen anderen Knoten springen, den Namen kopieren, auf den namenlosen Knoten springen, Namen einfügen und dann abändern.
Ich würde erst dann, wenn das Treeview gespeichert oder sonstwas damit passiert prüfen.
Alle Knoten durchgehen, falls Knotenname nicht den Regeln entspricht den Focus darauf setzen und dem Benutzer eine Mitteilung anzeigen.

Diese Vorgehensweise hat auch den Vorteil, dass die Logik zum Prüfen des Treeviews kompakt und zentral an einer Stelle sitzt.
Bei deinem Ansatz ist die Logik verteilt und greift ausserdem relativ unangenehm in das Messageverhalten von Windows ein.
Ausserdem werden Daten, die per Copy & Paste eingefügt werden nicht geprüft (falls ich mich nicht irre).

RWarnecke 27. Apr 2009 18:46

Re: Tastenkombination über VK_xxxxx abfragen
 
Zitat:

Zitat von shmia
Muss das Editieren wirklich so restriktiv abgesichert sein?

Ich hatte diese Procedure OnAppMsg erst garnicht drin. Sie ist erst dazugekommen, wie ich darauf aufmerksam gemacht wurde, dass die Knoten mit der Standardvorgabe nicht in der Datenbank von Code-Orakel abgespeichert wurden. Darauf hin habe ich diese Procedure entwickelt (mit Hilfe von euch :wink: ) um beim betätigen der Enter-Taste abzuprüfen, ob noch die Standardvorgabe der Knotenname ist oder nicht und dementsprechend eine Message auszugeben. Mittlerweile merke ich, dass das nicht so eine gute Idee war.

Zitat:

Zitat von shmia
Folgende Situation:
Benutzer editiert Knotennamen (name ist noch leer) und entscheidet sich spontan zuerst einen anderen Knoten nochmal zu ändern.
Er kommt jetzt aber aus dem Editor nicht raus. :wall:

Er kommt mit der Escape-Taste aus dem Knoten und der Ursprung wird wiederhergestellt.

Zitat:

Zitat von shmia
Es kann auch nicht mal kurz auf einen anderen Knoten springen, den Namen kopieren, auf den namenlosen Knoten springen, Namen einfügen und dann abändern.
Ich würde erst dann, wenn das Treeview gespeichert oder sonstwas damit passiert prüfen.
Alle Knoten durchgehen, falls Knotenname nicht den Regeln entspricht den Focus darauf setzen und dem Benutzer eine Mitteilung anzeigen.

Diese Vorgehensweise hat auch den Vorteil, dass die Logik zum Prüfen des Treeviews kompakt und zentral an einer Stelle sitzt.
Bei deinem Ansatz ist die Logik verteilt und greift ausserdem relativ unangenehm in das Messageverhalten von Windows ein.
Ausserdem werden Daten, die per Copy & Paste eingefügt werden nicht geprüft (falls ich mich nicht irre).

Da besteht bei mir jetzt das Problem, wie kann ich es anders lösen ? Ich schreibe die Daten des TreeViews direkt in die Datenbank mit dem Ereignis OnEdited vom TTreeView.

Edit: Nach jetzt weiteren Tests, habe ich festgestellt, dass wohl irgendeine Einstellung an der Komponente oder an einer anderen Komponente das hervor ruft, das ich kein Copy&Paste machen kann. Wenn jemand weiß, woran es liegt sage doch bitte Bescheid. Ich komme nämlich echt nicht mehr weiter.

RWarnecke 29. Apr 2009 16:04

Re: Tastenkombination über VK_xxxxx abfragen
 
Ich habe jetzt nochmal einiges getestet und ausprobiert. Ich habe jetzt mal alle Funktionen/Proceduren aus meinem Programm komplett entfernt, die mit Messages gearbeitet haben. Das einzigste was ich noch drin habe, ist die Drag&Drop Funktion im TreeView.

Folgende Situation habe ich. Ich habe einen TreeView auf einer Seite von einem PageControl mit alClient sitzen. Wenn ich jetzt einen Knoten editiere oder neu erstelle, kann ich nicht mit der Tastenkombination STRG+V Text aus der Zwischenablage einfügen. Benutze ich die Maus mit der rechten Maustaste, kann ich den Text einfügen. Wenn ich einen Knoten zu editieren aufrufe, mache ich das über den Befehl TV_Category.Selected.EditText. Ein neuer Knoten wird ganz einfach über AddChild erstellt.

So nun zu meiner Frage, womit und wie habe ich es abgefangen, dass die Tastenkombinationen STRG+X, STRG+C, STRG+V nicht an meinen TreeView in den Editiermodus eines Knotens weitergeleitet werden ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:43 Uhr.

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