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 [VST] Daten hinzufügen ? (https://www.delphipraxis.net/113028-%5Bvst%5D-daten-hinzufuegen.html)

Hansa 1. Mai 2008 14:05


[VST] Daten hinzufügen ?
 
Moin,

kennt einer den Lischkeschen VirtualStringTree etwas besser als ich ? :mrgreen: Wo liegt hier der Fehler ?

Delphi-Quellcode:
type PMydata = ^TMyData;

  TMyData = Record
    st : string;
  end;

var
  Form1: TForm1;
  Data : PMyData;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
var NewNode : PVirtualNode;
begin
  with DS do begin
    Close;
    SelectSQL.Text := 'SELECT * FROM TABLE';
    Open;
    vst.NodeDataSize := SizeOf (TMyData);
    while not Eof do begin
      NewNode := vst.AddChild(nil);
      Data := vst.GetNodeData(NewNode);
      Data^.st := DS.FieldByName...;
      Next;
    end;
  end;
Es sind anscheinend genauso viele Nodes vorhanden, wie Datensätze gefunden werden. Soweit stimmt das. Obwohl, wie kriegt man eigentlich die Anzahl raus ? :gruebel: Aber die heißen alle "Node". Stattdessen soll ein Feld angezeigt werden (siehe FieldByName).

toms 1. Mai 2008 14:41

Re: [VST] Daten hinzufügen ?
 
Zitat:

Zitat von Hansa
Obwohl, wie kriegt man eigentlich die Anzahl raus ?

Delphi-Quellcode:
  TVirtualNode = packed record
    TotalCount,             // sum of this node, all of its child nodes and their child nodes etc.
Zitat:

Zitat von Hansa
Aber die heißen alle "Node". Stattdessen soll ein Feld angezeigt werden (siehe FieldByName).

Hast du OnGetText implementiert?

Hansa 1. Mai 2008 18:14

Re: [VST] Daten hinzufügen ?
 
Zitat:

Zitat von toms
..Hast du OnGetText implementiert?

Erkläre mir, was die Parameter zu bedeuten haben, dann mache ich das. :lol: Aber ich sehe schon : hier kommt wohl kaum was. Der VST scheint nicht so verbreitet zu sein, wie von mir angenommen.

P.S.: TotalCount ist identisch mit "Count Records" in IBExpert. Das geht also so, wie vermutet. 8)

toms 1. Mai 2008 18:20

Re: [VST] Daten hinzufügen ?
 
Ich mache es etwa so:

Delphi-Quellcode:
procedure TForm1.TreeGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
begin
  Data := vst.GetNodeData(Node);
  CellText := Data.st;
end;
Siehe auch VirtualTreeView Tutorial

Hansa 1. Mai 2008 18:27

Re: [VST] Daten hinzufügen ?
 
Thx, so gehts. Das ist aber wohl nur die Spitze des Eisbergs. Der Thread hier wird lang werden. :mrgreen:

toms 1. Mai 2008 18:52

Re: [VST] Daten hinzufügen ?
 
Zitat:

Zitat von Hansa
Thx, so gehts. Das ist aber wohl nur die Spitze des Eisbergs. Der Thread hier wird lang werden. :mrgreen:

Kein Problem. Frag nur, falls du noch weitere Fragen hast.

Hansa 1. Mai 2008 19:18

Re: [VST] Daten hinzufügen ?
 
Du kennst dich damit aus ? Das ist gut. :-D Das nächste ist jetzt : Detaildaten hinzuzufügen. Wie/wo kann man unterscheiden, ob überhaupt welche da sind (-> + erscheint) oder nicht ? Dann fehlt noch das Ereignis beim klicken auf das +. Ich muss da eben dann die Detaildaten zusammensuchen und anzeigen.

toms 1. Mai 2008 19:33

Re: [VST] Daten hinzufügen ?
 
Zitat:

Zitat von Hansa
Du kennst dich damit aus ? Das ist gut. :-D Das nächste ist jetzt : Detaildaten hinzuzufügen. Wie/wo kann man unterscheiden, ob überhaupt welche da sind (-> + erscheint) oder nicht ? Dann fehlt noch das Ereignis beim klicken auf das +. Ich muss da eben dann die Detaildaten zusammensuchen und anzeigen.

