for schleife basteln....



  • hey...ich hab es jetzt schon einige male verscht aber ich komme nicht weiter!
    ich will folgenden code zu einer for schleife zusammen fassen...

    if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[0])      //Kabeldurchmesser aufzählen für Unit4
                    VerA1 = VerA1 + StrToInt(Edit1->Text);                          //Versorgungskabel A1-A21
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[1])
                    VerA2 = VerA2 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[2])
                    VerA3 = VerA3 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[3])
                    VerA4 = VerA4 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[4])
                    VerA5 = VerA5 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[5])
                    VerA6 = VerA6 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[6])
                    VerA7 = VerA7 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[7])
                    VerA8 = VerA8 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[8])
                    VerA9 = VerA9 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[9])
                    VerA10 = VerA10 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[10])
                    VerA11 = VerA11 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[11])
                    VerA12 = VerA12 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[12])
                    VerA13 = VerA13 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[13])
                    VerA14 = VerA14 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[14])
                    VerA15 = VerA15 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[15])
                    VerA16 = VerA16 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[15])
                    VerA17 = VerA17 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[17])
                    VerA18 = VerA18 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[18])
                    VerA19 = VerA19 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[19])
                    VerA20 = VerA20 + StrToInt(Edit1->Text);
            if(Edit2->Text == "Versorgungskabel" && CheckListBox1->Checked[20])            //A21
                    VerA21 = VerA21 + StrToInt(Edit1->Text);
    

    den code gibt es auch noch für VerB1-21 bis VerS1-21...
    vlt kann mir jemand ja einen ansatz dafür geben wir ich das lösen kann...
    komm ich evtl mit einem array weiter?

    danke schonmal...

    gruß sven



  • Mach aus deinen VerA? Variablen ein array (oder vector). Dann kannst du auch problemlos mit einer Schleife drüber laufen.
    z. Bsp. wenn du 30 Elemente hast

    int VarA[30];
    // die dann irgendwie befüllen
    if(Edit2->Text == "Versorgungskabel") { // reicht ja einmal
        for( int i=0; i<30; ++i) {
            if(CheckListBox1->Checked[i])
                VarA[i] += StrToInt(Edit1->Text);
        }
    }
    

    Man müsste noch bei StrToInt evtl. auftretende Fehler abfangen.



  • okay danke versuch ich mal...
    das muss ich aber so wie es jetzt ist bei jedem Buchstaben wiederholen oder?

    also für B, C, D....?



  • Vom Prinzip her schon. Du kannst ja auch ein 2D Array basteln. Wenn du unbedingt bei deinen Buchstaben bleiben willst wäre sowas wie eine map (hier std::map<std::string,std::vector<double> >) schön.



  • hey hab es jetzt mal so gemacht wie die es gemacht hast... geht sehr gut!

    Jetzt versuch ich gerade aber die ausgabe der einzelnen werte in eine andere form.

    if(Edit3->Text == "A1")
             {      Form4->Edit1->Text = IntToStr(VerA[0]);
                    Form4->Edit2->Text = IntToStr(SigA[0]);
                    Form4->Edit3->Text = IntToStr(VerA[0]+SigA[0]);
             }
    

    wie kann ich das jetzt optimieren um nicht immer eine if abfrage für jedes ding zu machen?



  • So genau kann ich dir das jetzt nicht sagen, da ich deine Form nicht kenne.
    Vom Prinzip her sollte es aber helfen auch die Edit-Felder nachträglich in ein Array zu packen. z. Bsp. ein std::vector<TEdit*>



  • hallo,

    also ich bin jetzt nicht wirklich weiter gekommen über das wochenende...

    wie könnte ich das ganze einfach lösen?

    das mit dem array hat mich eher nur verwirrt... 😕



  • Was hat dich da verwirrt? Was willst du jetzt eigentlich genau?
    Kannst du die Aussage

    wie kann ich das jetzt optimieren um nicht immer eine if abfrage für jedes ding zu machen?

    etwas genauer erklären?

    Nur mal als Beispiel wie man ein Array mit TEdits erzeugt und anwendet:

    // vector für die Edits
    std::vector<TEdit*> editVect;
    
    // den vector jetzt im Konstruktor der Form befüllen.
    editVect.push_back(Form4->Edit1);
    editVect.push_back(Form4->Edit2);
    editVect.push_back(Form4->Edit3);
    // etc.
    // Zugriff auf ein Edit dann so
    editVect[0]->Text = "Ich bin Edit1 in Form4";
    

    Das nur damit du weißt was ich meinte.
    Ich würde dir vorschlagen dich etwas gründlicher mit den C++ Grundlagen zu befassen. Am Besten mit einem Buch. Siehe auch
    http://www.c-plusplus.net/forum/112134



  • also ich möchte für mehrere arrays eine ausgabe schreiben...
    welche variable ausgegeben werden soll, wird über ein edit feld eingelesen.

    bsp. Edit1 = A5

    nun soll aus dem Array Ver[20]; der 4.Wert ausgelesen werden.
    soweit kein problem.

    nur sollte es auch klappen wenn ich in Edit1 = A17 stehen habe.
    also sollte die ausgabe variabel gehalten werden, sodass ich nicht für alle 21 einträge in den 6 arrays eine einzelne abfrage gestalten muss.

    ich hoffe es dir etwas deutlicher gemacht zu haben was ich erreichen möchte! 🙂

    danke!!



  • So etwas könnte man wahrscheinlich mittels einer map lösen. Ich denke aber das übersteigt deine derzeitigen Kenntnisse und du solltest deinen eigenen Code doch auch verstehen.
    Am besten ist es wohl, du bleibst bei den Abfragen und lernst weiter C++.



  • naja richtig ist das schon das ich mein code auch verstehen soll!
    nur ha ich eigentlich wenig lust/zeit 200 abfragen zu machen...was auch ziemlich doof aussieht!

    gibt es eine andere möglichkeit als eine map zu erstellen?

    bzw wie sieht den die grunddstrucktur einer map aus?

    danke..



  • if(Edit3->Text == "A1")                                                 //Nutzquerschnitt berechnen mit Füllkoeffizient und Raumreserve und auf 2 Kommastellen kürzen
             {      Form4->Edit1->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * VerA[0], ffFixed, 10, 2);
                    Form4->Edit2->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * SigA[0], ffFixed, 10, 2);
                    Form4->Edit5->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * BusA[0], ffFixed, 10, 2);
                    Form4->Edit3->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * (VerA[0]+SigA[0]+BusA[0]), ffFixed, 10, 2);
             }
    
            if(Edit3->Text == "A2")                                                 //Nutzquerschnitt berechnen mit Füllkoeffizient und Raumreserve und auf 2 Kommastellen kürzen
             {      Form4->Edit1->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * VerA[1], ffFixed, 10, 2);
                    Form4->Edit2->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * SigA[1], ffFixed, 10, 2);
                    Form4->Edit5->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * BusA[1], ffFixed, 10, 2);
                    Form4->Edit3->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * (VerA[1]+SigA[1]+BusA[1]), ffFixed, 10, 2);
             }
    
             if(Edit3->Text == "A3")                                                 //Nutzquerschnitt berechnen mit Füllkoeffizient und Raumreserve und auf 2 Kommastellen kürzen
             {      Form4->Edit1->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * VerA[2], ffFixed, 10, 2);
                    Form4->Edit2->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * SigA[2], ffFixed, 10, 2);
                    Form4->Edit5->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * BusA[2], ffFixed, 10, 2);
                    Form4->Edit3->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * (VerA[2]+SigA[2]+BusA[2]), ffFixed, 10, 2);
             }
    
    .
    .
    .
    .
    .
    
             if(Edit3->Text == "A21")                                                 //Nutzquerschnitt berechnen mit Füllkoeffizient und Raumreserve und auf 2 Kommastellen kürzen
             {      Form4->Edit1->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * VerA[20], ffFixed, 10, 2);
                    Form4->Edit2->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * SigA[20], ffFixed, 10, 2);
                    Form4->Edit5->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * BusA[20], ffFixed, 10, 2);
                    Form4->Edit3->Text = FloatToStrF(StrToFloat(Edit6->Text)*(100 + StrToFloat(Edit7->Text)) / 100 * (VerA[20]+SigA[20]+BusA[20]), ffFixed, 10, 2);
             }
    

    also...
    hier hast du mal als bsp die abfrage wie sie komplett ausgeschrieben ist.
    das ganze noch ca 280mal...

    ich hätte das ganze jetzt gern abgekürzt in einer for-schleife o.ä.

    gibt es außer dieser map eine andere lösung?
    denn so ist es definitiv zu lange...

    danke schonmal!



  • Ok. Da fällt mir z. Bsp. sowas ein.

    std::map<AnsiString, int> indexMap;
    // index map füllen
    indexMap["A1"] = 0;
    indexMap["A2"] = 1;
    indexMap["A3"] = 2;
    // ....
    indexMap["A21"] = 20;
    // dann weiter
    int index = indexMap[Edit3->Text]; // index für Inhalt holen
    // ausgeben
    // Hilfsvariablen erzeugen
    double e6 = StrToFloat(Edit6->Text);
    double e7 = StrToFloat(Edit7->Text);
    double res = e6 * (100 + e7) / 100;
    Form4->Edit1->Text = FloatToStrF(res * VerA[index ], ffFixed, 10, 2);
    Form4->Edit2->Text = FloatToStrF(res * SigA[index ], ffFixed, 10, 2);
    Form4->Edit5->Text = FloatToStrF(res * BusA[index ], ffFixed, 10, 2);
    Form4->Edit3->Text = FloatToStrF(res * (VerA[0]+SigA[0]+BusA[0]), ffFixed, 10, 2);
    


  • perfekt...genau sowas hab ich gesucht 😉

    dankeschön!!funktioniert einwandfrei! :p


Anmelden zum Antworten