AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

.... nochmals VirtualStringTree

Ein Thema von marcus · begonnen am 7. Okt 2004 · letzter Beitrag vom 14. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#1

.... nochmals VirtualStringTree

  Alt 7. Okt 2004, 18:37
Hallo zusammen,

ich kämpfe mal wieder mit der VirtualStringTree-Komponente.
Bis jetzt funktioniert die Darstellung ohne Childnodes und das Prinzip der VirtualStringTree ist mir, glaube ich, auch klar (Trennung von Struktur und Inhalt- grob gesagt).
Für eine einzeilig Node habe ich einen einfachen Record, der ungefähr so aussieht:

Delphi-Quellcode:
type
  tVSTData = record
  String1 : String;
  String2 : String;
  Zahl3 : Integer;
end;
Wenn ich jetzt aber eine ChildNode hinzufügen will, wie schaut dann der Record aus? Muss ich einfach eine zusätzliche Variable vom Typ PVirtualNode dem Record hinzufügen?

Gruß
Marcus
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#2

Re: .... nochmals VirtualStringTree

  Alt 7. Okt 2004, 20:01
nö. du machst einfach node := VST1.addchild(nil); (das is der root). dann machst du VST1.AddChild(Node); // Das is dann das child zu dem root. den record musst du nich ändern..
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#3

Re: .... nochmals VirtualStringTree

  Alt 7. Okt 2004, 22:11
Delphi-Quellcode:
type
  tVSTData = record
  String1 : String;
  String2 : String;
  Zahl3 : Integer;
end;
zuallererst : Es fehlt ein Pointer auf die Struktur:
PVSTData = ^tVSTData; Dann musst du der VirtualTree Komponente sagen, wie groß die Struktur ist :

YourVTree.NodeDataSize := SizeOf(tVSTData); Dann kannst du einfügen
Delphi-Quellcode:
var Node : PVirtualNode;
    Data : PVSTData;
begin
  Node := YourVTree.AddChild(nil);

  Data := YourVTree.GetNodeData(Node);

  Data^.String1 := '123';
  ..
end;
das machst du immer so, wenn du was lesen oder ändern willst
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#4

Re: .... nochmals VirtualStringTree

  Alt 8. Okt 2004, 09:48
Hallo,

okay, das ist klar. Ich hab nur noch momentan ein Problem mit dem Verständnis bei unterschiedlichen Strukturen für die RootNode und die ChildNodes. Folgende Struktur mal angenommen:

Delphi-Quellcode:
+ Monat
  + Kalenderwoche
    - Projektnummer, Projektname, Datum
        .
        .
        .
Wenn ich jetzt die Projektdaten hinzufüge und einen Record habe der so ausschaut:

Delphi-Quellcode:
type
  tVSTData = record
  Monat : String;
  Kalenderwoche : String;
  Projektnummer : Integer;
  Projektname : String;
  Datum : TDateTime;
end;
dann wird doch für jedes Projekt, welches ich hinzufüge, eine RootNode Monat und Kalenderwoche hinzugefügt?

Gruß
Marcus
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#5

Re: .... nochmals VirtualStringTree

  Alt 8. Okt 2004, 10:01
Nein, Du hast eigentlich kein Verständnisproblem, denn die Struktur von Root- und Childnodes muss identisch sein.

Du kannst einem Root-Node nicht z.B. geben:

|ID|Monate

und dem Child

|ID|Monate|Tage

Allen Nodes im VT liegt die selbe Recordstruktur zugrunde (ob Du sie mit Daten füllst, ist Deine Sache).

In Deinem Beispiel hätte der VT dann 5 Spalten:

Monat|Kalenderwoche|Projektnummer|Projektname|Datu m

Gruß Igotcha

P.S. Was Du machen könntest, kannst Du hier auf dem Screenshot sehen (von meiner Anwendung)Bild. Du könntest, wo bei mir BEZEICHNUNG steht, z.B. ZEITRAUM schreiben und dann nach JAHR/MONAT Root und Childs bilden, dafür musst Du aber Deine Datenstruktur grundlegend anpassen und eine Parent/Child-Relation hinterlegen

Dein Record könnte dann z.B. so aussehen:

Delphi-Quellcode:
type
PVSTData = ^TVSTData;
TVSTData = record
strPeriode: String;
iProjektnummer: Integer;
strProjektname: String;
dDatum: TDateTime;
strParentID: String;
end;
Deine Records könnten nun so aussehen:

