Announcement

Collapse
No announcement yet.

aus dem Programm einen TreeView bearbeiten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • aus dem Programm einen TreeView bearbeiten

    Hallo,

    in meinem Programm möchte ich einen TreeView an die Datenbank anbinden. Der Anwender soll damit wie man das aus dem Explorer kennt einen neuen Ordner erstellen und neue Verzeichnisse anlegen können. Diese werden dann in der Datenbank gespeichert. Drag and Drop,löschen usw. soll auch möglich sein. Hat jemand Tipps dazu, wie ich das realisieren kann ? Ein Beispiel wäre natürlich super.

    Danke Gruß Elke

  • #2
    Hallo,

    da hast du dir keine leichte Aufgabe gestellt. Wenn die Datenbank komplexer ist, würde ich eine DBTreeView nehmen.

    Eine sehr komfortable gibt es z.B. bei http://www.devexpress.com. Dort ist auch das Drag&Drop-Verhalten automatisiert.

    Gruß Ul

    Comment


    • #3
      Hallo Uli,

      wie es aussieht kosten diese Komponenten aber auch wieder etwas. Gibt es denn keine andere Möglichkeit so etwas zu realisieren ?

      Gruß Elk

      Comment


      • #4
        Hallo Elke,

        ich habe so etwas schon mehrfach probiert. Das Darstellen der Daten klappt immer ganz gut, aber bei der restlichen Funktionalität bin ich dann immer stecken geblieben. D.h. löschen, editieren, Änderungen und Fehleingaben überwachen, neu anlegen usw. mußt du alles selber machen. Richtig unangenehm wird es dann, wenn du die Eingaben auch noch in bestimmten Formaten oder aus Auswahllisten realisieren willst.
        Ganz aufegeben habe ich das ganze noch nicht. Vielleicht helfen hier wohldurchdachte Objekte und Listen, das ganze zu Vereinfachen.
        Willst Du Daten aus einer oder mehreren Tabellen darstellen und woher sollen deine Daten die Struktur im Baum nehmen? -Ein Satz = ein Knoten

        Comment


        • #5
          Klar gibt es diese Möglichkeiten - die Programmierer von DeveloperExpress haben sie genutzt

          Aber du kannst für solche komplexen Aufgaben kein Rezept in 3 Zeilen erwarten. Entweder beschäftigst du dich ein paar Wochen damit, oder du gibst halt mal ein paar Mark dafür aus.

          Gruß Ul

          Comment


          • #6
            Hallo Torsten,

            ich möchte nur aus einer Tabelle Daten darstellen. Aus der Tabelle soll nur die Bezeichnung im TreeView dargestellt werden. Die zugehörigen Datensätze erscheinen dann in daneben angeordneten Feldern. Die Tabelle ist für Arbeitscodes, die wiederum in Bereichen untergeordnet sind. Die Bereiche sollen dann also als Topknoten auftreten und die Arbeitscodes darunter angeordnet sein. Wenn nun der Anwender auf einen Eintrag klickt sollen nebendran in den Feldern die zugehörigen Informationen erscheinen. Eigentlich wie ich denke nichts Großartiges. Die Funktionalität könnte man auch über die Datenbank steuern, indem man die Daten in der Datenbank bearbeitet und nach jedem Vorgang den TreeView neu aufbaut. Die Drag und Drop Funktion wäre dann natürlich schon wieder etwas aufwendiger.

            Uli hat natürlich recht, dass wenn amn es bequem haben will ein paar Mark investieren muss. Leider habe ich nicht so viel Zeit, da ich meine Diplomarbeit in 4 Wochen abgeben muss. Vielleicht muss ich mich da mit einem Kompromiss zufriedengeben und erst einmal auf so komplizierte Sachen wie Drag and Drop verzichen und mich nur mit der Darstellung begnügen.

            Vielleicht kann mir ja dabei jemand mit einem Beispiel etwas unter die Arme greifen.

            Gruß Elk

            Comment


            • #7
              Hallo,

              hier ein Codeschnippsel, das eine Treeview in zwei Ebenen aus einer Tabelle erstellt. Aus Zeitgründen leider ohne weiteren Kommentar:
              <pre>
              procedure THauptForm.TVEinlesen;
              var q,q2 : TDBISAMQuery;
              n,n2 : TTreeNode;
              i,Sel : integer;
              begin
              try
              LockWindowUpdate(tvMain.handle);
              TVMain.items.BeginUpdate;
              TVMain.Items.clear;
              q := TDBISAMQuery.create(self);
              with q do
              begin
              DatabaseName := 'PROTOKOLLE';
              requestLive := true;
              sql.add('select distinct region,RegionSortID from MRRegionen order by RegionSortID');
              open;
              while not q.EOF do
              begin
              n := TVMain.Items.add(nil,q['region']);
              n.imageindex := 0;
              q2 := TDBISAMQuery.create(self);
              with q2 do
              begin
              Databasename := 'PROTOKOLLE';
              RequestLive := true;
              sql.add('select MRRegionenID,Region,Unterthema,UnterthemaSortID from MRRegionen');
              sql.add('where Region = "' + q['region'] + '"');
              sql.add('order by UnterthemaSortID');
              open;
              while not q2.EOF do
              begin
              n2 := tvMain.items.AddChild(n,q2['Unterthema']);
              n2.imageindex := 2;
              q2.next;
              end;
              q2.free;
              end;
              q.next;
              end;
              for i := 0 to tvMain.items.count -1 do
              if (tvMain.items[i].text = dm.T_MRRegionenUnterthema.value) and (tvMain.items[i].parent.text = dm.T_MRRegionenRegion.value) then
              sel := i;
              end;
              finally
              q.free;
              tvMain.Items.endUpdate;
              StopExpand := true;
              TVMain.selected := TVMain.items[sel];
              StopExpand := false;
              LockWindowUpdate(0);
              end;
              end;
              </pre>

              Gruß Ul

              Comment


              • #8
                Hi Uli,

                Danke erst mal für das Beispiel. Ich komme wohl auch ohne Kommentare damit klar.

                Gruß Elk

                Comment


                • #9
                  Hallo Elke,

                  ein TreeNode hat auch die Eigenschaft:data. Dort könntest Du - wenn auch zweckentremdet - vielleicht die ID deiner Datensätze unterbringen.
                  So findest du dann deine Datensätze eindeutig wieder, wenn sich etwas geändert hat.

                  Gruß Torsten

                  auch an Uli, Dein "Codeschnipsel" war auch für mich an einigen Stellen hilfreich

                  Comment


                  • #10
                    Hallo Elke,

                    der letzte Hinweis von Torsten ist ganz gut, denn hinter die Eigenschaft data kann man ganze Objekte lege, also zum Beispiel einen kompletten Datensatz oder sogar ein Objekt welches die Bearbeitung des Datensatzes ermöglicht.

                    Beispiel für einen Recod:
                    Type
                    pAuftragRec=^tAuftragRec;
                    tAuftragRec=record
                    id : integer;
                    Bezeichnung : string;
                    .....
                    end;
                    var
                    tn : TTreeNode;
                    begin
                    ….
                    // Aufbau Treeview wie bei Uli
                    ….
                    // Zuweisung der Daten
                    new(AuftragRec);
                    AuftragRec^.id:=qryID.Value;
                    tn.Data:=AuftragRec;
                    end;

                    Mit pAuftragRec(tn.data)^.id kann dann auf die Daten zugegriffen werden.

                    Achtung! Vor entfernen des Treeview erst den Speicher der Daten wieder freigeben.
                    Dispose(pAuftragRec(tn.Data))

                    Comment


                    • #11
                      Hallo,

                      das sind ja eine ganze Menge Tipps. Ich muss mal schauen, wie ich damit zurechtkomme.

                      Also Danke an euch alle

                      Gruß Elk

                      Comment

                      Working...
                      X