AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein VirtualStringTreee auf Eintrag prüfen.

VirtualStringTreee auf Eintrag prüfen.

Ein Thema von Zodi · begonnen am 14. Jun 2020 · letzter Beitrag vom 14. Jun 2020
Antwort Antwort
Benutzerbild von Zodi
Zodi

Registriert seit: 18. Jul 2017
Ort: Berlin
35 Beiträge
 
Delphi XE7 Ultimate
 
#1

VirtualStringTreee auf Eintrag prüfen.

  Alt 14. Jun 2020, 19:16
Hi Delphianer

Gibt es eine Möglichkeit in einer VirtualStringTree zu prüfen ob ein eintrag schon vorhanden ist?
Mit der ListView habe ich das so gelöst.
Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  Li: TListItem;
begin
  Li := Listview1.FindCaption(0,Split(Strings.Strings[i], '|', 1),False,True,False);
     if Li = nil then begin
       // mach was wenn Eintrag nicht vorhanden ist
     end;
end;
Aber wie mach ich so was mit der VirtualStringTree dort gibt es kein FindCaption.
Pascal
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.619 Beiträge
 
#2

AW: VirtualStringTreee auf Eintrag prüfen.

  Alt 14. Jun 2020, 19:32
Wie speicherst du deine Daten?
Eine virtuelle Liste lebt davon, dass die Daten getrennt von der Komponente in einer eigenen Datenstruktur gespeichert werden.

Wenn du das erledigt hast, kannst du die Struktur/Liste durchgehen und ganz einfach prüfen was vorhanden ist und was nicht.

Geändert von DieDolly (14. Jun 2020 um 19:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zodi
Zodi

Registriert seit: 18. Jul 2017
Ort: Berlin
35 Beiträge
 
Delphi XE7 Ultimate
 
#3

AW: VirtualStringTreee auf Eintrag prüfen.

  Alt 14. Jun 2020, 19:54
Delphi-Quellcode:
type
   PTreeData = ^TTreeData;
   TTreeData = record
   Column0: String; Column1: String; Column2: String; Column3: String; Column4: String; Column5: String;
end;


// Neuer Wert wird geschrieben fals nicht vorhanden
procedure WriteNode(NeuerWert: String);
var
   NodeData: PTreeData;
   XNode: PVirtualNode;
begin
   XNode := WindowManager.VST.AddChild(nil);
   NodeData := WindowManager.VST.GetNodeData(Xnode);
   NodeData^.Column0 := 'Eintrag Column1';
end;

// Wert wird überprüfft
function CheckNode(FindString: String): Boolean;
var
  XNode: PVirtualNode;
  NodeData: PTreeData;
begin
  XNode := WindowManager.VST.GetFirst;
    while XNode <> nil do begin
      NodeData := WindowManager.VST.GetNodeData(XNode);
      if NodeData^.Column0 = FindString then begin
         Result := True;
         break;
    end else
      XNode := WindowManager.VST.GetNextSibling(XNode);
      Result := false;
    end;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    for i := 0 to Strings.Count -1 do begin
          if Checknode(Strings.Strings[i]) = false then WriteNode(Strings.Strings[i]);
    end;
end;
So habe ich es jetzt gemacht weiss aber nicht ob es der richtige Weg ist jedenfals funktioniert es.
Pascal
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.619 Beiträge
 
#4

AW: VirtualStringTreee auf Eintrag prüfen.

  Alt 14. Jun 2020, 20:43
Richtig oder falsch gibt es nicht. Aber AddChild ist definitiv nicht schön.
Für alles Weitere wird sich, so hoffe ich, Aviator, VST-Profi, melden.
  Mit Zitat antworten Zitat
Benutzerbild von Zodi
Zodi

Registriert seit: 18. Jul 2017
Ort: Berlin
35 Beiträge
 
Delphi XE7 Ultimate
 
#5

AW: VirtualStringTreee auf Eintrag prüfen.

  Alt 14. Jun 2020, 21:30
Dieso ist AddChild nicht schön?
Pascal
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.485 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: VirtualStringTreee auf Eintrag prüfen.

  Alt 14. Jun 2020, 23:10
Dieso ist AddChild nicht schön?
Normalerweise arbeitet man beim VST mit RootNodeCount und den Events OnInitNode und OnInitChildren . Bei AddChild werden die Nodes immer direkt beim Aufruf der Methode validiert was dazu führt, dass die unterschiedlichsten Events aufgerufen werden und dadurch der gesamte Tree die Nodes nicht mehr virtuell vorhält sondern direkt mit den echten Nutzdaten befüllt.

Wenn du RootNodeCount nutzt, dann werden virtuell nur die übergebene Anzahl Nodes erzeugt. Zudem wird das Event OnInitNode für jede Node ausgeführt um schon einmal die Daten daran zu binden. Auch ein gewisser initialer Status (mit dem Referenz Parameter InitialStates ) kann der Node bei dem Event mitgegeben werden (z.B. ob diese Children hat oder nicht). Wirklich initialisiert werden die Nodes aber erst, wenn sie entweder in den sichtbaren Bereich gelangen oder du per Code eine Funktion ausführst die diese Node betrifft.


Hier mal ein Auszug aus dem VST SourceCode zur Procedure AddChild()

Delphi-Quellcode:
// Adds a new node to the given parent node. This is simply done by increasing the child count of the
// parent node. If Parent is nil then the new node is added as (last) top level node.
// UserData can be used to set the first SizeOf(Pointer) bytes of the user data area to an initial value which can be used
// in OnInitNode and will also cause to trigger the OnFreeNode event (if <> nil) even if the node is not yet
// "officially" initialized.
// AddChild is a compatibility method and will implicitly validate the parent node. This is however
// against the virtual paradigm and hence I dissuade from its usage.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf