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 Virtual TreeView Nodes anzeigen verbergen (https://www.delphipraxis.net/131191-virtual-treeview-nodes-anzeigen-verbergen.html)

oki 20. Mär 2009 07:02


Virtual TreeView Nodes anzeigen verbergen
 
Moin,

hier mal kurz was ich will:
im VirtualStringTree von Mike versehe ich die einzelnen Nodes mit Checkboxen. Über einen Check-ToolButton möchte ich die Anzeige umschalten. Es soll zwei Anzeigemodi geben
- alle anzeigen
- nur ausgewählte anzeigen.

Daraus folgt, dass ich alle Nodes, deren Checkboxen den Status Checked = False haben im Modus "nur ausgewählte anzeigen" im Tree ausblenden möchte.

Kann mir jemand sagen, wo ich das am besten unterbringe?

Schon mal Dank für eure Mühe,

Gruß oki

generic 20. Mär 2009 08:16

Re: Virtual TreeView Nodes anzeigen verbergen
 
Das ist kein Problem, im Stammtisch Video #2 ist eine Suchdemo drin, welche Node ausblendet.

vst.IterateSubtree zum durchlaufen der Knoten verwenden und mit vst.isVisible[node]:= true | false die Knoten verstecken.

http://www.delphipraxis.net/internal...=817819#817819

oki 20. Mär 2009 09:01

Re: Virtual TreeView Nodes anzeigen verbergen
 
Hi generic,

dank für die Antwort. Ich hatte mir parallel das PDF zum VirtualTree genauer zu Gemüte geführt und dabei die Eigenschaft NodeState gefunden. Genau wie du beschrieben hast verwende ich jetzt den Typ vsVisible der Nodes zum Ein-/Ausblenden.
Da ich das über einen zentralen Schalter mache kann ich den gesamten Tree einmal abarbeiten und die entsprechenden Nodes bearbeiten.
Hier mein Code:
Delphi-Quellcode:
procedure TSettingsStyleForm.VisualizeAllNodes(Value: Boolean);
var
  ANode: PVirtualNode;
  AData: ^TVTData;
begin
  ANode := VTree.GetFirst;
  if ANode = nil then
    Exit;
  try
    VTree.BeginUpdate;
    while not (ANode = nil) do begin
      AData := VTree.GetNodeData(ANode);
      if AData.DataType = snt_Param then begin // ich möchte dies nur für Nodes tun die meinem eigenen Typ snt_Param entsprechen
        if not Value then begin                // nur die Nodes anzeigen, die in den eingeblendeten Checkboxen angewählt sind
          if ANode.CheckState = csUncheckedNormal then
            ANode.States := ANode.States - [vsVisible]
          else
            ANode.States := ANode.States + [vsVisible];
        end else
          ANode.States := ANode.States + [vsVisible]; // alle anzeigen
      end;
      ANode := VTree.GetNext(ANode);
    end;
  finally
    VTree.EndUpdate;
  end;
end;
Dank für deine Hilfe. Damit ist die Frage beantwortet,

Gruß oki

generic 20. Mär 2009 11:14

Re: Virtual TreeView Nodes anzeigen verbergen
 
Wenn du die Nodedaten (interne Struktur) direkt veränderst wird es früher oder später Probleme geben.

Am besten immer die Funktionen vom VST nutzen. Das sichert auch Kompatibilität .
Vor allem werden durch die Nutzung der VST Methoden die Ereignisse ausgelöst, was bei den internen Daten nicht der Fall ist.

Jens Hartmann 20. Mär 2009 12:20

Re: Virtual TreeView Nodes anzeigen verbergen
 
Hallo,

in dem Video wird mit folgender Funktion gearbeitet. Diese findest ungefähr ab Minute 5o bzw. 60 des Videos (glaube ich).

Delphi-Quellcode:
procedure TFDatenauswertung.SucheCallback(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
var
  Daten : TOAUMB256PLUS;
begin
  Daten := TOAUMB256PLUS(VST.GetNodeData(Node)^);
  VST.IsVisible[Node] := (EDManFilter.Text='') or (pos(EDManFilter.Text, Daten.Ereignis)>0);
end;
[EDIT] Wenn man nicht richtig ließt, endeckt man später, das die antwort so eigendlich schon gegeben wurde.

Trotzdem

Gruß Jens

generic 20. Mär 2009 13:09

Re: Virtual TreeView Nodes anzeigen verbergen
 
Und der Source sogar verlinkt ist ;-)

oki 20. Mär 2009 20:22

Re: Virtual TreeView Nodes anzeigen verbergen
 
Zitat:

Zitat von generic
Wenn du die Nodedaten (interne Struktur) direkt veränderst wird es früher oder später Probleme geben.

Am besten immer die Funktionen vom VST nutzen. Das sichert auch Kompatibilität .
Vor allem werden durch die Nutzung der VST Methoden die Ereignisse ausgelöst, was bei den internen Daten nicht der Fall ist.

Hi generic,
im Moment fehlt mir etwas der Bezug zu meinem Code.
Was meinst du mit interner Struktur?
Wo greife ich auf diese zu?
Welche Probleme sind bei Zugriff auf PVirtualNode.NodeState zu erwarten?
Warum ist dann NodeState read/write?
Welche Funktion sollte ich deiner Meinung nach nutzen um einen Node unvisible zu machen?

Ich werd mir auch noch mal das Video reinziehen. Vielleicht geht mir dann ein Licht auf.

@Jens Hartmann: ich denke dieser Teil:
Delphi-Quellcode:
VST.IsVisible[Node] :=
soll wohl das Setzen der Visible-Eigenschaft über eine Funktion realisieren. Schaun mer ma.

Dank euch beiden und Gruß

oki

Jens Hartmann 20. Mär 2009 20:59

Re: Virtual TreeView Nodes anzeigen verbergen
 
Mit dieser Funktion, führst du einen Vergleich durch.

Delphi-Quellcode:

//Das ist eigendlich jetzt die komplette Variante aus dem Video, hier die Suchfunkion
//eine Methode vom VST und verglichen wird die Eingabe aus dem Edit. (siehe Edit.Change)
procedure TFDatenauswertung.SucheCallback(Sender: TBaseVirtualTree; Node: PVirtualNode; Data: Pointer; var Abort: Boolean);
var
  Daten : TOAUMB256PLUS;
begin
  Daten := TOAUMB256PLUS(VST.GetNodeData(Node)^);
  VST.IsVisible[Node] := (EDManFilter.Text='') or (pos(EDManFilter.Text, Daten.Ereignis)>0);
end;


//Hier wird z.B. wie im Video die Eingabe in einem Edit als Suche verwendet

procedure TForm1.Edit1Change(Sender: TObject);
begin
  VST.IterateSubtree(nil, SucheCallback, nil);  //Durch die Eingabe im Edit wird die Suchfunktion aktiviert
end;
Gruß Jens

generic 20. Mär 2009 22:55

Re: Virtual TreeView Nodes anzeigen verbergen
 
Zitat:

Zitat von oki
Was meinst du mit interner Struktur?

Alles was in dem Record vom VirtualNode Datentyp ist.
Für diese Eigenschaften gibt es immer Funktionen im VST, die genutzt werden sollten.

oki 21. Mär 2009 09:58

Re: Virtual TreeView Nodes anzeigen verbergen
 
Hi generic,

gut zu wissen. Also lohnt es sich für jeden Parameter des TVirtualNode eine entsprechende Funktion zu suchen. Werd ich dann so machen.

Dank für die Info und Gruß

oki

Jens Hartmann 21. Mär 2009 10:49

Re: Virtual TreeView Nodes anzeigen verbergen
 
Jetzt hab ich aber auch mal noch ne frage zu verborgenen Teilen im einem VST.
Das heißt, ich will die nich verbergen, sondern gar nicht erste im VST stehen haben.

Wenn ich aus einer Datenbank nur die letzten 4000 einträge sehen will, dann lese ich diese auch nur ein. Kommen jetzt aber Daten neu ins VST, will ich ja nicht immer die Datenbank neu einlesen, sondern einfach parallel zum eintragen in die Datenbank, diese auch dem VST zufügen.

Das heißt wie kann ich dann den obersten Eintrag in der Ansicht löschen, und am Ende genau einen Anfügen. usw.

Hier mal so ein Ansatz. Leider komme ich damit auch nicht richtig weiter.

Delphi-Quellcode:
          if VST.RootNodeCount >= 4000 then
          begin
            //Irgendwie die gesamte erste Zeile löschen
          end;
          VST.AddChild(nil,Daten);
Gruß Jens

oki 21. Mär 2009 11:16

Re: Virtual TreeView Nodes anzeigen verbergen
 
ich denke so:
Delphi-Quellcode:
  VTree.DeleteNode(VTree.GetFirst);
gruß oki

Pichel 21. Mär 2009 11:49

Re: Virtual TreeView Nodes anzeigen verbergen
 
Zitat:

Zitat von Jens Hartmann
Mit dieser Funktion, führst du einen Vergleich durch.
Delphi-Quellcode:
//Hier wird z.B. wie im Video die Eingabe in einem Edit als Suche verwendet
procedure TForm1.Edit1Change(Sender: TObject);
begin
  VST.IterateSubtree(nil, SucheCallback, nil);  //Durch die Eingabe im Edit wird die Suchfunktion aktiviert
end;

Sollte man nicht vorher den Status des TreeView prüfen?
Delphi-Quellcode:
  if not (tsIterating in VST.TreeStates)
    then VST.IterateSubtree(nil, SucheCallback, nil);  //Durch die Eingabe im Edit wird die Suchfunktion aktiviert
Ich frage nur mal, weil ich das mal irgendwo aufgeschnappt habe ;-)