Wenn du HasChildren eines Nodes auf True setzt, wird vor dem Node ein + angezeigt.

Delphi-Quellcode:
VST.HasChildren[Node] := True
Im OnCollapsing kannst du dann die Kindernodes erzeugen.
Falls Node.FirstChild nicht NIL ist, existieren schon Unterknoten.

Hansa 1. Mai 2008 20:13

Re: [VST] Daten hinzufügen ?
 
D.h., ich muss selber ermitteln, ob Detaildaten vorhanden sind und dann HasChildren entsprechend setzen ? Dann müsste ich mal das Laufzeitverhalten überprüfen. Meine Testdaten liefern ca. 30.000 Haupt-Nodes und diese dürften jewils im Schnitt 10-30 Unternodes haben. Mit IsEmpty, Count (*), WHERE etc. dürfte das aber wohl gehen.

Allerdings ist folgendes noch unklar : bei den Hauptnodes brauche ich als Daten nur die Nr. Bei dn Detailnodes wird mehr gebraucht. Wie setze ich da konkret die Daten-Records ein (sizeof..) ? :shock: Ich muss das ja irgendwie unterscheiden. Und selbst wenn klar ist, ob ein + da ist oder nicht. Wie kriege ich nur dieses eine + aufgeklappt ? In der dann erscheinenden Liste müssten dann völlig andere Detaildaten drinstehen. Mal sehen, ob am "Tag der Arbeit" noch ein Ergebnis rauskommt. :mrgreen:

himitsu 1. Mai 2008 20:20

Re: [VST] Daten hinzufügen ?
 
die Größe (SizeOf) setzt du einfach auf den größeren Record, oder du erstellst dir gleich Einen für beide

z.B.:
Delphi-Quellcode:
TMyNodeData = Record
  Case Integer of
    0: (
      {Typen für Hauptnode}
      Nr: Integer;
    );
    1: (
      {Typen für Detailnode}
      EtwasMehr...
    );
End;

generic 2. Mai 2008 09:02

Re: [VST] Daten hinzufügen ?
 
wenn du das tutorial nicht lesen willst, kannst du alternativ ein video schauen:
http://www.delphipraxis.net/videos#Stammtisch_2

Hansa 3. Mai 2008 11:36

Re: [VST] Daten hinzufügen ?
 
Die Fragen sind NACH dem Lesen des Tutorials aufgetaucht. Ähhm, ist das etwa von dir ? :mrgreen: Master/Detail habe ich jetzt in dem VST abgebildet. Allerdings fehlt mir die Funktion, alle Knoten aufzuklappen. Gibts das überhaupt ? Ich muss noch untersuchen, ob leere Knoten richtig behandelt werden.

Nuclear-Ping 3. Mai 2008 11:48

Re: [VST] Daten hinzufügen ?
 
VST.FullExpand oder VST.Expanded[Node] := TRUE/FALSE

Hansa 3. Mai 2008 12:00

Re: [VST] Daten hinzufügen ?
 
Ah ja. Thx. :thumb: Das schwierigste an dem Ding ist für mich wohl die Nomenklatur. Da sucht man nach Count und es ist TotalCount. Expand ist FullExpand. :shock: Das Fullexpand brauche ich nur für Testzweccke. Wo ist jetzt aber die Funktion gezielt auf ein Klick auf das + zu reagieren ?

Nuclear-Ping 3. Mai 2008 12:20

Re: [VST] Daten hinzufügen ?
 
OnExpanded / OnExpanding ;)

Hansa 3. Mai 2008 12:42

Re: [VST] Daten hinzufügen ?
 
