![]() |
Re: TreeView-->OnEditing/OnEdited die Enter-Taste abfange
Werde später, wenn ich wieder im Büro bin, mal in das Projekt reinschauen und dir ggf. noch mehr Code senden. Die Lösung sollte doch eigentlich deine übrigen Komponenten und deren Key-Events gar nicht so sehr betreffen.
Es hilft halt nichts, du musst dem beschriebenen Verhalten der VCL zuvor kommen und die Tasten vorher so auswerten, wie du es benötigst. Lass uns erst mal drüber schlafen... :) |
Re: TreeView-->OnEditing/OnEdited die Enter-Taste abfange
Zitat:
|
Re: TreeView-->OnEditing/OnEdited die Enter-Taste abfange
Hallo Hartmut,
ich habe jetzt mal ein bischen mit dem Code aus Deinem verlinkten Beitrag getestet und folgendes ist dabei rausgekommen :
Delphi-Quellcode:
Das einzigste Problem, was im Moment noch besteht, wie komme ich an den aktuellen Text, der im Editiermodus im TreeView eingegeben ist :?: Denn so wie ich es jetzt gemacht habe, hat er in der ShowMessage immer noch "Neue Kategorie".
procedure TForm16.OnAppMsg(var Msg: TMsg; var Handled: Boolean);
begin Handled := False; if Msg.message = WM_KEYDOWN then begin if (Msg.wParam = VK_RETURN) and (tv1.IsEditing) then begin if (tv1.Selected.Text = 'Neue Kategorie') then begin ShowMessage('Bitte einen neuen Namen eingeben !!' + #13#10 + tv1.Selected.Text); tv1.Selected.EditText; end; Handled := True; end; end; end; |
Re: TreeView-->OnEditing/OnEdited die Enter-Taste abfange
Hallo Rolf,
habe erst jetzt mal eine ruhige Minute gefunden, um nach deinem Problem zu sehen. ich würde deine Code ein wenig umbauen, etwa so:
Delphi-Quellcode:
So ungefähr, ich hab's nicht getestet, sondern nur mal schnell runtergetippt.
type
TForm16 = class... ... public // oder wo es passender ist EditedTxt : string; ... end; procedure TForm16.OnAppMsg(var Msg: TMsg; var Handled: Boolean); begin Handled := False; if Msg.message = WM_KEYDOWN then begin if (tv1.IsEditing) then begin if (Msg.wParam in [VK_A..VK_Z]) then // -> nimm hier alle deine gültigen Zeichen EditedTxt := EditedTxt + chr(Msg.wParam) else if (Msg.wParam = VK_RETURN) then begin tv1.Selected.EditText := EditedTxt; EditedTxt := ''; end; Handled := True; end; end; end; Denn auch der eingegebene Text geht ja Zeichen für Zeichen durch dieses globale Key-Event. Versuche einfach mal auf dieser Basis weiterzuforschen. |
Re: TreeView-->OnEditing/OnEdited die Enter-Taste abfange
Hallo Hartmut,
Dein Sourcecode wird nicht funktionieren. Denn die Zeile 21 wird nicht funktionieren, da EditText eine Funktion ist und mir nur Boolean zurückgibt. |
Re: TreeView-->OnEditing/OnEdited die Enter-Taste abfange
Hallo Rolf,
du hast recht, ich meinte eigentlich das Property 'Text' des neuen Treenode; das wolltest du ja editieren und dahin schreibst du nun den per OnAppMsg 'gesamelten' Text. |
Re: TreeView-->OnEditing/OnEdited die Enter-Taste abfange
Dieser Code funktioniert insoweit, dass das Eingebene erst nach dem betätigen der Enter-Taste sichtbar wird.
Delphi-Quellcode:
Es muss ja irgendeine Message ausgelöst werden, wenn ich eine Node in den Editiermodus setze mit
procedure TForm16.OnAppMsg(var Msg: TMsg; var Handled: Boolean);
begin Handled := False; if Msg.message = WM_KEYDOWN then begin if tv1.IsEditing then begin if (Msg.wParam > 64) and (Msg.wParam < 91) then // oder irgendeine andere Taste deiner Wahl EditedTxt := EditedTxt + chr(Msg.wParam) else if (Msg.wParam = VK_RETURN) then begin tv1.Selected.Text := EditedTxt; EditedTxt := ''; end; Handled := True; end; end; end;
Delphi-Quellcode:
. Genau diese Message möchte ich trotzdem senden, auch wenn ich nur die Enter-Taste betätigt habe und keine andere Taste gedrückt habe. Dabei soll dann der Text überprüft werden und dementsprechend reagiert werden.
tv1.selected.edittext
|
Re: TreeView-->OnEditing/OnEdited die Enter-Taste abfange
Genau dafür ist der Parameter Handled zuständig; wenn du eine Message komplett selbst behandeln willst, setze Handled := True, dann wird die Message von Windows nicht weiter behandelt. Sonst setze Handled := False nachdem du mit deiner Vorbehandlung fertig bist, damit wird die Message einfach an die Standardbehandlung weitergereicht.
Welche Messages aber im Einzelnen von Treeview wann generiert werden, weiss ich nicht; da wirst du am Besten mal so was wie WinSight o. ä. starten und nachsehen, welche Message du abfangen/modifizieren musst. |
Re: TreeView-->OnEditing/OnEdited die Enter-Taste abfange
Ich habe nochmals rum und num probiert, komme aber auf keinen grünen Zweig. So sieht jetzt meine Procedure aus :
Delphi-Quellcode:
Wenn ich jetzt nichts ändere nach dem Erstellen und dann auf Enter drücke, legt er mir eine leere Node an. Wie kann ich das Programm dazu bringen, dass die Node im Editiermodus bleibt, trotz das ich die Enter-Taste betätigt habe ?
procedure TForm16.OnAppMsg(var Msg: TMsg; var Handled: Boolean);
begin Handled := False; if Msg.message = WM_KEYDOWN then begin if TV_1.IsEditing then begin if (Msg.wParam > 47) and (Msg.wParam < 91) then // oder irgendeine andere Taste deiner Wahl begin Handled := True; EditedTxt := EditedTxt + chr(Msg.wParam); end else begin Handled := False; if (Msg.wParam = VK_RETURN) then if EditedTxt <> TV_1.Selected.Text then begin tmpNode.Text := EditedTxt; EditedTxt := ''; end else tmpNode.EditText; end; Handled := False; end; end; end; |
Re: TreeView-->OnEditing/OnEdited die Enter-Taste abfange
Hallo zusammen,
ich habe es mittlerweile hinbekommen. Mein Sourcecode sieht jetzt so aus :
Delphi-Quellcode:
Jetzt habe ich dabei das Problem, dass ich mir mit dieser Funktion die Shortcuts für Copy&Paste abgeklemmt habe. Wie kann ich diese Shortcuts wieder aktivieren ?
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz