Delphi-PRAXiS :: Das Forum für Fragen zu Delphi
Das Experten Forum für Delphi Programmierer
Hilfe für CodeGear Delphi gibts es hier im Forum
Delphi Quelltexte und Source Codes
 
Delphi-PRAXiS :: Foren-ÜbersichtForen-Übersicht Delphi-PRAXiS Modul-ÜbersichtSite-Map Delphi-PRAXiS durchsuchenSuchen Delphi-PRAXiS Code-LibraryCode-Library Jetzt registrieren!Registrieren Login  
   
 
0
 
Delphi für Win32
Firebird : TreeView komplett in DB speichern?
Ein Delphi (Win32)-Thema von moelski.

Vorheriges Thema anzeigen  |  Nächstes Thema anzeigen
Neuen Beitrag schreiben Auf Beitrag antworten
als PDF-Datei herunterladenThema ausdrucken
 
Delphi-PRAXiS Forum - Übersicht -> Datenbanken
Seite 1 von 1   [ 6 Beiträge ]  
 
 Autor 
 Nachricht 
 
moelski #1|Beitrag #1128448Verfasst am: 09.02.2010, 09:07      Titel: Firebird : TreeView komplett in DB speichern? Antworten mit Zitat
aktives Mitglied
Status: offline
Beiträge: 915
angemeldet: 31.07.2004
Delphi 7 Professional

Sprache: Delphi (Win32)
Datenbank: Firebird, Version: 2.5 RC, Zugriff über: UniDac

Moin !

Hat jemand von euch ein Stück Quellcode um einen TreeView in einer FireBird Datenbank zu speichern und wieder zu laden?

Wichtig wären dabei folgende Dinge:
* Die Struktur des Trees (eigentlich logisch Smile )
* Die Sortierung
* Letzte Auswahl
* Status für ein- / ausgeklappte Nodes

Greetz Dominik

I love Delphi 2007/2010 Smile
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
Die Muhkuh #2|Beitrag #1128450Verfasst am: 09.02.2010, 09:13      Titel: Re: Firebird : TreeView komplett in DB speichern? Antworten mit Zitat
"Rüsselmops" ;-)
Alter: 19
Status: offline
Beiträge: 7.129
angemeldet: 21.08.2003


Hi,

fehlt Dir ein Ansatz, wie man es machen könnte oder hast Du einen Ansatz und hoffst, dass jemand sowas in der Art schon erledigt hat?

nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
moelski #3|Beitrag #1128452Verfasst am: 09.02.2010, 09:18      Titel: Re: Firebird : TreeView komplett in DB speichern? Antworten mit Zitat
aktives Mitglied
Status: offline
Beiträge: 915
angemeldet: 31.07.2004
Delphi 7 Professional

Moin !

Zitat:
fehlt Dir ein Ansatz

Jain ...
Ich habe eine Lösung für AbsoluteDB. Die kann allerdings nur die reine Struktur speichern. Sortierungen, Selektionen, ... sind da aussen vor.

Zitat:
und hoffst, dass jemand sowas in der Art schon erledigt hat

Das war / ist meine Hoffnung. Denn ich könnte mir vorstellen dass das auch in anderen Anwendungen gebraucht wird. Hello

Greetz Dominik

I love Delphi 2007/2010 Smile
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
RWarnecke #4|Beitrag #1128453Verfasst am: 09.02.2010, 09:20      Titel: Re: Firebird : TreeView komplett in DB speichern? Antworten mit Zitat
sehr aktives Mitglied
Alter: 33
Status: online
Beiträge: 2.381
angemeldet: 31.12.2004
Wohnort: Stuttgart
Delphi 2006 Professional

Hallo Dominik.

wenn Du hier in der DP suchst nach Suche in der Delphi-PRAXiSTreeView Datenbank findest Du Beispiele oder unter Code-Orakel.

Code-Orakel 1.4.0 ; SystemInfo 1.6.5 ; Zeus 0.6.0
BIS Tipps & Tricks
Code-Orakel Online
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
hoika #5|Beitrag #1128529Verfasst am: 09.02.2010, 12:13      Titel: Re: Firebird : TreeView komplett in DB speichern? Antworten mit Zitat
sehr aktives Mitglied
Alter: 40
Status: offline
Beiträge: 3.614
angemeldet: 05.07.2006
Wohnort: Magdeburg


Hallo,

Zitat:
Sortierungen, Selektionen, ... sind da aussen vor.


Hm, Sortierung kann es nur eine geben,
dazu auf oder absteigend.
Das kommt in eigene "Option" Tabelle

Name Char(X)
Value Char(X)

also
"Order", "Name"
"OrderType", "Asc" (oder "Desc")
"Selected", "555" (DB Id des selektierten Knotens)

Ob ein Knoten aus- oder eingeklappt ist,
kommt in die Nodes Tabelle, die ja wohl etwa so aussieht

NodeId DB Id der Nodes
PreNodeId 0 für Root-Node
Expanded Char(1), 1 oder 0


Heiko
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
moelski #6|Beitrag #1128560Verfasst am: 09.02.2010, 13:14      Titel: Re: Firebird : TreeView komplett in DB speichern? Antworten mit Zitat
aktives Mitglied
Status: offline
Beiträge: 915
angemeldet: 31.07.2004
Delphi 7 Professional

Moin !

So ich denke ich habs hinbekommen.
Ist noch auf Basis AbsoluteDB, aber ich denke das Umstellen sollte nicht soo schwer werden.

Laden vom Tree:
Delphi-Quellcode: zusammenfalten | markieren
procedure TDM.DataBase_OpenFile(Filename : String);
var
  RootNode  : TTreeNode;
  RootQuery : TABSQuery;

  procedure AddChildNodes(ParentID: Integer; ParentNode: TTreeNode);
  var
    query : TABSQuery;
    Node  : TTreeNode;
  begin
    query := TABSQuery.Create(nil);
    try
      query.DatabaseName := DM.Datasets.DatabaseName;
      query.SessionName  := DM.Datasets.SessionName;
      query.SQL.Text := 'SELECT * FROM Datasets WHERE Tree_ParentID='+IntToStr(ParentID)+' ORDER BY Tree_SortOrder';
      query.Open;
      while (not query.EOF) do begin
          Node               := LVMainForm.TV.Items.AddChild(ParentNode, query.FieldByName('Name').AsString);
          Node.Data          := TNodeData.Create;
          Node.ImageIndex    := query.FieldByName('Tree_ImageIndex').AsInteger;
          Node.SelectedIndex := query.FieldByName('Tree_ImageSelect').AsInteger;
          TNodeData(Node.Data).MDI_ID  := query.FieldByName('ID').AsInteger;
          // Type als String aus DB lesen und in Auszählungstyp wandeln :-)
          TNodeData(Node.Data).NodeTyp := TLVObjectTyp(GetEnumValue(TypeInfo(TLVObjectTyp),
                                                       query.FieldByName('Typ').AsString));
          TNodeData(Node.Data).MDIFile := query.FieldByName('Filename').AsString;
          AddChildNodes(query.FieldByName('ID').AsInteger, Node);
          if Node.HasChildren then
            Node.Expanded := query.FieldByName('Tree_Expanded').AsBoolean;

          Node.Selected := query.FieldByName('Tree_Selected').AsBoolean;
          query.Next;
        end;
      query.Close;
    finally
      query.Free;
    end;
  end;

begin
  DM.DB.DatabaseFileName := Filename;
  DM.DB.Open;
  DM.Datasets.Open;
  DM.Windows.Open;

  RootQuery := TABSQuery.Create(nil);
  try
    RootQuery.DatabaseName := DM.Datasets.DatabaseName;
    RootQuery.SessionName  := DM.Datasets.SessionName;
    RootQuery.SQL.Text := 'SELECT * FROM Datasets WHERE Tree_Depth=0 ORDER BY Tree_SortOrder';
    RootQuery.Open;
    while (not RootQuery.EOF) do begin
        RootNode               := LVMainForm.TV.Items.AddChild(nil, RootQuery.FieldByName('Name').AsString);
        RootNode.Data          := TNodeData.Create;
        RootNode.ImageIndex    := RootQuery.FieldByName('Tree_ImageIndex').AsInteger;
        RootNode.SelectedIndex := RootQuery.FieldByName('Tree_ImageSelect').AsInteger;
        TNodeData(RootNode.Data).MDI_ID  := RootQuery.FieldByName('ID').AsInteger;
        // Type als String aus DB lesen und in Auszählungstyp wandeln :-)
        TNodeData(RootNode.Data).NodeTyp := TLVObjectTyp(GetEnumValue(TypeInfo(TLVObjectTyp),
                                                     RootQuery.FieldByName('Typ').AsString));
        TNodeData(RootNode.Data).MDIFile := RootQuery.FieldByName('Filename').AsString;
        AddChildNodes(RootQuery.FieldByName('ID').AsInteger, RootNode);
        if RootNode.HasChildren then
          RootNode.Expanded := RootQuery.FieldByName('Tree_Expanded').AsBoolean;

