Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Treeview zur Laufzeit "befüllen"
Max Payne - Fr 15.07.05 14:33
Titel: Treeview zur Laufzeit "befüllen"
Hi
Ich möchte ein Treeview Componente mit dem Inhalt eines Arrays ausfüllen. Das Array slebst wird erst zu Laufzeit bekommt seinen Inhalt auch erst zur Laufzeit also muss dies auch beim Treeview passieren.
Undzwar ist dies ein Array mit Records. Ich weiß nicht genau wie ich das nenne soll also ein Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type TBeispiel = record Bsp1: Integer; Bsp2: String; Bsp3: String; Bsp4: String; end;
var Form1: TForm1; Provinzen: Array[1..50] of TBeispiel; |
Ich hoffe mal mir kann geholfen werden
Danke
Klabautermann - Fr 15.07.05 15:53
Hi,
bin momentan unter Linux unterwegs, daher können hier bezeichnungen von den korreckten abweichen.
Also Es gibt bei tTreeview die Methode AddChild (eventuell auch unter Items [also als teil von tTreeItems]). Über diese Kannst du dann Elemente hinzufügen. Hierzu musst du neben den Namen noch ein ParendNode wenn die diese als NIL angibst wir ein Hauptknoten angelegt.
Die Funktion liefert ein tTreeNode Objekt zurück, welchen du dann Dinge wie z.B. das entsprechende Image zuweisen kannst.
Gruß
Klabautermann
PS: Bin nacher wieder an einer Windows Maschiene, dann kann ich falls Nötig Beispielquelltext nachliefern
delphimike - Fr 15.07.05 16:04
Hier ein Beispiel wie aus einer Datenbank Daten in ein Treeview übertragen werden.
var n:TTreenode;
img:integer;
Nodeinfo : PNodeinfo;
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| while not BankTable.eof and (BankTable.FieldByName('Art').asstring=art) do begin
s:=currToStrF (Banktable.fieldbyname('Betrag').ascurrency,ffcurrency,2); s:=Banktable.Fieldbyname('Name').asstring+' ['+s+']';
Nodeinfo:=New(PNodeinfo); Nodeinfo.countref:=Banktable.fieldbyname('counter').asinteger; Nodeinfo.faellig:=Banktable.fieldbyname('fällig').asstring;
n:=Banktree.items.addchildobject (node,s,Nodeinfo); img:=image;
if Art[1]='O' then begin if Banktable.fieldbyname('turnus').asinteger<>0 then img:=img+6; if Banktable.fieldbyname('fällig').asstring<=swapdate(longdate) then img:=img+2 else if Banktable.fieldbyname('fällig').asstring<=swapdate(weekdate) then img:=img+4; end; n.selectedindex:=img; n.imageindex:=img; BankTable.next; end; |
Moderiert von
Klabautermann: Code- durch Delphi-Tags ersetzt.
Klabautermann - Fr 15.07.05 16:47
Hallo noch einmal.
Also klabüsern wir das doch mal auseinander (jetzt mit beispielen).
Fangen wir an mit dem reinen dynamischen erzeugen der Knoten.
Dieses Beispiel werzeug 26 Hauptknoten mit Bild und den Bezeichnungen 'a' bis 'z':
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button1Click(Sender: TObject); var MyArray : array['a'..'z'] of char; NewNode : tTreeNode; i : char; begin for i := 'a' to 'z' do MyArray[i] := i; for i := 'a' to 'z' do begin NewNode := TreeView1.Items.AddChild(nil, MyArray[i]); NewNode.ImageIndex := 0; NewNode.SelectedIndex := 0; end; end; |
Wie du siehst wird ein neuer Knoten einfach mit
NewNode := TreeView1.Items.AddChild(nil, MyArray[i]); erzeugt wobei der erste Parameter der Elternknoten ist (bei Hauptknoten ist
nil anzugeben) der Zweite entspricht der Caption. An dem zurückgeliferten Element (NewNode) können dann sämmliche weitere Eigenschaften geändert werden, was hier am Beispiel von ImageIdex und SelectedIndex vorgeführt wird.
Wenn du den BAum nciht in die Breite sondern in die Tife erzeugen willst kannst du das BEispiel so abändern:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); var MyArray : array['a'..'z'] of char; NewNode : tTreeNode; i : char; begin for i := 'a' to 'z' do MyArray[i] := i; NewNode := nil; for i := 'a' to 'z' do begin NewNode := TreeView1.Items.AddChild(NewNode, MyArray[i]); NewNode.ImageIndex := 0; NewNode.SelectedIndex := 0; end; end; |
Kommen wir zu den Angehängten Daten:
Wenn du das Array ohne als (Objekt)Globale Vaiable vorliegen hast reicht es wenn du den Index mitspeichers. Das geschit am besten indem du den Pointer
Data misbrauchst. Das sähe so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| procedure TForm1.Button1Click(Sender: TObject); type tMyType = record Caption : string; Bsp1: Integer; Bsp2: String; Bsp3: String; Bsp4: String; end; var MyArray : array[1..26] of tMyType; NewNode : tTreeNode; i : integer; begin for i := 1 to 26 do MyArray[i].Caption := Format('Knoten %d', [i]); for i := 1 to 26 do begin NewNode := TreeView1.Items.AddChild(nil, MyArray[i].Caption); NewNode.ImageIndex := 0; NewNode.SelectedIndex := 0; NewNode.Data := ptr(i); NewNode.Text := NewNode.Text + ' - ' + MyArray[longint(NewNode.Data)].Bsp2; end; end; |
Wenn du die Daten allerdings wiklich anhängen willst musst du ein wenig Zeigerzauberei betrienben. Auch hier ein Beispiel allerdings ohne Array. Diesesmal vergewaltigenwir die Data Eigenschaft nicht sondern nutzen sie so wie es sich gehört:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.Button1Click(Sender: TObject); type tMyType = record Caption : string; Bsp1: Integer; Bsp2: String; Bsp3: String; Bsp4: String; end; pMyType = ^tMyType; var MyArray : array[1..26] of tMyType; NewNode : tTreeNode; NewData : pMyType; i : integer; begin for i := 1 to 26 do begin NewData := new(pMyType); NewData^.Caption := Format('Knoten %d', [i]); NewData^.Bsp2 := 'Beispiel Text'; NewNode := TreeView1.Items.AddChild(nil, MyArray[i].Caption); NewNode.ImageIndex := 0; NewNode.SelectedIndex := 0; NewNode.Data := NewData; NewNode.Text := NewNode.Text + ' - ' + pMyType(NewNode.Data)^.Bsp2; end; end; |
Wenn du den Baum wieder abbaust, musst du bei dieser letzten Variante daran denken, auch deinen Dynamischen Apeicher wieder per
dispose frei zu geben.
So ich hoffe ich habe dich nciht al zu sehr verwirrt und du kannst etwas damit anfangen.
Gruß
Klabautermann
Max Payne - Fr 15.07.05 18:33
Immerhin komm ich jetzt schon weiter!
Aber ich hab noch ein paar fragen dazu. Was ist mit Image/Bild usw gemeint? In welcher Reihenfolge werden die Nodes angezeigt in der sie hinzugefügt wurden oder alphabetisch bzw besteht die Möglichkeit zu sortieren? Ich habe bestimmt noch mehr fragen jedoch schwirren im Moment zuviele Gedanken in meinem Kopf herum.
Moderiert von
Klabautermann: Zusätzliche Frage entfernt, diese wird hier [http://www.delphi-forum.de/topic_TreeView+durchsuchen_45340.html] seperrat gestellt.
Klabautermann - Fr 15.07.05 18:53
Hallo,
Max Payne hat folgendes geschrieben: |
Aber ich hab noch ein paar fragen dazu. Was ist mit Image/Bild usw gemeint? |
den Unterschied siehst du im angehängten Bild.
Max Payne hat folgendes geschrieben: |
In welcher Reihenfolge werden die Nodes angezeigt in der sie hinzugefügt wurden oder alphabetisch bzw besteht die Möglichkeit zu sortieren? |
Ersteinmal werden die Knoten in der reihenfolge eingeordnet in der du sie erzeugst. Wenn du anstelle von
AddChild AddChildFirst oder
Insert verwendet kannst du eine sortierung ereichen. Wie genau diese funktionieren, kanst du der Delphi Hilfe entnehmen.
Wenn du nach dem erzeugen der Knoten folgende zuweisung ausführst erhällst du eine Sortierung nach dem Text:
Delphi-Quelltext
1:
| TreeView1.SortType := stText; |
Gruß
Klabautermann
Klabautermann - Sa 16.07.05 14:32
Hallo,
Max Payne hat folgendes geschrieben: |
[Edit]Da haben wir schon was neues: {...}[/Edit] |
und jetzt einmal in meiner offiziellen Funktion: So nicht hier im Forum gild "neue Frage neues Topic". Da du ohnehin schon ein neues mit der Frage gemacht hast, habe ich diese zusatzfrage aus deinem Beitrag gelöscht, dammit nierman auf die Idee kommt
hier darauf zu antworten.
Gruß
Klabautermann
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!