Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TVirtualStringTree editieren / löschen


MDX - So 29.05.11 12:37
Titel: TVirtualStringTree editieren / löschen
Hey...
nachdem ich hier http://www.delphi-forum.de/viewtopic.php?t=105683 endlich geschafft habe die Daten hinzuzufügen, würde ich diese nun auf Klick wieder entfernen (die markierte Spalte) und bei klick auf die Spalte selbst edtierbar machen (jedoch nur eine, die zweite Spalte).
Ich hab hier [http://www.delphi-treff.de/tutorials/komponenten/virtualtreeview/editieren-ermoeglichen/] gelesen, dass es scheinbar nur möglich sein soll den RootNode zu bearbeiten? Stimmt das oder gibt es da doch eine Möglichkeit zu auch ChildNodes zu bearbeiten?

Ich hab es mal mit folgendem Probiert, wobei ich dann jeweils nur die erste (Root) Spalte bearbeiten kann.. Der Text wird leider aber auch nicht gespeichert...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.vstEditing(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean);
begin
  Allowed:=Sender.GetNodeLevel(Node)<1;
end;

procedure TForm1.VSTNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; NewText: string);
var
  kdaten:TEntries;
begin
  kdaten:=Sender.GetNodeData(Node.Parent);
  if Assigned(kdaten) then
    kdaten.wid:=NewText;
end;


Leider scheint es im ganzen Internet kein vernünftiges Tutorial zu geben, das einem richtig hilft.... :?
Danke...


jaenicke - So 29.05.11 20:03

Also erstens musst du das ganze überhaupt editierbar machen. Dafür setzt du unter TreeOptions --> MiscOptions toEditable auf True. Dann musst du die Spalten einzeln markieren können. Dafür setzt du unter TreeOptions --> SelectionOptions toExtendedFocus auf True. Dann brauchst du noch OnNewText was du ja schon hast um den Text auch zu speichern.

Beispiel im Anhang, wobei ich die Spalte erst einmal nicht beachte beim Speichern.


MDX - So 29.05.11 20:51

Wow danke, es funktioniert mit dem bearbeiten :D
Jetzt muss ich lediglich noch hinbekommen dass nur die zweite Spalte Edtierbar ist (Im Moment kann man jede bearbeiten und die zweite wird überschrieben) und wie ich einen Eintrag wieder entfernt bekommt :)

Edit:
Für Mich selbst und alle anderen die auch Probleme haben, nur die zweite Spalte editierbar zu machen geht so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.vstEditing(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean);
begin
if Sender.FocusedColumn = 1 then
  Allowed:=True
  else
  Allowed:=False;
end;

:D


Edit2:
Darauf hätte ich auch früher kommen können -_-'

Delphi-Quelltext
1:
VST.DeleteSelectedNodes;                    


:D

Egal, danke nochmal Sebastian ;)


jaenicke - Mo 30.05.11 04:16

user profile iconMDX hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.vstEditing(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndexvar Allowed: Boolean);
begin
if Sender.FocusedColumn = 1 then
Wofür meinst du bekommst du die Spalte übergeben? ;-)

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.vstEditing(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean);
begin
  Allowed := Column = 1;
end;
Und alle überschrieben wird ja nur weil im Beispiel in OnNewText nicht nach Spalte unterschieden wird.


MDX - Mo 30.05.11 06:09

Ich hab die Lösung wahrscheinlich zu für einfach gehalten dass ich das total überlesen hatte was genau im Kopf der Prozedur steht :D

Aber noch eine kleine Frage, wieso hat das Ding keine Funktion names onselect? ;)


jaenicke - Mo 30.05.11 06:40

Weil das ja nur das Markieren abdecken würde. Dir geht es aber um den Fokus. ;-)

Stattdessen gibt es OnFocusChanged, das sowohl beim Fokusgewinn als auch beim Verlust des Fokus ausgelöst wird (dann ist Node nicht Assigned).