Objekte suchen und vergleichen VCL



  • Hallo ihr lieben C++ Programmierer,

    hat jemand von euch eine Lösung für folgendes Problem?

    Ich möchte sämtliche Buttons und ähnliche Objekte eines bestimmten Formulars suchen und auflisten lassen. Danach möchte ich ein bestimmtes Attribut (z.B. Captions) von diesen ändern. Das soll vorweg bei jedem Start des Programms geschehen. Das hat einen bestimmten Grund warum es so kompliziert sein soll.
    Problem ist, dass ich nicht genau die BCB Hilfe verstanden habe. Muss ich eine Methode von TComponent oder TObjekt nehmen? Klar das sie miteinander verwand sind.

    Oder liege ich dort ganz falsch und es gibt noch einen anderen Weg die passenden Objekte zu finden und diese auf ihren Namen zu überprüfen? 😕

    Wenn ihr dafür ein Quelltextbeispiel habt, wäre es noch schöner. Ich hoffe mir kann jemand helfen?

    Danke euch sehr.

    👍



  • Hallo

    Mit TForm::Components kannst du auf alle untergeordneten Komponenten durchlaufen.
    Um auf Caption zuzugreifen, must du mit dynamic_cast auf TControl casten (und überprüfen)

    bis bald
    akari



  • Danke dir,
    leider habe ich noch nicht ganz den Plan. Suche noch in der BCB-Hilfe um es etwas besser zu verstehen.



  • Du kannst das folgende Beispiel benutzen und modifizieren und auf die Caption aller untergeordneter Objecte zuzugreifen. Dieses Beispiel modifiziert die Eigenschaft Enabled.

    void SetControlState(TWinControl *Parent, bool State)
    {
      for (int i=0; i < Parent->ControlCount; i++)
      {   TClass ClassRef = Parent->Controls[i]->ClassType();
          AnsiString Typ = ClassRef->ClassName();
          TWinControl *w = dynamic_cast<TWinControl*>(Parent->Controls[i]);
                                                // In Frage kommende WinControls durchsuchen
          if ((Typ == "TPanel") || (Typ == "TTabSheet") || (Typ == "TPageControl") || (Typ == "TGroupBox"))
          {  if (w->ControlCount > 1)
                SetControlState(w,State);
          }
          if (w != NULL) w->Enabled = State;
      }
    }
    

    Bye - Peter



  • Das ist nett.
    Sieht ganz gut aus. Lässt sich bestimmt anwenden bei mir. Nochmals danke.



  • Ok, mit der BCB komme ich sowit schonmal klar.
    Das Bespiel hat mich auf eine Idee gebracht. Kann mir einer sgaen wie ich den Namen eines Objektes bekomme?

    ObjName = Form2->Components[1]->Name;

    TControl::Name

    So funktioniert es ja in jedem Fall nicht.
    Die Objekte können ja über "ComponentCount" gezählt werden. Also müssen sie irgendwo in einer Liste stehen und eine Indes-nr. besitzen. Über diese Indexnr. müsste ich ja dann an den Namen kommen?
    Wollte dann anhand des Namens des Objektes die Captions zuweisen. Das ist doch machbar?
    Hat jemand eine Lösung für diese kleinigkeit?
    Ich bin etwas durcheinander.



  • Durchsuche die Componentsliste auf den gewünschten Namen.
    Hier ein einfaches Beispiel (ungtestet):

    for (int i=0; i< Form1->ComponentCount;i++)
    {
        TComponent *pc = Form1->Components[i];
    
        if (pc->Name == gesuchterName)
        {
    
          //Hier die gewünschte Aktion eintragen
          break; //Weil der KomponentenName ja eindeutig sein muss, gibts die
                 //Komponente auch nur einmal 
        }
    }
    


  • Ich glaube ich habe es. Ist das so richtig? Erhalte den Namen des Objekts.

    ObjName = Form2->Components[1]->GetNamePath();

    Funktioniert das auch bei Unterobjekten dieses Objektes? Wenn ja, wie?
    Muss ich das Rekursive programmieren?



  • Warum nicht einfach mal selbst probieren? Einfach mal austesten?


Anmelden zum Antworten