Announcement

Collapse
No announcement yet.

Caption bei dynamischen button

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

  • Caption bei dynamischen button

    Hallo alle zusammen,

    ich habe ein kleines Problem mit dem Zugreifen auf die Caption bei dynamisch erstellten Button.
    Mit dem Click auf ein Button sollen dynamisch Button erstellt werden und die Caption aus einer Datei (Table) beziehen. Bis hierhin klappt alles wunderbar. Jetzt kommt mein problem.
    Bei einem Click auf irgendeinen der Dynamisch erstellt button, soll die Caption von genau diesem Button weiterverwendet werden.

    Ich kann mir zwar mit dem ereignis MyButtonClick irgendwas anzeigen lassen, aber eben nicht speziell fuer diesen gedrueckten button. Hier mal der Code, den ich verwendet habe:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    int i=0;
    Table1->First();
    while (!Table1->Eof)
    {
    Table1->First();
    while (!Table1->Eof)
    {
    i++;
    TButton *BSpeisen = new TButton(this);
    BSpeisen->Parent = this;
    BSpeisen->Name ="Speisen"+IntToStr(i);
    BSpeisen->Caption=Table1->FieldByName("Warengruppe")->AsString;
    Table1->Next() ;
    BSpeisen->OnClick = ClickMyButton,i;
    }
    }
    }
    void __fastcall TForm1::ClickMyButton(TObject *Sender)
    {
    ShowMessage(Speisen[1]->Caption); //Hier soll zB. eine Message angezeigt werden, die die Caption von Button 2
    enthaelt
    }

    h-Datei:


    public: // Anwender-Deklarationen
    TButton *Speisen[10];
    void __fastcall ClickMyButton(TObject *Sender);
    __fastcall TForm1(TComponent* Owner);


    Ist bestimmt bloss ne Kleinigkeit aber ich komme einfach nicht weiter. Ich hoffe ihr wisst mehr.

  • #2
    http://www.marquardtnet.info/cecke/q...quicky_17.html
    Christian

    Comment


    • #3
      Originally posted by jfranke401 View Post
      Hallo alle zusammen,

      ich habe ein kleines Problem mit dem Zugreifen auf die Caption bei dynamisch erstellten Button.
      Mit dem Click auf ein Button sollen dynamisch Button erstellt werden und die Caption aus einer Datei (Table) beziehen. Bis hierhin klappt alles wunderbar. Jetzt kommt mein problem.
      Bei einem Click auf irgendeinen der Dynamisch erstellt button, soll die Caption von genau diesem Button weiterverwendet werden.

      Ich kann mir zwar mit dem ereignis MyButtonClick irgendwas anzeigen lassen, aber eben nicht speziell fuer diesen gedrueckten button. Hier mal der Code, den ich verwendet habe:

      void __fastcall TForm1::Button1Click(TObject *Sender)
      {
      int i=0;
      Table1->First();
      while (!Table1->Eof)
      {
      Table1->First();
      while (!Table1->Eof)
      {
      i++;
      TButton *BSpeisen = new TButton(this);
      BSpeisen->Parent = this;
      BSpeisen->Name ="Speisen"+IntToStr(i);
      BSpeisen->Caption=Table1->FieldByName("Warengruppe")->AsString;

      Speisen[i] = BSpeisen; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

      Table1->Next() ;
      BSpeisen->OnClick = ClickMyButton,i;
      }
      }
      }
      void __fastcall TForm1::ClickMyButton(TObject *Sender)
      {
      ShowMessage(Speisen[1]->Caption); //Hier soll zB. eine Message angezeigt werden, die die Caption von Button 2
      enthaelt
      }

      h-Datei:


      public: // Anwender-Deklarationen
      TButton *Speisen[10];
      void __fastcall ClickMyButton(TObject *Sender);
      __fastcall TForm1(TComponent* Owner);


      Ist bestimmt bloss ne Kleinigkeit aber ich komme einfach nicht weiter. Ich hoffe ihr wisst mehr.

      Da ist noch eine Kleinigkeit zu beachten :

      Du reservierst mit TButton *Speisen[10]; Platz für 10 Zeiger auf Buttons,
      lässt aber in der Schleife

      while (!Table1->Eof)
      {

      }
      beliebig viele Buttons zu. Besser wäre

      while (!Table1->Eof && i < 10)

      Comment


      • #4
        Es wären noch weitere Kleinigkeiten:

        Warum 2 while Schleifen?

        Das dürfte nicht gehen:

        BSpeisen->OnClick = ClickMyButton,i;
        Christian

        Comment


        • #5
          Code:
          void __fastcall TForm1::Button1Click(TObject *Sender)
          {
          int i=0;
             Table1->First();
             while (!Table1->Eof && i < 10)
             {
          
                Speisen[i] = new TButton(this); 
                Speisen[i]->Parent  =  this;
                Speisen[i]->Name    = "Speisen"+IntToStr(i);
                Speisen[i]->Caption = Table1->FieldByName("Warengruppe")->AsString;
                Speisen[i]->OnClick  = ClickMyButton;
                i++;
                Table1->Next() ;
             }
          }
          
          void __fastcall TForm1::ClickMyButton(TObject *Sender)
          {
             ShowMessage(((TButton*)Sender)->Caption); //Hier soll zB. eine Message angezeigt werden, die die Caption von Button 2
          enthaelt
          }
          Zuletzt editiert von Henri van de Velde; 16.04.2008, 11:19. Reason: Fehler

          Comment


          • #6
            delete

            Das hat schonmal super geklappt, vielen dank erstmal.

            Leider ist das problem noch nicht ganz geloest. Jetzt fehlt noch das loeschen.
            Wie kann ich denn jetzt die button mit einem click auf einen anderen loeschen?

            Es wird staendig die Meldung angezeigt
            " fuer das loeschen eines Objektes ist genau eine Umwandlung in einen Zeigeroperator erforderlich"

            Comment


            • #7
              Leider ist das problem noch nicht ganz geloest.
              Kann nicht erkennen, welches Problem bisher ungelöst war.


              Es wird staendig die Meldung angezeigt
              " fuer das loeschen eines Objektes ist genau eine Umwandlung in einen Zeigeroperator erforderlich"
              Abgeshen davon, dass die Hellseherkugel zum polieren ist und man ohne Quelltext nicht sagen kann was der Fehler sein könnte, erfolgt das löschen mit "delete Objekt".

              In deinem Fall wäre nun zu klären, ob nur ein Button gelöscht werden soll oder alle auf einmal. Für Letzteres gibt es "delete[] Objekt". Dabei wird das ganze Array gelöscht.
              Zuletzt editiert von Christian Marquardt; 18.04.2008, 22:14.
              Christian

              Comment


              • #8
                Es sollen alle auf einmal geloescht werden.

                delete Speisen[1];


                geht nicht. Weiss hier nicht weiter.

                Comment


                • #9
                  Bei diesen mageren Infos bleibt nur:

                  Für Letzteres gibt es "delete [] Objekt". Dabei wird das ganze Array gelöscht.
                  Des Weiteren wäre noch zu erwähnen, dass wenn du

                  BSpeisen->Parent = this;

                  so etwas nutzt, du dich nicht um das Löschen kümmern musst. Vielmehr übernimmt das dann das Parent.....
                  Zuletzt editiert von Christian Marquardt; 18.04.2008, 22:13.
                  Christian

                  Comment


                  • #10
                    Das ist ja richtig, aber will ich die Button loeschen, um andere an gleicher stelle zu erzeugen, mit der gleichen Schleife, und dafuer haette uch gern die "alten" button gern aus demn weg.

                    Comment


                    • #11
                      Originally posted by jfranke401 View Post
                      Das ist ja richtig, aber will ich die Button loeschen, um andere an gleicher stelle zu erzeugen, mit der gleichen Schleife, und dafuer haette uch gern die "alten" button gern aus demn weg.
                      for (int i = 0; i < 10; i++)
                      delete Speisen[i];

                      Comment


                      • #12
                        for (int i = 0; i < 10; i++)
                        delete Speisen[i];
                        ????

                        delete[] Speisen;
                        Christian

                        Comment


                        • #13
                          Originally posted by jfranke401 View Post
                          Es sollen alle auf einmal geloescht werden.

                          delete Speisen[1];


                          geht nicht. Weiss hier nicht weiter.
                          Dass sollte gehen feur die zweite button. Wass geht denn nicht? Bekommst du eine Fehlermeldung? So ja welche und wann?

                          Meinst du nicht delete Speisen[i]; ?

                          Originally posted by Henri van de Velde View Post
                          for (int i = 0; i < 10; i++)
                          delete Speisen[i];
                          Dass is ok.

                          Originally posted by Christian Marquardt View Post
                          ????

                          delete[] Speisen;
                          Eine delete operation auf ein array das mit

                          TButton *Speisen[10];

                          declariert ist hat kein effect.

                          Auf nichts.

                          Comment

                          Working...
                          X