Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualTreeView: Konten n auswählen/markieren (https://www.delphipraxis.net/124922-virtualtreeview-konten-n-auswaehlen-markieren.html)

Viktorii 27. Nov 2008 11:50


VirtualTreeView: Konten n auswählen/markieren
 
Hallo zusammen.

Wie kann ich im Code den Knoten n auswählen/markieren/fokusieren?

Ich habe es mal so versucht, bekomme aber ne Exception:

Delphi-Quellcode:
myVST.FocusedNode.Index := StrToInt(EditListCount.Text);
Wie mache ich es richtig?
Vielen Dank :dp:

madas 27. Nov 2008 12:05

Re: VirtualTreeView: Konten n auswählen/markieren
 
Delphi-Quellcode:
vst.FocusedNode := NodeToFocus;
if Assigned(vst.FocusedNode) then
  vst.Selected[vst.FocusedNode] := True;

Viktorii 27. Nov 2008 12:14

Re: VirtualTreeView: Konten n auswählen/markieren
 
Wenn ich es so mache:

Delphi-Quellcode:
var
  NodeToFocus      : Integer;

begin
  NodeToFocus := StrToInt(EditListCount.Text);
  VST.FocusedNode := NodeToFocus;
  if Assigned(VST.FocusedNode) then
    VST.Selected[VST.FocusedNode] := True;

...
...
bekomme ich folgenden Fehler:

Zitat:

[DCC Fehler] RS422LogParser_MainUnit.pas(240): E2010 Inkompatible Typen: 'PVirtualNode' und 'Integer'

taaktaak 27. Nov 2008 12:39

Re: VirtualTreeView: Konten n auswählen/markieren
 
Kenne VST nicht, aber es wird offenbar ein Zeiger auf eine Node erwartet. Du musst also aus dem Integer-Index einen Zeiger auf eine Node machen. Im "normalen" Treeview gibt's da "Items[Index]"...

itashadow 27. Nov 2008 12:51

Re: VirtualTreeView: Konten n auswählen/markieren
 
was steht den in EditListCount.Text?

wenn drin steht, dass wievielte node von oben es ist müsste das so gehen:
Delphi-Quellcode:

var
 node : pvirtualnode;
begin
  node := vst.GetFirst;

  for i = 0 to strtoint(EditListCount.Text) do
  begin
    node := vst.GetNext(node);
  end;
  vst.focusednode := node;
  VST.Selected[VST.FocusedNode] := True;
end;

madas 27. Nov 2008 12:52

Re: VirtualTreeView: Konten n auswählen/markieren
 
VST ist vom Typ VirtualStringTree und NodeToFocus vom Typ PVirtualNode.

Viktorii 27. Nov 2008 13:14

Re: VirtualTreeView: Konten n auswählen/markieren
 
Ich möchte gerne einen gewissen Knoten selektieren.

Ich habe also eine Variable vom Typ Integer. In der steht beispielsweise der Wert 12.

Wie bekomme ich es nun hin, dass in diesem Fall der zwölfte Knoten mit dem blauen Balken im VST selektiert ist.



var
NodeToFocus : Integer;
begin
NodeToFocus := 12;

???
???


Wie würde es nun weitergehen?


EDIT:

Zitat:

Zitat von itashadow
was steht den in EditListCount.Text?

wenn drin steht, dass wievielte node von oben es ist müsste das so gehen:
Delphi-Quellcode:

var
 node : pvirtualnode;
begin
  node := vst.GetFirst;

  for i = 0 to strtoint(EditListCount.Text) do
  begin
    node := vst.GetNext(node);
  end;
  vst.focusednode := node;
  VST.Selected[VST.FocusedNode] := True;
end;

Das scheint genau das zu machen was ich wollte. Vielen Dank!

sh17 27. Nov 2008 17:06

Re: VirtualTreeView: Konten n auswählen/markieren
 
besser wäre allerdings

Delphi-Quellcode:
  node := vst.RootNode.FirstChild;

  while node <> nil do
  begin
    if Integer(Node.Index) = strtoint(EditListCount.Text) then
      break;
    node := Node.NextSibling;
  end;

Viktorii 28. Nov 2008 07:56

Re: VirtualTreeView: Konten n auswählen/markieren
 
Zitat:

Zitat von sh17
besser wäre allerdings

Delphi-Quellcode:
  node := vst.RootNode.FirstChild;

  while node <> nil do
  begin
    if Integer(Node.Index) = strtoint(EditListCount.Text) then
      break;
    node := Node.NextSibling;
  end;

Aus welchem Grund ist das besser? Ist das performanter?

sh17 28. Nov 2008 08:02

Re: VirtualTreeView: Konten n auswählen/markieren
 
Nein - sicherer

Bei der vorherigen Variante ist nicht sichergestellt, dass überhaupt soviel Knoten wie der gewünschte Index vorhanden sind. Da kann schon mal ein Node = nil auftreten. Und implizit davon auszugehen, das Node.Index = i ist ist auch etwas schwammig.

Zumal Du jetzt noch optimieren kannst, indem Du nicht bei FirstChild anfängst, sondern bei irgend einem Knoten, den Du grad am Wickel hast. Dann musst Du nur noch schauen, ob Dur vorwärts oder rückwärts gehen musst. Das wäre dann was für die Performance.

Gruß, Sven


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