Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Ausgeben von einer Datenbank mit TTreeView (https://www.delphipraxis.net/28782-ausgeben-von-einer-datenbank-mit-ttreeview.html)

Leuselator 30. Aug 2004 10:40

Re: Ausgeben von einer Datenbank mit TTreeView
 
Geht, unabhängig von der Sortierung:
Delphi-Quellcode:
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;
Aufruf mit:
Delphi-Quellcode:
  FillTreeView(DeineTreeViewKomponente,DeineAdoQuerry);
Gruß

Jelly 30. Aug 2004 10:41

Re: Ausgeben von einer Datenbank mit TTreeView
 
Zitat:

Zitat von Igotcha
- ist der aktuelle Knoten ein "child", dann als Child des betreffenden Roots anhängen (durch die vorherige Sortierung vermeidest Du, dass es ein Child geben könnte, wozu noch kein root-Knoten existiert)

Genau deswegen bin ich der Meinung, daß ein rekursiver Aufruf dieses Problem vermeidet. Wenn die Daten aber, wie du beschreibst, sortiert vorliegen, geht das andere auch. Davon würd ich jedoch nicht unbedingt ausgehen.

Gruß,

Igotcha 30. Aug 2004 10:55

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.

ZeroQool007 30. Aug 2004 12:30

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.

franktron 30. Aug 2004 12:42

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;

ZeroQool007 30. Aug 2004 12:47

Re: Ausgeben von einer Datenbank mit TTreeView
 
Ja, DB ist geöffnet bzw ADOQuery1 auf TRUE :shock:

Stevie 30. Aug 2004 12:52

Re: Ausgeben von einer Datenbank mit TTreeView
 
:idea: Wenn ich mich recht erinnnere, gibt's in der Jedi-Lib eine TDBTreeView-Komponente.

ZeroQool007 30. Aug 2004 12:54

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

Leuselator 30. Aug 2004 14:01

Re: Ausgeben von einer Datenbank mit TTreeView
 
Die Tipp- und Umbenennungsarbeit solltest Du eigentlich schon selbst machen:
Delphi-Quellcode:
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.
Gruß

ZeroQool007 30. Aug 2004 14:07

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 22:07 Uhr.
Seite 2 von 4     12 34      

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