Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi VirtualStringTree wie in Excel navigieren + sofort editieren (https://www.delphipraxis.net/159401-virtualstringtree-wie-excel-navigieren-sofort-editieren.html)

menschjens 26. Mär 2011 15:51


VirtualStringTree wie in Excel navigieren + sofort editieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich arbeite nun seit etwa 3 Wochen mit der VirtualStringTree-Komponente und bin begeistert über die Möglichkeiten.
Nun habe ich einen VirtualStringTree mit mehreren Columns, in dem ich gerne genau wie in Excel mit den Cursortasten von Zelle zu Zelle navigieren und gleich editieren möchte. Ich möchte also nicht erst Enter oder F2 drücken oder gar mit der Maus in das Feld klicken müssen, um das Editieren zu beginnen.
Mein Problem: Ich kann zwar über das KeyDown des Trees die Cursortasten abfangen, die richtige Zelle focussieren und das Editieren starten, aber danach erhält ja offenbar dieses Editfeld den Focus und weitere Cursorbewegungen tippeln dann in diesem Editfeld herum, anstatt das Editfeld zu verlassen und zur nächsten Zelle zu springen.
Ich suche und probieren nun schon tagelang - hat einer eine Idee?

s.h.a.r.k 26. Mär 2011 18:34

AW: VirtualStringTree wie in Excel navigieren + sofort editieren
 
Du musst eben das Navigieren mit den Pfeiltasten innerhalb der Edits abfangen und entsprechend umleiten. Das hier klappt ganz wunderbar:
Delphi-Quellcode:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_DOWN) then
    Edit2.SetFocus();
end;

menschjens 26. Mär 2011 19:20

AW: VirtualStringTree wie in Excel navigieren + sofort editieren
 
Dieses Edit wird doch aber nur während der Laufzeit vom VirtualStringTree erzeugt! Wie komme ich an dessen KeyDown-Ereignis?

menschjens 5. Apr 2011 20:00

AW: VirtualStringTree wie in Excel navigieren + sofort editieren
 
Hab's mittlerweile selbst gelöst. Wenn einer Tipps möchte, kann er fragen.

Christian Seehase 5. Apr 2011 20:58

AW: VirtualStringTree wie in Excel navigieren + sofort editieren
 
Zitat:

Zitat von menschjens (Beitrag 1093290)
Hab's mittlerweile selbst gelöst. Wenn einer Tipps möchte, kann er fragen.

Ich denke mal, es wäre ganz gut, wenn Du zumindest ein paar Stichworte zur Lösung hier präsentieren würdest.
Dann würde der Nächste, der nach der Lösung dieses Problems sucht, nicht von Vorne beginnen müssen.
Danke.

menschjens 6. Apr 2011 20:13

AW: VirtualStringTree wie in Excel navigieren + sofort editieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Da hast du recht. Ich versuch's mal:

Ich hab es mit einem eigenen EditLink gemacht. Das Advanced Demo (Editor.pas und GridDemo.pas) zeigt prinzipiell, wie es geht. Für meine Problemstellung war natürlich unwichtig, andere Komponenten als Editoren zu nutzen. Für mich war der Zugriff auf das im EditLink hinterlegte Edit-Feld (bei mir dann vom Typ TEdit) völlig ausreichend. Insbesondere habe ich also in meinem eigenen TPropertyEditLink die Prozedur EditKeyDown deklariert, um in dieser dann auf die Cursortasten reagieren zu können. In der Funktion PrepareEdit meines TPropertyEditLink's habe ich dann dem OnKeyDown den neuen KeyDown-Handler zugewiesen und das war's schon fast.

Damit kann man also nun im KeyPress des VirtualStringTree's (heißt bei mir VST1) auf jede Taste so reagieren, dass man sich den Tastencode (z.B in einer globalen Variablen PressedKey: Char) merkt und dann über VST1.EditNode(...) den neuen Editor generieren lässt. Im PrepareEdit weist man dann den gemerkten TastenCode dem TPropertyEdit.FEdit.Text zu - man will ja schließlich, dass das im VST1 gemerkte erste Zeichen nicht nur den Editor startet, sondern dort gleich als erstes Zeichen übernommen wird.
Von nun an befindet man sich also dann im TEdit (erstes Zeichen steht also schon drin) und kann nach den weiteren eingegebenen 'normalen Zeichen' über die oben beschriebene TPropertyEditLink.EditKeyDown bei Betätigung der Cursortasten gleich aus dem Editor aussteigen (FTree.EndEditNode). Vor dem Ausstieg aber FEdit.Modified auf true setzen, damit die Änderung auch für voll genommen wird und über PostMessage(FTree.Handle, WM_KEYDOWN, Key, 0) die Message absetzen, dass die Ausstiegs-Cursortaste auch nebenbei noch im Tree wie eine Cursortaste wirkt.

Ich hoffe mit den beiliegenden Code-Schnipseln kann man verstehen, wie es funktioniert. :wink:

Gruß
menschjens


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 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