Delphi-PRAXiS

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)

ZeroQool007 30. Aug 2004 08:56


Ausgeben von einer Datenbank mit TTreeView
 
Moin KOllegen!

Hab folgendes Problem: Möchte diese Tabelle bzw. Datenbank mit der Komponente TTreeView ausgeben:


Hab bereits wie ein verrückter gegoogelt, aber nichts wirklich passendes gefunden....die Meisten benutzen Fremdkomponente wie zB VirtualTreeView ect., aber ich möchte bzw ich muss es von meinem Chef aus mit der TTreeView machen....WEr kann bitte helfen bzw auch ein paar Schnipsel anbieten...VIelen Dank im voraus....

ibp 30. Aug 2004 10:09

Re: Ausgeben von einer Datenbank mit TTreeView
 
... wo ist denn genauer dein problem? die daten zu sortieren, damit man diese den items zu weisen kann oder in der erstellung des trees?

ibp 30. Aug 2004 10:10

Re: Ausgeben von einer Datenbank mit TTreeView
 
... ach so herzlich willkommen in der dp :dp:

ZeroQool007 30. Aug 2004 10:11

Re: Ausgeben von einer Datenbank mit TTreeView
 
Die Darstellung des Trees, die Sortierung in Items usw. bzw die komplette Umsetzung der Aufgabe in die Praxis.....sorry

ibp 30. Aug 2004 10:14

Re: Ausgeben von einer Datenbank mit TTreeView
 
... was hast du denn schon ?

ZeroQool007 30. Aug 2004 10:16

Re: Ausgeben von einer Datenbank mit TTreeView
 
Bis auf das Struktogramm mehr oder weniger nichts...wie gesgt bin FIAE im 1. Lehrjahr...1.Monat u hab halt diese Aufgabe bekommen.... :( Halt die Umsetzung ist etwas schwer zur Zeit für mich, da ich leider nicht so viel Erfahrung in Delphi habe...

ibp 30. Aug 2004 10:26

Re: Ausgeben von einer Datenbank mit TTreeView
 
1. bekommst du denn die daten aus der db?
2. die daten solltest du dann nach der parent-id-spalte sortieren, kann man schon beim abrufen der daten machen, jedenfalls sieht es so aus, als wenn die unterkategorie eine größere id hat als die des parent
3. dann könntest du den baum erstellen
und 4.

hier im forum gibt es eine tolle suchfunktion und gute tutorien mit denen du anfangen könntest!

grüsse rené

ZeroQool007 30. Aug 2004 10:31

Re: Ausgeben von einer Datenbank mit TTreeView
 
Die Daten bekomm ich über die ADODataSet per SQL Anweisung raus:
Delphi-Quellcode:
select * from tblArtKategorie
order by intArtKatID, intArtKatParentID
Ich hab schon bereits im Board gesucht, aber nichts wirklich passendes gefunden...die Meisten benutzen andere KOmponenten und deshalb die Probs beim Darstellen des Baumes... :(

Jelly 30. Aug 2004 10:32

Re: Ausgeben von einer Datenbank mit TTreeView
 
Hallo,

da gehst du am besten rekursiv durch deine Tabelle, damit du deinen Baum aufbauen kannst... Angefangen wird, indem du dir einen Stammknoten bildest, und dich auf diesen positionierst. Das wär bei dir
SQL-Code:
select * from tabelle where intArtKarID = 0
und setzt dann ID := intArtKatID ;

Dann muss du folgende Abfrage rekursiv durchlaufen:
1.
SQL-Code:
select * from Tabelle where intArtKatParent = :ID
2. Eintrag in Tabelle einfügen, mit Parent :ID
3. ID := intArtKatID (hier dann rekursiver Aufruf)
4. auf nächsten Eintrag in deinem Resultset der Abfrage gehen und zurück zu Punkt 1., bis du am Ender deines Resultset angelangt bist

So würd ichs zumindest machen.

Gruß,
Tom

Igotcha 30. Aug 2004 10:35

Re: Ausgeben von einer Datenbank mit TTreeView
 
Erstmal ist folgende, grundsätzlich Frage zu klären, die eine mögliche Lösung betrifft:

Liegen die Hauptknoten (intArtKadID) immer in sortierter, aufsteigender Reihenfolge vor? Wenn nein, solltest Du das erstmal durch eine geeignete Sortierung in der Abfrage erreichen (erleichtert den späteren Vorgang erheblich).

Ich mache es (zwar mit einem VirtualTreeview) so:

- ich lese alle Datensätze ein, dann werden diese in einer Schleife abgearbeitet
- ist der aktuelle Knoten ein "root"-Knoten, dann als Root setzen (root-Kennzeichen ist in der DB hinterlegt)
- 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)

Bei der normalen Treeview-Komponente gibt es jetzt das Problem, wo Du diese Relation speicherst, denn Du benötigst dazu mindestens 2 Informationen (KnotenID und Parent/Child-ID). Dazu gibt es die möglichkeit, diese Informationen in einer gesonderten Datenstruktur, die Du dann mittels "Tag" mit dem jeweiligen Node verknüpfst, zu hinterlegen - musst Du aber dann auch separat abspeichern.

Grds. rate ich Dir (trotz Deines Chefs) vom normalen Treeview für solche Aufgaben ab. Hintergrund: Du kannst nur die Abhängigkeit darstellen, aber keine zusätzlichen Informationen anzeigen, wie z.B. Anschaffungskosten, Standort, etc. Dies wäre eine Mischung aus TV und Listview - und genau das bietet der VirtualTreeview.

Schau Dir dazu mal den Windows Datei Explorer an. Links hast Du die Ordnerabhängigkeiten und rechts die Ordnerinhalte - sehr unschön für eine Anwendung, wie Du sie planst. Alternativ kann man evtl. Zusatzinformationen noch in einer separaten Form anzeigen lassen - noch unschöner ;-)