Jens Hartmann 21. Mär 2009 14:08

Re: Virtual TreeView Nodes anzeigen verbergen
 
Zitat:

ich denke so:
Delphi-Quellcode:
 
VTree.DeleteNode(VTree.GetFirst);

Das funktioniert aufjedenfall.

Gruß Jens

oki 21. Mär 2009 17:51

Re: Virtual TreeView Nodes anzeigen verbergen
 
Zitat:

Zitat von Jens Hartmann
Zitat:

ich denke so:
Delphi-Quellcode:
 
VTree.DeleteNode(VTree.GetFirst);

Das funktioniert aufjedenfall.

Gruß Jens

Schön, war das die Lösung für dich? Wenn ja, freuts mich.

Gruß oki

Jens Hartmann 21. Mär 2009 23:50

Re: Virtual TreeView Nodes anzeigen verbergen
 
Ja, deine frage, und meine Lösung. Hat sich halt durch deine Frage ergeben.

Hast Du denn dein Problem gelößt.

Gruß Jens

oki 22. Mär 2009 11:30

Re: Virtual TreeView Nodes anzeigen verbergen
 
Hi,

ich will das mit dem Visible heute umarbeiten. Damit ist das zwar noch nicht getestet, aber meine Frage ist beantwortet. Es hat zwar auch mit der direkten Änderung des NodeState wie in meinem zweiten Post geklappt, aber die Argumente für die Nutzung der Funktion sind einleuchtend. Deshalb werde ich es so ändern wie ihr es vorgeschlagen habt. Man muss sich ja nicht mit Macht neue Baustellen fabrizieren.

Dank und Gruß

oki


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