Autor Beitrag
Max Payne
Hält's aus hier
Beiträge: 11

Win XP
D3.0 Prof
BeitragVerfasst: Fr 15.07.05 14:33 
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:
ausblenden 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..50of TBeispiel;


Ich hoffe mal mir kann geholfen werden
Danke
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 117



BeitragVerfasst: 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;

ausblenden 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
{anzuzeigender Text in s erstellen}
    s:=currToStrF (Banktable.fieldbyname('Betrag').ascurrency,ffcurrency,2);
    s:=Banktable.Fieldbyname('Name').asstring+' ['+s+']';
{ Mitgeschleifte Daten (nicht unbedingt nötig) }
    Nodeinfo:=New(PNodeinfo);
    Nodeinfo.countref:=Banktable.fieldbyname('counter').asinteger;
    Nodeinfo.faellig:=Banktable.fieldbyname('fällig').asstring;
{Eintrag in den Tree ; node ist der Knoten unter dem der Eintag erfolgt, muß zuvor auch per add definiert werden}
    n:=Banktree.items.addchildobject (node,s,Nodeinfo);
    img:=image;
{image festlegen}
    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 user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt.

_________________
kaum macht man was richtig, schon gehts!
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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':

ausblenden 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
  // Beispieldaten ins Appay
  for i := 'a' to 'z' do
    MyArray[i] := i;
  // Für jedes Array Element einen Hauptknoten anlegen
  for i := 'a' to 'z' do begin
    NewNode := TreeView1.Items.AddChild(nil, MyArray[i]);
    // Bild 1 aus verknüpfter Image List für den neuen Knoten festlegen
    NewNode.ImageIndex := 0;
    NewNode.SelectedIndex := 0;
  end// Für jeden Knoten
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:

ausblenden 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
  // Beispieldaten ins Appay
  for i := 'a' to 'z' do
    MyArray[i] := i;
  NewNode := nil;
  // Für jedes Array Element einen Knoten anlegen
  for i := 'a' to 'z' do begin
    NewNode := TreeView1.Items.AddChild(NewNode, MyArray[i]);
    // Bild 1 aus verknüpfter Image List für den neuen Knoten festlegen
    NewNode.ImageIndex := 0;
    NewNode.SelectedIndex := 0;
  end// Für jeden Knoten
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:

ausblenden 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..26of tMyType;
    NewNode : tTreeNode;
    i : integer;
begin
  // Beispieldaten ins Array
  for i := 1 to 26 do
    MyArray[i].Caption := Format('Knoten %d', [i]);
  // Für jedes Array Element einen Knoten anlegen
    for i := 1 to 26 do begin
    NewNode := TreeView1.Items.AddChild(nil, MyArray[i].Caption);
    // Bild 1 aus verknüpfter Image List für den neuen Knoten festlegen
    NewNode.ImageIndex := 0;
    NewNode.SelectedIndex := 0;
    NewNode.Data := ptr(i);
    // Beispiel fur das auslesen:
    NewNode.Text := NewNode.Text + ' - ' + MyArray[longint(NewNode.Data)].Bsp2;
  end// Für jeden Knoten
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:

ausblenden volle Höhe 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..26of tMyType;
    NewNode : tTreeNode;
    NewData : pMyType;
    i : integer;
begin
  // Jetzt mal ohne Array
  for i := 1 to 26 do begin
    // Daten (aus dem nichts) erzeugen
    NewData := new(pMyType);
    NewData^.Caption := Format('Knoten %d', [i]);
    NewData^.Bsp2 := 'Beispiel Text';

    NewNode := TreeView1.Items.AddChild(nil, MyArray[i].Caption);
    // Bild 1 aus verknüpfter Image List für den neuen Knoten festlegen
    NewNode.ImageIndex := 0;
    NewNode.SelectedIndex := 0;
    NewNode.Data := NewData;
    // Beispiel fur das auslesen:
    NewNode.Text := NewNode.Text + ' - ' + pMyType(NewNode.Data)^.Bsp2;
  end// Für jeden Knoten
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 Threadstarter
Hält's aus hier
Beiträge: 11

Win XP
D3.0 Prof
BeitragVerfasst: 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 user profile iconKlabautermann: Zusätzliche Frage entfernt, diese wird hier seperrat gestellt.
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 15.07.05 18:53 
Hallo,
user profile iconMax 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.

user profile iconMax 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:
ausblenden Delphi-Quelltext
1:
TreeView1.SortType := stText;					


Gruß
Klabautermann
Einloggen, um Attachments anzusehen!
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Sa 16.07.05 14:32 
Hallo,
user profile iconMax 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