Gruß Igotcha

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.... :|

ZeroQool007 30. Aug 2004 14:34

Re: Ausgeben von einer Datenbank mit TTreeView
 
Hab es nun nach deiner Reihenfolge gemacht:
Code:
[Fehler] Unit1.pas(58): Undefinierter Bezeichner: 'TheView'
[Fehler] Unit1.pas(58): 'END' erwartet, aber ')' gefunden
[Fehler] Unit1.pas(61): ';' erwartet, aber 'WHILE' gefunden
[Fehler] Unit1.pas(62): Undefinierter Bezeichner: 'AktNode'
[Fehler] Unit1.pas(62): Undefinierter Bezeichner: 'TreeView1'
[Fehler] Unit1.pas(62): 'END' erwartet, aber ')' gefunden
[Fehler] Unit1.pas(67): '.' erwartet, aber ';' gefunden
[Fehler] Unit1.pas(68): Bezeichner redefiniert: 'Finalization'
[Fehler] Unit1.pas(69): ')' erwartet, aber Bezeichner 'Items' gefunden
[Fehler] Unit1.pas(70): ')' erwartet, aber Bezeichner 'Items' gefunden
[Fehler] Unit1.pas(77): Anweisung erwartet, aber Dateiende gefunden
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden
:(

Leuselator 30. Aug 2004 14:37

Re: Ausgeben von einer Datenbank mit TTreeView
 
1. ersetze in Zeile 58 TheView (gibt es nicht mehr) durch TreeView1
2. Schreib erstmal ein paar kleine Programme, damit Du den Umgang mit Delphi und IDE erlernst, bevor Du Dir hier Hausaufgaben machen lässt.
Ende meiner Posts zu diesem Thread

ZeroQool007 30. Aug 2004 14:47

Re: Ausgeben von einer Datenbank mit TTreeView
 
Naja schade, dass du direkt so gereizt bsit! Sagte doch bin Azubi im 1.Jahr (gerade 1 Monat erst rum) und mit allen Komponenten ect. nicht so viel Erfahrung wie du zb!

:( Trotzdem thx für deine Hilfe! Weiss ich zu schätzen und sorry für die Unannehmlichkeiten!

Delphi_Fanatic 30. Aug 2004 15:01

Re: Ausgeben von einer Datenbank mit TTreeView
 
Siehst Du, ZeroCool, jetzt geht's Dir hier auch nicht anders, als unter Delphi-Groups.
Da hat auf Dauer nämlich niemand Bock drauf, für Dich das denken zu übernehmen und Dir am besten
gleich komplett fertige Sourcen zu liefern, während Du selbst Dich überhaupt gar nicht anstrengst. :wink:

ZeroQool007 30. Aug 2004 15:14

Re: Ausgeben von einer Datenbank mit TTreeView
 
Naja, das hat damit nichts zu tun! Das wäre das Gleiche als würde ich dir nen chinesischen Text hinlegen u du sollst übersetzen! Ohne Vorkenntnisse bzw wenn dir keiner hilft kannst du fast nichts machen! Ich hab halt bei der Umsetzung Probleme, obwohl ich weiss was zu machen ist sprich nach dem Struktogramm vorzugehen!

Delphi_Fanatic 30. Aug 2004 15:23

Re: Ausgeben von einer Datenbank mit TTreeView
 
Zitat:

Ohne Vorkenntnisse bzw wenn dir keiner hilft kannst du fast nichts machen!
Gerade die Vorkenntnisse sollst Du Dir ja selber aneignen.
Dokus lesen, Ausprobieren, fang' erstmal mit kleinen Sachen an, schau's Dir im Debugger an, was
genau er da macht usw....

Wenn Du es Dir jetzt nicht selbst erarbeitest, dann stehst Du bei dem nächsten Problem wieder
hier und willst Dir von jemandem alles vorkauen lassen. So lernst Du's nie....

P.S. aber hey.. was red' ich ... ist ja Deine Sache ...

fruity 9. Aug 2005 09:04

Re: Ausgeben von einer Datenbank mit TTreeView
 
Morgen,

ich versuche gerade eine Tabelle die ich in einer SQL DB habe in einem TreeView auszugeben. Dazu habe ich mir schon den
Thread angeschaut und so ziemlich alles davon verwenden koennen.

Ich bekomm auch keine Fehlermeldung, aber es wird keine Ausgabe im TreeView erstellt.

Waere euch sehr dankbar wenn ihr mir einen kleinen Denkanstoss geben wuerdet. Ich vermute dass das Problem in der For Schleife liegt, nur leider weiss ich nicht genau wo.

Danke im voraus.

Delphi-Quellcode:
unit Hauptformular;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, Menus, OleCtrls, SHDocVw, DB;

type
  TFmHaupt = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    TreeView1: TTreeView;
    Splitter1: TSplitter;
    Panel1: TPanel;
    WebBrowser1: TWebBrowser;
    Panel2: TPanel;
    DSTreeView: TDataSource;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TTView = Record
    ID : Integer;
    ParentID : Integer;
end;

  PView = ^TTView;

var
  FmHaupt: TFmHaupt;

implementation

uses HauptformularDM;

{$R *.dfm}
//-08-Aug-2005--------------------------------------------------------------------------------------
// Form Create
procedure TFmHaupt.FormCreate(Sender: TObject);

  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 PView(TreeView1.Items[x].Data).ID = PView(TheNode.Data).ParentID then begin
            TheNode.MoveTo(TreeView1.Items[x], naAddChild);
            Break;
          end;
        end;
      end;
    end;

var Root,AktNode : TTreeNode;
  i : Integer;
begin
  DMHaupt.QHauptTreeView.First;
  Root := TTreeNode.Create(TreeView1.Items);
  Root.Text := 'Test';
  Root.Data := nil;
  while not DMHaupt.QHauptTreeView.EOF do begin
    AktNode := TTreeNode.Create(TreeView1.Items);
    AktNode.Data := new(PView);
    PView(AktNode.Data).ID      := DMHaupt.QHauptTreeView.FieldByName('ID').AsInteger;
    PView(AktNode.Data).ParentID := DMHaupt.QHauptTreeView.FieldByName('ParentID').AsInteger;
    DMHaupt.QHauptTreeView.Next;
  end;
  for i := 0 to TreeView1.Items.Count-1 do begin
    if Assigned(TreeView1.Items[i].Data) then begin
      if PView(TreeView1.Items[i].Data).ParentID <> 0 then MoveToParentNode(TreeView1.Items[i]);
    end;
  end;
end;

fruity 9. Aug 2005 09:34

Re: Ausgeben von einer Datenbank mit TTreeView
 
So hab jetzt mal ein Problem festgestellt.
Ich war wiedermal zu unaufmerksam beim lesen und hab uebersehen,
dass das auffuellen des Trees in eine extra Procedure gehoert.

Trotzdem funktioniert die Ausgabe noch nicht.

Hier mal meinen neuen Code

Delphi-Quellcode:
unit Hauptformular;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, Menus, OleCtrls, SHDocVw, DB;

type
  TFmHaupt = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    TreeView1: TTreeView;
    Splitter1: TSplitter;
    Panel1: TPanel;
    WebBrowser1: TWebBrowser;
    Panel2: TPanel;
    DSTreeView: TDataSource;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormDestroy(Sender: TObject);
    procedure FillTreeView(TheView : TTreeView; TheData : TDataSet);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TTView = Record
    ID : Integer;
    ParentID : Integer;
end;

  PView = ^TTView;

var
  FmHaupt: TFmHaupt;

implementation

uses HauptformularDM;

{$R *.dfm}
//-08-Aug-2005--------------------------------------------------------------------------------------
// Form Create
procedure TFmHaupt.FormCreate(Sender: TObject);
begin
  FillTreeView(TreeView1, DMHaupt.QHauptTreeView);
end;
//-08-Aug-2005--------------------------------------------------------------------------------------
//
procedure TFmHaupt.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//
end;
//-08-Aug-2005--------------------------------------------------------------------------------------
//
procedure TFmHaupt.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
//
end;
//-08-Aug-2005--------------------------------------------------------------------------------------
//
procedure TFmHaupt.FormDestroy(Sender: TObject);
begin
//
end;
//-09-Aug-2005--------------------------------------------------------------------------------------
//
procedure TFmHaupt.FillTreeView(TheView: TTreeView; TheData: TDataSet);

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 PView(TreeView1.Items[x].Data).ID = PView(TheNode.Data).ParentID then begin
            TheNode.MoveTo(TreeView1.Items[x], naAddChild);
            Break;
          end;
        end;
      end;
    end;

var Root,AktNode : TTreeNode;
  i : Integer;
begin
  DMHaupt.QHauptTreeView.First;
  Root := TTreeNode.Create(TreeView1.Items);
  Root.Text := 'Test';
  Root.Data := nil;
  while not DMHaupt.QHauptTreeView.EOF do begin
    AktNode := TTreeNode.Create(TreeView1.Items);
    AktNode.Data := new(PView);
    PView(AktNode.Data).ID      := DMHaupt.QHauptTreeView.FieldByName('ID').AsInteger;
    PView(AktNode.Data).ParentID := DMHaupt.QHauptTreeView.FieldByName('ParentID').AsInteger;
    DMHaupt.QHauptTreeView.Next;
  end;

  for i := 0 to TreeView1.Items.Count-1 do begin
    if Assigned(TreeView1.Items[i].Data) then begin
      if PView(TreeView1.Items[i].Data).ParentID <> 0 then MoveToParentNode(TreeView1.Items[i]);
    end;
  end;
end;
end.
[Edit] Wenn ich das Programm in einzelnen Schritten durchgehe, dann durchlaeuft es zwar die Procedure VillTree, aber die for schleife wird nicht durchgelaufen, da der TreeView1.Items.Count 0 ist. Was mach ich nur falsch? [/Edit]

Jelly 9. Aug 2005 09:53

Re: Ausgeben von einer Datenbank mit TTreeView
 
Du musst die Prozedur natürlich auch aufrufen :roll:

Ausserdem, warum übergibts du der Prozedur einen Parameter TheView, wenn du intern trotzdem auf TreeView1 zugreifst.

fruity 9. Aug 2005 09:58

Re: Ausgeben von einer Datenbank mit TTreeView
 
Die Prozedur rufe ich ja im FormCreate auf, also kann das auch nicht das Problem sein.

Soviel ich weiss ist doch TheView und TreeView vom gleichen Typ, nicht??

Jelly 9. Aug 2005 10:03

Re: Ausgeben von einer Datenbank mit TTreeView
 
Wie sieht denn deine Query aus. Irgendwie scheinen da keine Daten gelesen zu werden.

fruity 9. Aug 2005 10:08

Re: Ausgeben von einer Datenbank mit TTreeView
 
Hab ich mir auch schon gedacht,
aber leider kenn ich mich bei den SQL-Strings net so gut aus.

Ich lese die Daten so ein:

SQL-Code:
select * from TreeView
[Edit] Ich verwende die Spalten ID, ParentID und Bezeichnung, wobei fuer den Anfang ID & ParentID vermutlich wichtiger sind [/Edit]

Karstadt 14. Feb 2006 11:48

Re: Ausgeben von einer Datenbank mit TTreeView
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Meine SQL Abfrage ist

SQL-Code:

Select wg_1,wg_2,wg_3,wg_4,wg_5,wg_6,wg_7,wg_8,wg_9,wg_10 from warengruppen group by wg_1,wg_2,wg_3,wg_4,wg_5,wg_6,wg_7,wg_8,wg_9,wg_10
Dann lese ich die Datein in einen

Delphi-Quellcode:
Var
   i:Integer;
   L_Acc_value:Packed array[0..99] of Variant;

  TreeData: TTreeData;
  TestKnoten, Knoten,Knoten_alt,Unter_Knoten_alt: PVirtualNode;
begin
  // Alle Einträge werden gelöscht!
  VST.Clear;

  //Größe von Eingabedaten werden übergeben
  VST.NodeDataSize:=SizeOf(TTreeData);

  //Begine die Knoten einzufügen
  VST.BeginUpdate;

  with q_wg do
  begin
    Close;
    Open;
     First;

    While not Eof do
    begin

      //Hauptknoten! Hauptkategorien
      If L_Acc_Value[0]<> Fields[0].Value then
        begin
          TreeData.FCaption := Vartostr(Fields[0].Value);
          Knoten:=AddVSTStructure(VST,nil,TreeData);
          Knoten_alt := Knoten;
        end
        // Falls in der Hauptkategorie eine weitere Unterkategorie dann wird die hier eingetragen!
        else Knoten := Knoten_alt;
          L_Acc_Value[0]:=Fields[0].Value;

      //Unterknoten, Unterkategorien
      For i:=1 to FieldCount-1 do
      begin

        // Nicht Null, nicht leer, Nicht gleich!
        if (L_Acc_Value[i]<> Fields[i].Value) And (not VarIsNull(Fields[i].Value)) And (Fields[i].Value <> '')  then
        begin
          // Nur Zur Kontrolle!!

          Unter_Knoten_alt := Knoten;
          TreeData.FCaption := Vartostr(Fields[i].Value);
          Knoten:=AddVSTStructure(VST,Knoten,TreeData);
        end
        else
        begin
          IF (L_Acc_Value[i] = Fields[i].Value) And (not VarIsNull(Fields[i].Value)) And (Fields[i].Value <> '') Then
          begin
//             Showmessage(IntToStr(Knoten.Index));
             Knoten := Unter_Knoten_alt;
          end;
        end;
          L_Acc_Value[i]:=Fields[i].Value;
      end;

      //Nächsten Datensatz
      next;
    end;
  end;

  //Beende die Knoten einzufügen
  VST.EndUpdate;

  //Sortierung, die DS werden per SQL sortiert!

  //Vst.SortTree(1,sdAscending,True);
end;
Ergebniss ist Fehlerhaft.

Siehe Bild. Wie kann man das Problem bei mir lösen?

Mackhack 6. Apr 2006 15:34

Re: Ausgeben von einer Datenbank mit TTreeView
 
Zitat:

Zitat von Leuselator
Die Tipp- und Umbenennungsarbeit solltest Du eigentlich schon selbst machen:
Delphi-Quellcode:
 

type
  THardware = Record
    Id     : Integer;
    IdParent: Integer;
  end;
  PHardware = ^THardware;
Gruß

Ich habe mir den code mal angesehen und stosse immer wieder auf die gleiche Frage. Ist die IdParent in der Tabelle gespeichert oder wie kann man Id mit IdParent sonst vergleichen?

Kann mir das jemand bitte erklaeren?

Ich habe naemlich eine Tabelle mit folgenden Feldern:
ID, CategoryID und Category und moechte das in einem TTreeView anzeigen lassen. Aber eigentlich nur die CategoryID und die Category.

Vielen lieben Dank!

Karstadt 7. Apr 2006 07:12

Re: Ausgeben von einer Datenbank mit TTreeView
 
Das geht doch viel einfacher! Ich habe das Problem bei mir gelöst!

TTreeView.savetoFile(c:\cxyz.txt) und das speicherst du in die Tabelle ein. zeile für Zeile und in der Spalte 2 nimmst du dir die nummer aus eine Nummerkreisentabelle.

Das klingt zwar kompliziert ist aber sehr einfach :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr.

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