![]() |
Re: Ausgeben von einer Datenbank mit TTreeView
Geht, unabhängig von der Sortierung:
Delphi-Quellcode:
Aufruf mit:
type
TMyHardware = Record Id : Integer; IdParent : Integer; end; PMyHardware = ^TMyHardware; procedure FillTreeView(TheView : TTreeView; TheData : TDataSet); implementation procedure FillTreeView(TheView : TTreeView; TheData : TDataSet); // diese Prozedur verschiebt den übergebenen Knoten and // die richtige Position im TreeView procedure MoveToParentNode(TheNode: TTreeNode); var x : Integer; begin for x := 0 to TheView.Items.Count-1 do begin if Assigned(TheView.Items[x].Data) then begin if PMyHardware(TheView.Items[x].Data).Id = PMyHardware(TheNode.Data).IdParent then begin TheNode.MoveTo(TheView.Items[x],naAddChild); Break; end; end; end; end; // Beginn von FillTreeView: var Root,AktNode : TTreeNode; i : Integer; begin TheData.First; Root := TTreeNode.Create(TheView.Items); Root.Text := 'Hardware'; Root.Data := nil; while not TheData.EOF do begin AktNode := TTreeNode.Create(TheView.Items); AktNode.Data := new(PMyHardware); PMyHardware(AktNode.Data).Id := TheData.FieldByName('IntArtKatId').AsInteger; PMyHardware(AktNode.Data).IdParent := TheData.FieldByName('IntArtKatParent').AsInteger; TheData.Next; end; for i := 0 to TheView.Items.Count-1 do begin if Assigned(TheView.Items[i].Data) then begin if PMyHardware(TheView.Items[i].Data).IdParent <> 0 then MoveToParentNode(TheView.Items[i]); end; end; end;
Delphi-Quellcode:
Gruß
FillTreeView(DeineTreeViewKomponente,DeineAdoQuerry);
|
Re: Ausgeben von einer Datenbank mit TTreeView
Zitat:
Gruß, |
Re: Ausgeben von einer Datenbank mit TTreeView
Das vermeidest Du durch die Sortierung und kannst Dir dann eine "komplizierte" rekursive Abarbeitung sparen, da Parents dann immer bereits vor Children existieren.
Gruß Igotcha P.S. Ich sehe aber noch ein anderes Problem: Er möchte doch sicher auch Informationen visuell hinzufügen können und dann müssen die Daten in die DB zurückgeschrieben werden können. Ohne eine Data-Struktur kommt man dann hier ohnehin nicht aus. |
Re: Ausgeben von einer Datenbank mit TTreeView
Erstmal danke an euch alle, dass ihr so hilfsbereit seid! Ist echt klasse!
Hab mal den Quellcode von Leuselator getestet, aber keine Reaktion! :shock: Wo habe ich den Fehler bzw was fehlt?! Hab die Grid nur eingebaut um zu sehen was in der DB steht...
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Grids, DBGrids, DB, StdCtrls, Buttons, ADODB; type TMyHardware = class(TForm) ADOQuery1: TADOQuery; ADODataSet1: TADODataSet; ADOConnection1: TADOConnection; DataSource1: TDataSource; DBGrid1: TDBGrid; TreeView1: TTreeView; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var MyHardware: TMyHardware; procedure FillTreeView(TheView : TTreeView; TheData : TDataSet); implementation {$R *.dfm} procedure FillTreeView(TheView : TTreeView; TheData : TDataSet); type TMyHardware = Record Id : Integer; IdParent : Integer; end; PMyHardware = ^TMyHardware; // diese Prozedur verschiebt den übergebenen Knoten and // die richtige Position im TreeView procedure MoveToParentNode(TheNode: TTreeNode); var x : Integer; begin for x := 0 to TheView.Items.Count-1 do begin if Assigned(TheView.Items[x].Data) then begin if PMyHardware(TheView.Items[x].Data).Id = PMyHardware(TheNode.Data).IdParent then begin TheNode.MoveTo(TheView.Items[x],naAddChild); Break; end; end; end; end; // Beginn von FillTreeView: var Root,AktNode : TTreeNode; i : Integer; begin TheData.First; Root := TTreeNode.Create(TheView.Items); Root.Text := 'Hardware'; Root.Data := nil; while not TheData.EOF do begin AktNode := TTreeNode.Create(TheView.Items); AktNode.Data := new(PMyHardware); PMyHardware(AktNode.Data).Id := TheData.FieldByName('IntArtKatId').AsInteger; PMyHardware(AktNode.Data).IdParent := TheData.FieldByName('IntArtKatParentID').AsInteger; TheData.Next; end; for i := 0 to TheView.Items.Count-1 do begin if Assigned(TheView.Items[i].Data) then begin if PMyHardware(TheView.Items[i].Data).IdParent <> 0 then MoveToParentNode(TheView.Items[i]); end; end; end; procedure TMyHardware.Button1Click(Sender: TObject); begin FillTreeView(TreeView1,ADOQuery1); end; end. |
Re: Ausgeben von einer Datenbank mit TTreeView
Hast du auch die DB Geöffnet
Delphi-Quellcode:
procedure TMyHardware.Button1Click(Sender: TObject);
begin ADOQuery1.Active:=True; FillTreeView(TreeView1,ADOQuery1); ADOQuery1.Active:=False; end; |
Re: Ausgeben von einer Datenbank mit TTreeView
Ja, DB ist geöffnet bzw ADOQuery1 auf TRUE :shock:
|
Re: Ausgeben von einer Datenbank mit TTreeView
:idea: Wenn ich mich recht erinnnere, gibt's in der Jedi-Lib eine TDBTreeView-Komponente.
|
Re: Ausgeben von einer Datenbank mit TTreeView
es gibt viele Komponente, aber dieses Problem soll mit der TTreeView KOmponente gelöst werden, wie ich es bereits erwähnt habe!:) Trotzdem thx
|
Re: Ausgeben von einer Datenbank mit TTreeView
Die Tipp- und Umbenennungsarbeit solltest Du eigentlich schon selbst machen:
Delphi-Quellcode:
Gruß
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Grids, DBGrids, DB, StdCtrls, Buttons, ADODB; type THardware = Record Id : Integer; IdParent: Integer; end; PHardware = ^THardware; TMyHardware = class(TForm) ADOQuery1: TADOQuery; ADODataSet1: TADODataSet; ADOConnection1: TADOConnection; DataSource1: TDataSource; DBGrid1: TDBGrid; TreeView1: TTreeView; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var MyHardware: TMyHardware; implementation {$R *.dfm} procedure TMyHardware.Button1Click(Sender: TObject); // diese Prozedur verschiebt den übergebenen Knoten and // die richtige Position im TreeView procedure MoveToParentNode(TheNode: TTreeNode); var x : Integer; begin for x := 0 to TreeView1.Items.Count-1 do begin if Assigned(TreeView1.Items[x].Data) then begin if PHardware(TreeView1.Items[x].Data).Id = PHardware(TheNode.Data).IdParent then begin TheNode.MoveTo(TreeView1.Items[x],naAddChild); Break; end; end; end; end; // Beginn von FillTreeView: var Root,AktNode : TTreeNode; i : Integer; begin ADOQuery1.First; Root := TTreeNode.Create(TheView.Items); Root.Text := 'Hardware'; Root.Data := nil; while not ADOQuery1.EOF do begin AktNode := TTreeNode.Create(TreeView1.Items); AktNode.Data := new(PHardware); PHardware(AktNode.Data).Id := ADOQuery1.FieldByName('IntArtKatId').AsInteger; PHardware(AktNode.Data).IdParent := ADOQuery1.FieldByName('IntArtKatParentID').AsInteger; ADOQuery1.Next; end; for i := 0 to TreeView1.Items.Count-1 do begin if Assigned(TreeView1.Items[i].Data) then begin if PHardware(TreeView1.Items[i].Data).IdParent <> 0 then MoveToParentNode(TreeView1.Items[i]); end; end; end; end. |
Re: Ausgeben von einer Datenbank mit TTreeView
sorry, dachte, dass hätte ich bereits getan....weil der mir auch beim Kompilieren usw kein Fehler angezeigt hat.... :|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:38 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