Tipparbeit sparen über Programm-Schleife



  • Hallo surger77,

    danke für deine Hilfe, aber da komm ich trotzdem nicht ganz weiter. Ich muss ja auf das event des BitBtn reagieren:

    //---------------------------------------------------------------------------
    
    // Initialisierung
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
     TComponentList *Edit_array = new TComponentList;
    
     for ( int i = 0; i < Form1->ComponentCount; i++ )
        {
         if ( Form1->Components[i]->ClassNameIs("TEdit") )
           {
            Edit_array->Add(Form1->Components[i]);
           }
        }
    }
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    
    // Event wenn ein BitBtn gedrückt wird
    void __fastcall TForm1::XYZ(TObject *Sender)
    {
     for ( int i = 0; i < Edit_array->Count; i++ )
        {
         if ( ((TBitBtn*)(Edit_array->Items[i])) == Sender )
           {
            if ( CheckBox30->Checked )  // ????
              {
               if ( Edit_array->Items[i]->Text == "" ) Edit_array->Items[i]->Text = "1";
               else if ( StrToInt(Edit_array->Items[i]->Text) < 99 ) Edit_array->Items[i]->Text = IntToStr(StrToInt(Edit_array->Items[i]->Text)+1);
              }
            break;
           }
        }
    }
    //---------------------------------------------------------------------------
    

    So funktioniert es nicht. Hast du nochmal ein Tip ?


  • Mod

    Hallo

    schau mal in die FAQ 😃

    (Tip "was steht nochmal in Sender" 😕

    MfG
    Klaus



  • Du könntest das auch über die Eigenschaft Tag einer Kompo lösen:
    weise jedem BitBtn ein eindeutiges Tag zu (also z.B. von 0-29)
    dann schaust du dir beim OnClick-Ereignis das jeweilige tag an und weißt, welches BitBtn es ist

    hier mal nen bisl code:

    TComponentList *Edit_array = new TComponentList;
    
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    { int count = 0;
      for ( int i = 0; i < Form1->ComponentCount; i++ )
        { if ( Form1->Components[i]->ClassNameIs("TBitBtn") )
            { ((TBitBtn*)Form1->Components[i])->Tag = count;
              ((TBitBtn*)Form1->Components[i])->OnClick = BitBtnClick;
              count++;
            }
    
          if ( Form1->Components[i]->ClassNameIs("TEdit") )
            Edit_array->Add(Form1->Components[i]);
        }
    }
    
    void __fastcall TForm1::BitBtnClick(TObject *Sender)
    { int Nr = ((TBitBtn*)Sender)->Tag;
      ((TEdit*)Edit_array->Items[Nr])->Text = "Hallo";
    }
    


  • du mußt anstatt

    if ( CheckBox30->Checked )  // ????
    

    so schreiben, vorher die checkboxen auch in eine componentlist laden

    if (combo_array->Items[i]->checked == true)...
    

    so müßte es dann kuntionieren.



  • hab ich noch vergessen :p
    deine buttons mußt du auch noch in ein array laden, dann bei jedem button bei dem ereignis OnClick deine funtion eintragen 🙂



  • Danke für eure Hilfe und Tips. Ich hab's jetzt so hinbekommen:

    void __fastcall TForm1::IDBitBtnClick(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
     AnsiString sSender, sNumber;
    
     sSender = Sender->ClassName();
     if ( sSender.AnsiCompare("TBitBtn") == 0 )
       {
        TBitBtn *pBitBtn = dynamic_cast <TBitBtn*>(Sender);
    
        if ( pBitBtn != NULL )
          {
           sSender = pBitBtn->Name;
           sNumber = sSender.SubString(7,sSender.Length()-6);
          }
        else return;
       }
     else return;
    
     for ( int i = 0; i < Form1->ComponentCount; i++ )
        {
         if (Form1->Components[i]->ClassNameIs("TCheckBox"))
           {
            if (dynamic_cast<TCheckBox*>(Form1->Components[i])->Name == ("CheckBox" + sNumber))
              {
               if (dynamic_cast<TCheckBox*>(Form1->Components[i])->Checked )
                 {
                  for ( int j = 0; j < Form1->ComponentCount; j++ )
                     {
                      if (Form1->Components[j]->ClassNameIs("TEdit"))
                        {
                         if (dynamic_cast<TEdit*>(Form1->Components[j])->Name == ("Edit" + sNumber))
                           {
                            if ( Button == mbLeft )
                              {
                               if ( dynamic_cast<TEdit*>(Form1->Components[j])->Text == "" )
                                    dynamic_cast<TEdit*>(Form1->Components[j])->Text = "1";
                               else if ( StrToInt(dynamic_cast<TEdit*>(Form1->Components[j])->Text) < 99 )
                                         dynamic_cast<TEdit*>(Form1->Components[j])->Text =
                                           IntToStr(StrToInt(dynamic_cast<TEdit*>(Form1->Components[j])->Text)+1);
                              }
                            if ( Button == mbRight && dynamic_cast<TEdit*>(Form1->Components[j])->Text != "" )
                              {
                               if ( StrToInt(dynamic_cast<TEdit*>(Form1->Components[j])->Text) > 0 )
                                    dynamic_cast<TEdit*>(Form1->Components[j])->Text =
                                      IntToStr(StrToInt(dynamic_cast<TEdit*>(Form1->Components[j])->Text)-1);
                              }
                            return;
                           }
                        }
                     }
                 }
              }
           }
        }
    }
    

    Sieht zwar wüst aus mit den Schleifen, aber es geht.

    Gruß WoWe



  • das ist wirklich ganz schön wüst

    wäre das nicht besser? (auch von der Laufzeit her gesehen):

    TComponentList *Edit_array = new TComponentList;
    TComponentList *CheckBox_array = new TComponentList;
    
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    { int count = 0;
      for ( int i = 0; i < Form1->ComponentCount; i++ )
        { if ( Form1->Components[i]->ClassNameIs("TBitBtn") )
            { ((TBitBtn*)Form1->Components[i])->Tag = count;
              ((TBitBtn*)Form1->Components[i])->OnClick = BitBtnClick;
              count++;
            }
    
          if ( Form1->Components[i]->ClassNameIs("TEdit") )
            Edit_array->Add(Form1->Components[i]);
    
          if ( Form1->Components[i]->ClassNameIs("TCheckBox") )
            CheckBox_array->Add(Form1->Components[i]);
        }
    }
    
    void __fastcall TForm1::BitBtnClick(TObject *Sender)
    { int Nr = ((TBitBtn*)Sender)->Tag;
      if(((TCheckBox*)CheckBox_array->Items[Nr])->Checked)
       { int wert = StrToInt(((TEdit*)Edit_array->Items[Nr])->Text);
         if(wert < 99)
          { wert++;
            ((TEdit*)Edit_array->Items[Nr])->Text = IntToStr(wert);
          }
       }
    }
    

    macht von der logik her das selbe, was du gemacht hast
    musst dann nur noch folgende zeile in die header-datei schreiben:

    void __fastcall BitBtnClick(TObject *Sender);
    


  • Hm, also irgendwie funktioniert deine Lösung bei mir nicht. In BitBtnClick() bekomme ich z.B. Nr = 3, und obwohl die CheckBox1 angeklickt ist, läuft er nicht in die Abfrage rein.



  • ich vermute, dass er die einzelnen Komponenten in einer anderen reihenfolge initialisiert, als wie die nummer am ende angibt.

    ich hab den code dahingehend abgeändert, sollte jetzt funzen

    #include <IdGlobal.hpp>
    TComponentList *Edit_array = new TComponentList;
    TComponentList *CheckBox_array = new TComponentList;
    
    int __fastcall CompareNames(void *Item1, void *Item2)
    { return CompareText(((TComponent *)Item1)->Name, ((TComponent *)Item2)->Name);
    }
    
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    { for ( int i = 0; i < Form1->ComponentCount; i++ )
        { if ( Form1->Components[i]->ClassNameIs("TBitBtn") )
            { String s = Form1->Components[i]->Name;
              int j = s.Length()-1;
              while(IsNumeric(s[j-1])) j--;
              s = s.SubString(j+1, s.Length()-j);
              ((TBitBtn*)Form1->Components[i])->Tag = StrToInt(s)-1;
              ((TBitBtn*)Form1->Components[i])->OnClick = BitBtnClick;
            }
    
          if ( Form1->Components[i]->ClassNameIs("TEdit") )
            Edit_array->Add(Form1->Components[i]);
    
          if ( Form1->Components[i]->ClassNameIs("TCheckBox") )
            CheckBox_array->Add(Form1->Components[i]);
        }
      Edit_array->Sort(CompareNames);
      CheckBox_array->Sort(CompareNames);
    }
    
    void __fastcall TForm1::BitBtnClick(TObject *Sender)
    { int Nr = ((TBitBtn*)Sender)->Tag;
      if(((TCheckBox*)CheckBox_array->Items[Nr])->Checked)
       { int wert = StrToInt(((TEdit*)Edit_array->Items[Nr])->Text);
         if(wert < 99)
          { wert++;
            ((TEdit*)Edit_array->Items[Nr])->Text = IntToStr(wert);
          }
       }
    }
    

    Ich hab einfach die beiden listen sortiert und die tag-nummer an die nummer der jeweiligen komponente angepasst
    nun ist es auch egal, wie die komponenten heißen
    wichtig ist nur die nummerierung am ende (und das pro Komponentengruppe der name vor der nummer immer gleich ist)

    ich hoffe dass es jetzt bei dir funzt



  • Jo, deine Version geht jetzt auch. Allerdings "ohne sort". Es wird nicht nach aufsteigender Nummer sortiert, sondern CheckBox1, CheckBox10 (anstatt x2).

    Beim Beenden des Programms bekomme ich aber noch eine Zugriffsverletzung beim 2. delete

    delete Edit_array;
     delete CheckBox_array;
    

Anmelden zum Antworten