Mehrere CheckBoxen und ListBox Problem?



  • Hallo,
    ich habe ein kleines Problem.
    Es geht darum das ich in mein Programm 11 CheckBox's habe und einen ListBox.
    Jetzt möchte ich das wenn zum Beispiel CheckBox1 geklickt ist ein Name in ListBox geschriben wird und wenn ich denn hacken wieder raus nehme möchte ich das es aus der ListBox entfernt wird.
    Jetzt meine Frage gibt es eine möglichkeit das ich das alles in eine kleine (abfrage)/methode mache.
    Z.B.: von checkbox1 bis checkbox11
    oder muss ich für jeden CheckBox einzeln Manuel den passenden code schreiben?

    Dank im Voraus.



  • schau mal in der FAQ, z.B. Sendernamen bei einer OnClick-Prozedur identifizieren und Zugriff, aber nicht durch Namen

    du kannst allen CheckBoxen das gleiche Ereignis zuweisen und dann die einzelnen CheckBoxen über den Sendernamen oder noch besser über den Tag des Senders identifizieren, dazu mußt du natürlich erst jeder CheckBox einen Tag-Wert zuweisen



  • Hi,
    danke für deine Antwort.
    Ist es möglicht das du mir Bitte ein Beispiel code schreibst.
    Verstanden habe ich das irgendwie, aber wie ich es realiseren null ahnung.
    Ein Beispiel wäre ganz nett.

    Danke.



  • Hallo titanium
    folgender Code arbeitet mit Senderabfrage.

    void __fastcall THauptFenster::CheckBox1Click(TObject *Sender)
    {
    
    if(Sender==CheckBox1)
    	{
              if ( CheckBox1->Checked)
    
                 {ListBox1->Items->Add( "CheckBox1");}
              else
                {if (ListBox1->Items->IndexOf("CheckBox1")!=-1)
                    {ListBox1->Items->Delete(ListBox1->Items->IndexOf("CheckBox1"));}
                };
    
            } ;
    
    if(Sender==CheckBox2)
    	{
              if ( CheckBox2->Checked)
    
                 {ListBox1->Items->Add( "CheckBox2");}
              else
                {if (ListBox1->Items->IndexOf("CheckBox2")!=-1)
                    {ListBox1->Items->Delete(ListBox1->Items->IndexOf("CheckBox2"));}
                };
    
            } ;
    
    if(Sender==CheckBox3)
    	{
              if ( CheckBox3->Checked)
    
                 {ListBox1->Items->Add( "CheckBox3");}
              else
                {if (ListBox1->Items->IndexOf("CheckBox3")!=-1)
                    {ListBox1->Items->Delete(ListBox1->Items->IndexOf("CheckBox3"));}
                };
    
            } ;
    
    }
    

    Der Code benötigt eine Listbox namens ListBox1 im Hauptfenster
    und drei Checkboxen namens CheckBox1 - 3.
    Im Objektinspektor/Ereignisse/OnClick sind bei allen Checkboxen
    CheckBox1Click angegeben.

    MFG Schlumpi



  • Hi,
    Danke dir es läuft.
    Schlumpi, das letzt was duu geschrieben hast war interressant.

    Der Code benötigt eine Listbox namens ListBox1 im Hauptfenster
    und drei Checkboxen namens CheckBox1 - 3.
    Im Objektinspektor/Ereignisse/OnClick sind bei allen Checkboxen
    CheckBox1Click angegeben.



  • Sorry, Schlumpi, aber dein Code ist ja grausam, denn dann hätte man auch gleich verschiedene Methoden je Checkbox nehmen können.

    So macht man es richtig:

    void __fastcall THauptFenster::CheckBoxClick(TObject *Sender)
    {
      TCheckBox *pCheckBox = dynamic_cast<TCheckBox*>(Sender); // oder static_cast, falls kein RTTI eingeschaltet ist
      if(pCheckBox)
      {
        if ( pCheckBox->Checked)
        {
          ListBox1->Items->Add( pCheckBox->Name );
        }
        else
        {
          int nIdx = ListBox1->Items->IndexOf( pCheckBox->Name );
          if (nIdx !=-1)
             ListBox1->Items->Delete(nIdx);
        };
      };
    }
    

    Alternativ, wie Linnea schon geschrieben hat, kann man auch die Eigenschaft 'Tag' benutzen und z.B. aus einem Array oder std::vector den angezeigten Namen lesen:

    AnsiString sName = vecNames[pCheckBox->Tag].c_str();
    

    Aber du solltest trotzdem mal die FAQ Beiträge lesen...



  • Hallo titanium
    hier noch ein konkretes Beispiel.

    TForm1 *Form1;
    TStringList * StrChk;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
     StrChk = new TStringList;
     StrChk->AddObject("Januar",CheckBox1);
     StrChk->AddObject("Februar",CheckBox2);
     StrChk->AddObject("März",CheckBox3);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::CheckBox1Click(TObject *Sender)
    {
     TCheckBox * CheckBoxDummy = dynamic_cast<TCheckBox*>(Sender);
    
     int Zeile = -1;
     Zeile = StrChk->IndexOfObject(CheckBoxDummy);
     if (Zeile == -1){return ; };
    
     if ( CheckBoxDummy->Checked)
         ListBox1->Items->Add(StrChk->Strings[Zeile]);
    
     else{
    
          if ( ListBox1->Items->IndexOf(StrChk->Strings[Zeile]) != -1)
              { ListBox1->Items->Delete(ListBox1->Items->
                IndexOf(StrChk->Strings[Zeile]) );
              };
    
        };
    }
    

    MFG Schlumpi



  • WOW.
    Danke läute für die Tipps und Codes. 🙂


Log in to reply