Announcement

Collapse
No announcement yet.

Steuerelemente ueber Schleife ansprechen

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

  • Steuerelemente ueber Schleife ansprechen

    Ich möchte mehrere Steuerelemente über eine Schleife ansprechen.
    z.B. Label1 bis 3 sollen die Caption Test bekommen.
    Etwa so:

    for(int i=1;i<=3;i++)
    {
    AnsiString tempName;
    AnsiString iAS=i;
    tempName="Label"+ iAS;

    tempName->Caption="Test";
    }

    Hier bei bekomme ich immer die Fehlermeldung:
    [C++ Fehler] Unit1.cpp(28): E2288 Zeiger auf Struktur auf linker Seite von -> oder von ->* erforderlich

    Wer kann helfen?

  • #2
    FindComponent ist dein Freund.
    <br>Uli

    Comment


    • #3
      Hallo,

      Dumusst du tempName.Caption="Test"; schreiben, weil du direkt eine Variable hast, und nicht einen Zeiger. Das nächste Problem ist, dass deine Variablen nur innerhalb der Schleife gültig sind, da sie innerhalb der Schleife deklariert sind, du solltest sie vor der Schleife deklarieren, und in der Schleife nur den wert zuweisen.

      grüsse
      Sebastia

      Comment


      • #4
        Und dann kann ich mit dem Variablennamen (Beispiel "Label1") das Label1 im Formular ansprechen??

        Also

        String test="Label1";

        test.Caption="Hallo";

        Eigentlich sollte das über FindComponent (wie schon gesagt) abgewickelt werde
        Christian

        Comment


        • #5
          @Sebastian: Lies den geposteten Quellcode noch mal in Ruhe durch. ;-)
          <p>Das Hauptproblem ist, dass tempName ein <b>String</b> ist und kein Label. Das lässt sich mit FindComponent erschlagen (einfach mal hier im Forum suchen -- liefert wahrscheinlich Delphi-Quelltext, aber das lässt sich ja recht einfach nach C++ konvertieren.)

          <p>Ob die Zuweisung<pre>
          AnsiString iAS=i;
          </pre>im C++-Builder geht weiß ich nicht. In Delphi würde ich stattdessen<pre>
          tempName="Label"+ IntToStr(i);
          </pre>schreiben.

          <p>Ciao, Uli

          Comment


          • #6
            man könnte ein Feld mit Zeiger definieren, dann kann man sich das genze mit den Temporären Strings sparen.

            z.B. so:

            TLabel* labels[3];

            labels[0] = Label1;
            labels[1] = Label2;
            labels[2] = Label3;

            for(int i=0; i <= 2; i++)
            {
            labels[i]->Caption = "Test";

            Comment


            • #7
              Ja, so könnte das dan gehen, aber einfacher mit FindComponent.

              :-
              Christian

              Comment


              • #8
                Man kann ja ggfs. beide Ansätze kombinieren: Einmal im Konstruktor die for-Schleife mit FindComponent, um das Array zu befüllen, danach nur noch das Array benutzen. Das wäre der Effizienz sicher ganz zuträglich, wenn die Schleife in einem OnMouseMove steckt. Und lesbarer wäre es auch.
                <br>Ciao, Uli

                Comment


                • #9
                  Hallo, ich habe eine Lösung gefunden. Etwa so
                  <PRE>
                  for( int i=1;i<=3;i++)
                  {
                  TLabel *pLb=(TLabel*)Form1->FindComponent("Label" + IntToStr(i));
                  pLb->Caption="Hallo";
                  }
                  </PRE>

                  Der Tip mit FindComponent war sehr gut.
                  Danke für die Hilfe

                  Gruß

                  Norber

                  Comment


                  • #10
                    Schaut gut aus. Wenn du auf Nummer Sicher gehen willst, kannst du noch auf pLb != 0 prüfen und den C-Cast durch einen dynamic_cast ersetzen. Wenn du allerdings sagst "Ich <b>weiß</b>, dass es Komponenten Label1 bis Label3 gibt, und dass diese allesamt TLabel's sind.", dann kannst du das auch sein lassen.
                    <br>Uli

                    Comment

                    Working...
                    X