Announcement

Collapse
No announcement yet.

TTreeView problem

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

  • TTreeView problem

    Hallo zusammen,

    Ich benötige in einem TreeView in den Nodes zusätzliche Properties, da der treeView dynamisch aus einer Datenbank aufgebaut wird und ich über diese Properties auf die einzelnen Daten in der datenbank zugreifen muß um die auch zu verändern. Über die Data Eigenschaft ist das etwas umständlich. Auch eine eigene neue VCL Komponente möchte ich mir nicht unbedingt Schreiben, weil die Kenntnisse hierzu fehlen.

    Gibt es eine Möglichkeit dennoch eigene Eigenschaften mittels abgeleiteter Klasse (Ich sage es mal so unfachmännisch) oder ähnlich zu erstellen?

    Ich komm da einfach nicht weiter. Habe vor vielen Jahren mit dem Builder 3 programmiert und bin nun durch 4 jahre ausschließlich PHP Programmierung ein wenig 'versaut' ... muß da erst wieder rein finden.

    Danke im voraus für jeden Schubs in die richtige Richtung.

    Manfred

  • #2
    Nein.

    Grundsätzlich kann man in C++ von mehreren Klassen ableiten. Die VCL lässt jedoch nur eine Ableitung zu.

    Eine eigene Komponente willst du nicht schreiben -> entfällt also auch

    Die Data Eigenschaft willst du nicht nutzen (umständlich???) -> entfällt also auch
    Christian

    Comment


    • #3
      Hallo Christian,

      ja ich weiß Du hast ja Recht, alles was geht will ich nicht.

      Ist es möglich einem nicht Versierten einfach zu erklären wie man eine VCL Komponente schreibt? Dann würde ich mich da mal ran wagen. Ich bräuchte dann halt einen TTreeView mit TTreeNodes und TTreeNode Objekten, wobei ich nur bei den Nodes 3 Eigenschaften hinzufüge.

      Manfred

      Comment


      • #4
        Der C++Builder 6 hatte ein gute Anleitung dafür....

        Kann dir nur Beispiele bieten

        http://www.marquardtnet.info/cecke/k...2/2_index.html


        Warum nicht DATA benutzen??
        beispielsweise hat du eine Klasse Werte die du mit einem Item aus dem TreeView verknüpfen willst

        Werte *mywerte=new mywerte();

        //fülle die Klasse mit den zusätzlichen Daten

        TTreeView1->Item->Data=mywerte;


        Nun der umgekehrte Weg, um wieder an die Daten ranzukommen

        Werte *mywerte=(Werte)TTreeView1->Item->Data;
        Christian

        Comment


        • #5
          habe noch eine HTML-Seite mit Erläuterungen wie man Komponenten entwirft.

          Gibt mir deine eMail und ich sende dir sie zu
          Christian

          Comment


          • #6
            Hallo Christian,

            Meine Mail addi ist mannnix[at]gmx.de!

            Ich habe das jetzt mal mit Data ausprobiert, funzt aber nicht. :-(

            Habe eine Klasse TKnoten angelegt, deren Ausprägungen die Daten halten sollen. Die sieht so aus:

            class TKnoten
            {
            private:
            AnsiString sRepLevel;
            AnsiString sRepKey;
            AnsiString sName;
            public:
            void setRepLevel(AnsiString inRepLevel) { sRepLevel=inRepLevel; }
            void setRepKey(AnsiString inRepKey) { sRepKey=inRepKey; }
            void setName(AnsiString inName) { sName=inName; }
            AnsiString getRepLevel() { return(sRepLevel); }
            AnsiString getRepKey() { return(sRepKey); }

            };


            Nun versuche ich die Ausprägung zu füllen und auch wieder anzuzeihen:

            TTreeNode *neu;
            TKnoten *knoten;
            AnsiString ppp;

            neu = TreeView1->Items->Add(new TTreeNode(TreeView1->Items), "100-root");
            knoten = new TKnoten();
            knoten->setRepLevel("100");
            neu->Data = knoten;
            ppp = neu->Data->getRepLevel();

            Beim letzten Befehl gibt es eine Fehlermeldung 'Zeiger auf Struktur auf linker Seute erforderlich'. Menno, knoten ist doch ein Zeiger. Mit
            ppp = knoten->getRepLevel() geht das einwandfrei.

            Was mache ich hier falsch, bzw. was habe ich vergessen?

            Und schon mal danke im voraus für die Mail.

            Manfred
            eine Struktur stehen muß.

            Comment


            • #7
              ppp = knoten->getRepLevel();


              neu-> Data speichert nur den Zeiger. Das bedeutet nicht, dass du dann über den TreeNode darauf zugreifen kannst. Da jetzt in deinem Kontext ja knoten noch gültig ist, musst due diesen nehmen um auf deine Klasse zuzugreifen.


              Kommst du an eine Stelle in deinem Progremm wo dieser Zeiger (TKnoten *knoten ) nicht gültig ist, musst du dir einen machen und den Zeiger aus dem TreeNode casten und zuweisen

              TKnoten *knoten=(TKnoten)TTreeView1->Item->Data;

              PS:

              Um ärger mit Borlands Klassen zu vermeinden, solltes du deinen Klassen etwas anderes als ein T voranstellen.

              bsp

              MJKnoten *knoten;


              HTML-Seite heute abend
              Christian

              Comment


              • #8
                Hallo Christian,

                vielen Dank für Deine Hilfe, funktioniert einwandfrei wie von Dir oben beschrieben. Bitte entschuldige die vielleicht etwas dumme Frage: Ich erzeuge ja eine ganze Menge TKnoten-Objekte mit new, rufe aber nie delte[] auf. Gibt es da sowas wie einen garbage collector, der mir den Speicher wider frei gibt wenn ich das Programm beende?

                Was mich noch interessieren würde, ich habe jetzt ne Testversion von c++ Builder 2007, die ich die nächsten Tage kaufen würde. Ist bcb 6 vielleicht eher zu empfehlen? Ich benötig auf jeden Fall die ganzen AD- Objekte zur Programmierung eines ADS.

                P.S.: Schon richtig, ich verwende halt deutsche Bezeichner für mein Klassen.

                Danke nochmal für die HTML Datei, heute Abend ist völlig okay.

                Comment


                • #9
                  der mir den Speicher wider frei gibt wenn ich das Programm beende?
                  Nein, gibt es nicht. Wenn du den Node löschst-> delete von TKonten und zum Schluß den TreeView durchlaufen und ebenfalls alle löschen

                  Habe C++Builder 2007 nicht, keine Infos was wirklich besser ist.

                  Schon richtig, ich verwende halt deutsche Bezeichner für mein Klassen.

                  ging nicht um Deutsch oder nicht, sondern um den Buchstaben DAVOR hier das T. Wird von Borland genutzt. Haben die eine Klasse TKonten und du auch, gibt es u.U. ärger.
                  Christian

                  Comment


                  • #10
                    Habe C++Builder 2007 nicht, keine Infos was wirklich besser ist.
                    Könntest ja mal hier was posten zum C++Builder 20007. Mich interessiert folgendes:

                    Funktioniert endlich mal das Refactoring?
                    Gibt es endlich was um den Code zu formatieren (muss ja nicht gleich Eclipse-like sein)?
                    Gibt es wieder einen ClassExplorer?
                    Christian

                    Comment


                    • #11
                      Nein, gibt es nicht. Wenn du den Node löschst-> delete von TKonten und zum Schluß den TreeView durchlaufen und ebenfalls alle löschen

                      Schade eigentlich :-)
                      Ich erzeuge die Knoten im FormCreate mit new und setze dann den zeiger im TreeView auf das gerade erzeugte Objekt. genügt es wenn ich beim OnDestroy des TreeView diesen durchlaufe und ein delete[] auf Data mache?

                      Das mit dem deutsch ist schon klar, ich denke aber TKnoten wird es bei Borland nicht geben, das wäre dann TNode. Das Mj davor ist allerdings auch ne Idee, dann könnte der nämlich MJNode heißen.

                      Zum c++ Builder 2007 mach ich nen extra thread.

                      Comment

                      Working...
                      X