Code:
PERIODE     PROJEKTNR PROJEKTNAME DATUM     PARENTID
10/2004      NULL     NULL       NULL      0
42           12345     Test       11.10.2004 10/2004
42           45678     Test2       13.10.2004 10/2004
11/2004      NULL     NULL       NULL      0
45           78901     Test3       01.11.2004 11/2004
Wenn Du jetzt z.B. aus der DB auslesen willst, machst Du ein

SELECT * FROM tabelle ORDER BY PARENTID, KW, DATUM

liest alles in einer Schleife ein und abhängig von PARENTID erstellst Du einen Rootnode oder einen passenden Childnode zur PARENTID.
  Mit Zitat antworten Zitat
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#6

Re: .... nochmals VirtualStringTree

  Alt 8. Okt 2004, 10:14

also wenn ich Monat und Kalenderwoche(um das vorherige Beispiel aufzugreifen) nichts zuweise, und eine Node anlege dann werden die "Einträge" des Records die Leer sind nicht angezeigt?

Wenn das so ist, dann wird es natürlich schon etwas klarer. Denn bei den Beispielen habe ich immer nach den Strukturen der Nodes gesucht und es war mir nie klar wie zwischen den einzelnen Nodes (Root,Child) unterschieden wird. Die Unterscheidung findet also nur in der "Befüllung" meines Records/Objects statt?

Gruß
Marcus
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#7

Re: .... nochmals VirtualStringTree

  Alt 8. Okt 2004, 10:23
Schau Dir mal mal meinen editierten Post an.
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#8

Re: .... nochmals VirtualStringTree

  Alt 8. Okt 2004, 10:32
EDIT: Ich habe meine Beispielstruktur editiert, da sie murks war Du musst nur darauf achten, dass Du Dir irgendwie eine eindeutige PARENTID bastelst (evtl. Nimmst Du noch das Jahr mit rein beim Monat) - mein Beispiel ist nicht eindeutig, da es MONAT=11 und KW=11 geben kann, also für die Spalte ZEITRAUM. Besser, Du schreibst beim Monat noch das Jahr dazu.

Du wirst dabei aber auf ein grundsätzliches "Problem" bei der Arbeit mit VTs stossen, denn man kann Nodes dort nicht direkt anspringen. Sprich sowas wie "hänge den Child an den Node 123" gibt es von Hause aus nicht.

Da kannst Du Dir eine Funktion zu schreiben:

Delphi-Quellcode:
function TfrmMain.FindNodeByPERIODE(aTree: TBaseVirtualTree;
  aID: String;): PVirtualNode;
var
   NodeData: pVSTData;
begin
   Result := aTree.GetFirst;
   while Assigned(Result) do
   begin
     NodeData := pVSTData(aTree.GetNodeData(Result));
     if NodeData^.strPeriode=aID Then
       Exit;
     Result := aTree.GetNext(Result);
   end;
end;
Wenn Du also in Deiner Schleife auf einen Eintrag stößt, wo PARENTID <> 0 ist, dann rufst Du auf:

Code:
 
var
aktueller_knoten: PVirtualNode;
myData: PVSTData;
begin
<--- SCHLEIFENAUSZUG
<--- dieses Konstrukt musst Du in der Schleife für Childs verwenden
aktueller_knoten:=DEINVST.AddChild( FindNodebyPERIODE(DEINVST, PARENTID));
myData:=DEINVST.GetNodeData(aktueller_knoten);
myData.strPeriode:=inttostr(42); //KALENDERWOCHE
myData.strProjektname:='Test';
etc.
end;
Und das Child wird an den richtigen Root angehängt.

Beim Arbeiten mit VSTs muss man sich erstmal bewußt werden, dass dieser wirklich nichts anderes macht, als spitzenmäßige Visualisierungsmöglichkeiten für Treeview-artige Strukturen zu ermöglichen - die Datenhaltung musst Du selbst machen.

Gruß Igotcha
  Mit Zitat antworten Zitat
marcus

Registriert seit: 13. Okt 2003
37 Beiträge
 
#9

Re: .... nochmals VirtualStringTree

  Alt 8. Okt 2004, 10:49
Wow! Vielen Dank, das hilft mir schon ziemlich weit.
Heute Nachmittag nach der Arbeit wird das erst mal ausprobiert
VirtualStringTree ist schon eine recht komplexe Komponente, und da erst mal einen Überblick zu bekommen und die Grundlegenden Sachen zu verstehen dauert schon ein weilchen.

Gruß
Marcus
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#10

Re: .... nochmals VirtualStringTree

  Alt 8. Okt 2004, 16:20
ich find den VST nur noch genial
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:12 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