Announcement

Collapse
No announcement yet.

Objekte per Name finden

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

  • Objekte per Name finden

    Ich möchte in meinem Programm auf diverse Edit-Komponenten per Index zugreifen.
    Deshalb habe ich ein Array "ptrEdit[]", welches ich mit z.B. { Edit1,Edit2,Edit3 usw. } initialisiere.

    Kann man so etwas auch in einer Schleife tun, in der ich mir die Namen zusammenbastele und die Objekte
    mit irgendeiner Funktion aufgrund ihrer Namen erhalten kann. z.B: ptrEdit[i] = SchoeneObjectGetFunktion("Edit1");
    So was ähnliches habe ich gefunden, um den Klassennamen eines Objektes herauszufinden, doch leider bin ich für
    dieses Problem noch nicht fündig geworden.

    Hat schon mal jemand so etwas gemacht.

    Danke - Peter

  • #2
    Willst Du die Editfelder schon zur Entwurfszeit plazieren, oder kannst Du diese auch erst zur Laufzeit erzeugen ?

    Ersteres ist beim Formularentwurf vielleicht etwas angenehmer, und die Felder können wild durcheinander liegen. Die Felder mußt Du dann in einer Schleife suchen und dann den Namen übergeben, den Index schreibst Du beim Entwurf in die Eigenschaft Tag.

    Zweiteres geschieht in einer Schleife, z.B. for(i=0,y=55; i<5; i++,y+=20).... i ist der Index und wird nach dem new... in Tag abgelegt und y wird in Top abgelegt. Die Editfelder liegen dann alle schön untereinander.

    Wenn weitere Fragen kommen, stell sie ruhig.

    Gruß - Günthe
    Günther

    Comment


    • #3
      Hallo Günther,
      die Felder sind schon zur Entwurfszeit plaziert. Ich will später nur mit den Array arbeiten um sie anzusprechen. Es geht mir nur um eine elegante Lösung zur Initialisierung des Arrays. Die Felder heißen Edit1, Edit2 usw. Ich will mir den Namen aus "Edit" + IntToStr(i) in der Schleife zusammenbauen und dann die Adresse des Objektes in meinem Array Speichern.
      Z.Zt. schreibe ich: ptrEdit[0] = Edit1; ptrEdit[1] = Edit2 usw.
      Dies ist natürlich einfach, da ich hier einfach die Adressen der Objekte zuweise. Ich möchte aber diese Adresse aus den Strings der gebastelten Namen bekommen. Dafür brauche ich ne Funktion.
      Ich will also kein Index im Objekt speichern, sondern das Objekt später mit ptrEdit[x]->Text oder ptrEdit[x]->Top ansprechen können.

      Danke - Pete

      Comment


      • #4
        Ich zitiere die Hilfe:

        TWinControl::FindChildControl

        Die Methode FindChildControl gibt das untergeordnete Objekt mit dem angegebenen Namen zurück.

        TControl* __fastcall FindChildControl(const AnsiString ControlName);

        Beschreibung

        Mit FindChildControl können Sie ein bestimmtes untergeordnetes Objekt des Steuerelements abrufen. Die Methode durchsucht die Liste der untergeordneten Komponenten und gibt das Objekt mit dem angegebenen Namen zurück. Kann das Objekt nicht gefunden werden, gibt die Methode NULL zurück.

        Hinweis

        FindChildControl kann nur für Objekte verwendet werden, die dem fensterorientierten Steuerelement direkt untergeordnet sind. Ein untergeordnetes Steuerelement, das einem der untergeordneten fensterorientierten Steuerelemente untergeordnet ist, kann nicht zurückgegeben werden.

        Frag mich nicht nach Beispielen, ich hab das noch nie gemacht.

        Gruß - Günthe
        Günther

        Comment


        • #5
          Ja danke, das ist es und funktioniert gut. Leider gibt es das nicht unter C++ Builder 3. Da habe ich so etwas nämlich gesucht.

          Bye - Pete

          Comment


          • #6
            Habe hier auch noch was

            for(int x=0;x<Form1->ControlCount;x++)

            {
            TEdit *edit = dynamic_cast<TEdit *>
            (Form1->Controls[x]);

            if(edit)
            {

            if(edit->Name=="Edit1")
            { edit->Color=clBlue;
            }

            }
            }
            würde vielleich auch gehen

            Gruß Irmgar

            Comment


            • #7
              Hallo Irmgard u. Günther.
              Die Routine FindChildControl ist die richtige, existiert aber erst bei C++Builder 5. Beim 3er habe ich die Routine einfach nachgebaut. Da ist Irmgards Idee verwirklicht. Meine Routine funktioniert aber nicht umfassend: Wenn zum Beispiel ein Panel mit weiteren Unterobjekten auf der Form liegt, werden deren Objekte nicht gefunden. Natürlich könnte man jedes Objekt auf Unterobjekte durchsuchen, aber soweit wollte ich es nicht treiben. Wenn jemand Interesse an der Routine hat:

              TControl* __fastcall TMain::FindChildControl(TWinControl *Parent, AnsiString Name)
              {
              for (int i=0; i < ControlCount; i++)
              if (Parent->Controls[i]->Name == Name)
              return Parent->Controls[i];
              return NULL;
              }

              und so findet man die gewünschten Objekte:

              ptrArray[i] = (Label*)FindChildControl((TWinControl*)Form1,"Labe l1")

              Comment

              Working...
              X