//        RootNode.Selected := RootQuery.FieldByName('Tree_Selected').AsBoolean;

        RootQuery.Next;
      end;
    RootQuery.Close;
  finally
    RootQuery.Free;
  end;
end;


Reihenfolge neu schreiben:
Delphi-Quellcode: zusammenfalten | markieren
Procedure TDM.DataBase_WriteSortOrder;
var i, ID : Integer;
    Node  : TTreeNode;
begin
  for I := 0 to LVMainForm.TV.Items.Count - 1 do begin
    Node := LVMainForm.TV.Items[I];

    // ID des Node ermitteln
    ID := TNodeData(Node.Data).MDI_ID;
    // ID in DB addressieren
    DM.Datasets.Locate('ID', ID, []);

    // Werte neu eintragen
    with DM.Datasets do begin
      Edit;
      if (Node.Parent <> nil) then
        FieldByName('Tree_ParentID').AsInteger := TNodeData(Node.Parent.Data).MDI_ID
      else
        FieldByName('Tree_ParentID').Clear;

      if Node.HasChildren then
        FieldByName('Tree_Expanded').AsBoolean := Node.Expanded;

      FieldByName('Tree_Selected').AsBoolean := Node.Selected;

      FieldByName('Tree_Depth').AsInteger      := Node.Level;
      FieldByName('Tree_SortOrder').AsInteger  := Node.Index;
      Post;
    end;
  end;
end;


Kurze Erklärung zur Tabelle:
Code: zusammenfalten | markieren
DROP TABLE Datasets;
CREATE TABLE Datasets (
  ID AUTOINC,
  Typ VARCHAR(50),
  Name VARCHAR(50),
  CreateTime DATETIME,
  LastModify DATETIME,
  Filename WIDESTRING(250),
  Tree_ParentID INTEGER,
  Tree_Depth INTEGER,
  Tree_SortOrder INTEGER,
  Tree_Expanded LOGICAL,
  Tree_Selected LOGICAL,
  Tree_ImageIndex SMALLINT,
  Tree_ImageSelect SMALLINT,
  PRIMARY KEY idxPrimaryKey (ID)
);

Greetz Dominik

I love Delphi 2007/2010 Smile
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
Anzeige-Optionen:    
 
Delphi-PRAXiS Forum - Übersicht -> Datenbanken Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1   [ 6 Beiträge ]  
 
  Neuen Beitrag schreiben Auf Beitrag antworten
als PDF-Datei herunterladenThema ausdrucken
 
   
Gehe zu:  
Du darfst keine Beiträge in dieses Forum schreiben.
Du darfst auf Beiträge in diesem Forum nicht antworten.
Du darfst Deine Beiträge in diesem Forum nicht bearbeiten.
Du darfst Deine Beiträge in diesem Forum nicht löschen.
Du darfst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten.
Du kannst Dateien in diesem Forum nicht herunterladen.


Impressum / Kontakt
Allgemeine Geschäftsbedingungen
Verhaltenskodex & FAQ

Delphi-PRAXiS :: Das Forum für Delphi-Programmierer
Das Experten Forum für Delphi ProgrammiererHilfe für Borland Delphi gibts es hier im ForumDelphi Quelltexte und Source CodesDelphi-PRAXiS :: Das Forum für DelphiWindows APIInternet und NetzwerkeVCL und Datenbanken
 

Delphi-PRAXiS V.2005 III
© 2002-2010 by Daniel R. Wolf
powered by phpBB © phpBB Group

Impressum / Kontakt Allgemeine Geschäftsbedingungen