Mann, bin ich dämlich. :mrgreen: Wenn ich das + anklicke, wie kriege ich dann noch raus, um welchen Knoten es sich handelt ? Die Detaildaten von Anfang an alle komplett zu lesen, das wird zu viel. Noch besser wäre es, nicht nur das + treffen zu müssen, sondern nur den kompletten Knoten (also egal, ob + oder Beschriftung

Nuclear-Ping 3. Mai 2008 12:56

Re: [VST] Daten hinzufügen ?
 
In den Events gibt er doch den Node mit?

toms 3. Mai 2008 14:11

Re: [VST] Daten hinzufügen ?
 
Zitat:

Zitat von Nuclear-Ping
In den Events gibt er doch den Node mit?

Ja, das gibt es

Delphi-Quellcode:
OnExpanding(Sender: TBaseVirtualTree; Node: PVirtualNode; var Allowed: Boolean);

Hansa 4. Mai 2008 15:19

Re: [VST] Daten hinzufügen ?
 
Jetzt habe ich über 2 Stunden gebraucht, noch mit Umwegen über die TreeView-Hilfe, um das rauszufinden :

Delphi-Quellcode:
 ShowMessage(vstDaten.Text [Node,0]);
Zumindest kann ich jetzt weitermachen.

Delphi-Quellcode:
NewNode := vstDaten.AddChild(nil);
...
if not DS.IsEmpty then
//  vstDaten.HasChildren [NewNode] := True;
  NewChildNode := vstRecDaten.AddChild(NewNode); // bleibt vorerst leer !!
Die Datenmengen sind doch zu groß, um den VST direkt komlett zu füllen. Jetzt muss ein + her, sofern Detaildaten überhaupt vorhanden sind. Die Holzhammermethode mit leerem Knoten einfügen die geht. :zwinker: Dann muss das Ding aber wieder weg und richtig gefüllt werden. Das auskommentierte mit dem HasChildren funktioniert so nicht. Warum ? :shock:

P.S.: das mit dem HasChildren hat sich vorerst erledigt. DS.Open war falsch auskommentiert. 8)

OG Karotte 5. Mai 2008 09:41

Re: [VST] Daten hinzufügen ?
 
Zitat:

Zitat von Hansa
Die Datenmengen sind doch zu groß, um den VST direkt komlett zu füllen. Jetzt muss ein + her, sofern Detaildaten überhaupt vorhanden sind. Die Holzhammermethode mit leerem Knoten einfügen die geht.

Nun, um erst einmal darzustellen, das überhaupt Kindknoten vorhanden sind, sollte das ausreichen. Wenn Du nun den entspr. Knoten aufklappst, dann setzt Du die tatsächliche Anzahl der Kindknoten im OnInitChildren. Anschließend "befüllst" Du die Kindknoten mit ihren Daten im OnInitNode...

Hansa 5. Mai 2008 14:21

Re: [VST] Daten hinzufügen ?
 
Ist da nicht OnExpanding besser geeignet ? Es soll ja nur bei Klick auf das + reagiert werden.

OG Karotte 5. Mai 2008 14:26

Re: [VST] Daten hinzufügen ?
 
Zitat:

Zitat von Hansa
Ist da nicht OnExpanding besser geeignet ? Es soll ja nur bei Klick auf das + reagiert werden.

Die Initialisierung der ChildNodes erfolgt tatsächlich erst beim Expandieren (falls bis dahin noch nicht geschehen). D.h. Du sagst dem VST zwar schon wieviel Childnodes zum jeweiligen Parent hinzukommen, aber sie werden erst mit "Leben" hinterfüllt wenn sie angezeigt werden sollen.

Hansa 5. Mai 2008 14:38

Re: [VST] Daten hinzufügen ?
 
Und wo liegt jetzt der Vorteil von was ?

OG Karotte 5. Mai 2008 14:43

Re: [VST] Daten hinzufügen ?
 
Zitat:

Zitat von Hansa
Die Datenmengen sind doch zu groß, um den VST direkt komlett zu füllen. Jetzt muss ein + her, sofern Detaildaten überhaupt vorhanden sind. Die Holzhammermethode mit leerem Knoten einfügen die geht. Zwinkern Dann muss das Ding aber wieder weg und richtig gefüllt werden.

Und wo liegt jetzt der Vorteil von was ?

Nun, ich bezog das auf obiges. Somit brauchst Du keinen leeren "Fake"-Node hinzufügen und diesen später wieder entfernen (Zumindest habe ich obigen Text so verstanden...)


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