Announcement

Collapse
No announcement yet.

Probleme mit Tree-Navigation

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

  • Probleme mit Tree-Navigation

    Hallo!

    Ich hab gerade erst abgefangen mit dem C++Builder zu arbeiten (bzw. allgemein mit C++)!
    Ich hab folgendes Problem:
    In meinem Formular hab ich ein TreeView welches mir zur Navigation dient. Beim Doppelklick auf einen Punkt des Tree soll dann das augewählte Formular aufgehen. Die Formulare sind gleich benannt wie die Punkte im Tree! Jetzt will ich mir eine Funktion bauen die beim Doppelklick aufgerufen wird und den Namen des ausgewählten Punktes mitbekommt damit dann das Formular mit dem passenden Namen aufgerufen wird.
    Das Formular wird wie folgt aufgerufen:

    //Name ist der Name des Formulars

    Name->Parent = this;

    Name->Align = alRight;

    Name->BorderStyle = bsNone;

    Name->Show();

    Diese vier Zeilen will ich jetzt in eine Funktion verpacken wo "Name" dann jeweils für den Form-Namen steht den ich im Tree ausgewählt habe. Ich hab aber das Problem das der Datentyp von TreeView1->Selected->Text ein AnsiString ist!

    Kann jemand ein Anfänger wie mir bitte helfen!!

    Grüße
    Florian

  • #2
    Hallo Florian,

    am elegantesten geht das wohl, wenn Du im TreeView statt Add() AddObject() verwendest. Hierbei kannst Du einen Zeiger auf das Form mit übergeben. Diesen Zeiger kannst Du dann später verwenden um das Form aufzurufen.

    Sieh dir mal die Online Hilfe dazu an.

    Grüße Joche

    Comment


    • #3
      Hallo Jochen!

      Danke für die Antwort!
      Das Problem ist das ich die Einträge im Tree nicht händisch sondern über den Eintragseditor vom C++Builder6 gemacht habe. Sprich ich hab das Add() nicht per Hand eingegeben!

      lg
      Floria

      Comment


      • #4
        Hallo Florian,

        das macht's natürlich ein bißchen komplizierter...

        Versuch mal folgendes in der OnClick() des TreeView:
        <PRE>
        TComponent* SelComp = Application->FindComponent(TreeView1->Selected->Text);
        TForm* SelForm = (TForm*) SelComp;
        SelForm->Show();
        </PRE>

        In der ersten Zeile ermittelst Du den Text des zur Zeit im TreeView ausgewählten Items und läßt dir von der Applikation einen Zeiger darauf zurückgeben (SelComp). Dieser Zeiger ist vom Typ TComponent*. Damit kannst Du aber noch nicht viel anfangen, dazu mußt diesen Zeiger zuerst zum richtigen Typ casten (von TComponent* nach TForm*). Das geschieht in der zweiten Zeile. In der dritten Zeile wird das Formular dann aufgerufen.

        Die anderen gewünschten Eigenschaften kannst Du vor dem Show() noch setzen. Aber wozu soll das Parent = this gut sein? Das Formular hat doch bereits einen Parent, nämlich die Application. Wenn Du den Parent verbiegst, wird das zu unschönen Effekten führen (es sei denn, du willst die Formulare zu Laufzeit selbst erstellen??).

        Grüße Joche

        Comment


        • #5
          Florian,

          wenn Du die Einträge per Hand vorgenommen hast, nutzt Du vermutlich eine feste Anzahl von Formularen und könntest unter Verwendung einer der Eigenschaften ImageIndex, SelectedIndex oder StateIndex Deiner Knoten eine einfache switch-Anweisung benutzen:
          <pre><code>
          void __fastcall TForm1::TreeDblClick(TObject *Sender)
          {
          TTreeNode* selected = Tree->Selected;
          if (selected == NULL) return;
          switch (selected->StateIndex)
          {
          case (0):
          {
          Form1->Show();
          }; break;
          case (1):
          {
          Form2->Show();
          }; break;
          }
          }</code></pre>

          Gruß,
          Ja

          Comment


          • #6
            @Jan: Da finde ich meine Lösung aber 'schöner', alleine schon deswegen, weil es VIEL weniger Tiparbeit ist... (und pflegeleichter)

            @Florian: Aber Jan hat recht, ich hab' vergessen zu prüfen, ob ein gültiger Zeiger zurückgegeben wird:
            <PRE>
            TComponent* SelComp = Application->FindComponent(TreeView1->Selected->Text);
            if (SelComp)
            {
            TForm* SelForm = (TForm*) SelComp;
            // hier die anderen Zusweiungen z.B SelForm->BorderStyle = bsNone;
            SelForm->Show();
            }
            <PRE>

            Joche

            Comment


            • #7
              Jochen,

              an mangelnder Schönheit leiden beide Varianten, was jedoch letztlich darin begründet ist, daß der Baum manuell erzeugt wird. Deine Variante ist etwas eleganter, hat aber den Nachteil, daß die Knoten die tatsächlichen <I>internen</I> Variablennamen als Bezeichnung tragen müssen und das ganze nur funktioniert, wenn das Application-Objekt wirklich der Owner der Formulare ist (was bei Florial vermutlich der Fall ist).
              Wenn man ganz sicher sein will, müßte man SelComp eigentlich über dynamic_cast auf TForm casten und TreeView->Selected kann auch NULL sein (obwohl unwahrscheinlich).

              Gruß,
              Ja

              Comment


              • #8
                Hi Jan,

                wie Florian gepostet hatte, tragen die internen Variblennamen tatsächlich den Formularnamen. Mein erster Vorschlag, war ja auch das ganze mit AddObject() anstelle von Add() zu realisieren.

                Mit dem dynamic_cast hast Du natürlich recht.

                Aber Selected kann nicht NULL sein, da die Form in der OnClick()-Methode aufgerufen wird. Aber natürlich hast Du recht - Kontrolle ist besser als Vertrauen, ergo sollt man auch prüfen ob Selected ungleich NULL ist.

                Grüße und ein schönes Wochenende

                Joche

                Comment


                • #9
                  Jochen,

                  > Aber Selected kann nicht NULL sein,

                  kann es schon, wenn die Funktion explizit aufgerufen wird ohne daß die TreeView vorher den Fokus erhalten hat. Aber das kommt, wie gesagt, eher selten vor.

                  Gruß und auch schönes Wochenende an alle,<br>
                  Ja

                  Comment


                  • #10
                    Ich danke euch für eure Antworten! Ich werd alles mal ausprobieren! Wenn es weitere Probleme gibt dann melde ich mich wieder!

                    Danke!

                    Floria

                    Comment

                    Working...
                    X