Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi VirtualStringTree mit den Tasten navigieren (wie ein TreeView) (https://www.delphipraxis.net/189389-virtualstringtree-mit-den-tasten-navigieren-wie-ein-treeview.html)

Bjoerk 7. Jun 2016 17:31


VirtualStringTree mit den Tasten navigieren (wie ein TreeView)
 
Hat jemand eine Ahnung davon, wie man ein VirtualStringTree mit den Tasten navigieren kann (wie ein TreeView), daß also zum Beispiel bei "a" ein Item den Fokus bekommet wird, dessen Text mit a beginnt? Da die VirtualStringTree Items nicht über eine Eigenschaft Text verfügen muß das wohl irgendwie anders funktionieren. Aber wie?:gruebel:

Aviator 7. Jun 2016 20:36

AW: VirtualStringTree mit den Tasten navigieren (wie ein TreeView)
 
Du kannst natürlich auf die Text Eigenschaft einer Node + Column zugreifen mit
Delphi-Quellcode:
vst.Text[Node, Column]
. Aber für den Fall, dass du eine Funktion wie im Windows Explorer programmieren möchtest, dass wenn du "a" drückst, er auch auf den ersten gefundenen Eintrag mit "a" springt, dann solltest du die IncrementalSearch Funktion des Trees verwenden. Funktioniert super und habe ich auch schon in meinen eigenen Projekten benutzt.

Bjoerk 8. Jun 2016 07:43

AW: VirtualStringTree mit den Tasten navigieren (wie ein TreeView)
 
Ok. Dank' Dir. Hab jetzt (erst mal) was nach VSTKeyPress geschrieben. Ich verwende statt Node.Data sowieso eine kleine Helperklasse zur Verwaltung der Captions und Items, damit geht es dann auch.

Delphi-Quellcode:
procedure TDirectoryTreeView.VSTKeyPress(Sender: TObject; var Key: Char);
var
  Node: PVirtualNode;
begin
  Node := FVirtualDirectoryTree.GetNext(Key);
  if Node <> nil then
  begin
    Key := #0;
    VSTChange(FVST, Node);
  end;
end;

..

function TVirtualDirectoryTree.GetVisible(Node: PVirtualNode): boolean;
var
  Temp: PVirtualNode;
begin
  Result := true;
  Temp := Node.Parent;
  while (Temp <> nil) and (Temp <> FVST.GetFirst) do
  begin
    if not FVST.Expanded[Temp] then
    begin
      Result := false;
      Exit;
    end;
    Temp := Temp.Parent;
  end;
end;

function TVirtualDirectoryTree.GetNext(const C: Char): PVirtualNode;
const
  CharSet: string = '0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ_abcdefghijklmnopqrstuvwxyzäöüß';
var
  Node: PVirtualNode;
  A, B: Char;
  S: string;
begin
  Result := nil;
  FWorking := true;
  try
    if Pos(C, CharSet) > 0 then
    begin
      A := FUpperCaseChar[C];
      Node := FindNodePath(FDirectory);
      Node := FVST.GetNext(Node);
      while Node <> nil do
      begin
        S := Caption[Node];
        B := FUpperCaseChar[S[1]];
        if (A = B) and Visible[Node] then
        begin
          Result := Node;
          Exit;
        end;
        Node := FVST.GetNext(Node);
      end;
    end;
  finally
    FWorking := false;
  end;
end;


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