Wert einschränken



  • schau dir mal das ereignis "OnSetEditText" vom stinggrid an
    da kannst du auf benutzereingaben in einer zelle reagieren



  • Der Benutzer gibt aber in der Zelle nichts ein, sondern das berechnet sich ja. Ich muß also wenn das Ergebnis über 10 Stunden beträgt, dem irgendwie klar machen, dass er das ganze neu berechnen muß!!



  • //Nichtzuwendungsf. Stunden
        int nichtzuwend_h = (Edit5->Text.ToIntDef(0))- (Edit4->Text.ToIntDef(0)); //Gesamtstunden - zuwendungsf. Stunden
    
        //Tage zählen
        int tage1 = 0;
        for(int i=0; i<StringGrid1->ColCount-1; ++i)
        {
          AnsiString Feld = StringGrid1->Cells[i+1][3];
           if( Feld != "XXX" )  ++tage1;
        }
    
        //Stunden auf Tage verteilen
        int *verteilung1 = new int[tage1];
        for(int i=0; i<tage1; ++i)
        {
            verteilung1[i] = 0;
        }
        for(int i=0; i<nichtzuwend_h; ++i)
        {
            ++verteilung1[random(tage1)];
        }
    
        //Verteilte Stunden im StringGrid ablegen
        int tag1 = 0;
        for(int i=0; i<StringGrid1->ColCount-1; ++i)
        {
          AnsiString Feld = StringGrid1->Cells[i+1][3];
          if( Feld == "XXX" ) continue;
          StringGrid1->Cells[i+1][3] = verteilung1[tag1++];
        }
        delete[] verteilung1;
    

    Bereits hier müßte ich StringGrid1->Cells[i+1][3] auf kleiner als 10 Stunden bestimmen. Wie kann ich das machen? Muß doch irgendwie mit der Verteilungsfunktion zusammenhängen!?



  • Hallo,

    du gibst dir doch schon selbst die Antwort mit

    Bereits hier müßte ich StringGrid1->Cells[i+1][3] auf kleiner als 10 Stunden bestimmen. Wie kann ich das machen? Muß doch irgendwie mit der Verteilungsfunktion zusammenhängen!?

    und mit "if(.....)" Sachen hast du dich doch auch schon rumgequält.

    mfg
    VergissEs



  • Das funktioniert nicht so richtig. Ich müßte der Funktion irgendwie sagen, dass es bereits bei der Verteilung keine Zahlen größer als 10 nimmt, aber wie mache ich das, hab mein Programm nun nochmal etwas umgeschrieben:

    //Gesamtstunden verteilen
        int gesamth= Edit5->Text.ToIntDef(0);
        int tage1=0;
        for (int i=0; i<StringGrid1->ColCount-1;i++)
        {
            AnsiString Feld = StringGrid1->Cells[i+1][6];
            if(Feld!="XXX") ++tage1;
        }
    
        int *verteilung1 = new int[tage1];
        for (int i=0; i<tage1; i++)
        {
            verteilung[i]=0;
        }
        for(int i=0; i<gesamth; i++)
        {
            ++verteilung1[random(tage1)];
        }
    
        int tag1 = 0;
        for(int i=0; i<StringGrid1->ColCount-1; i++)
        {
            AnsiString Feld = StringGrid1->Cells[i+1][6];
            if(Feld=="XXX") continue;
            if(Feld<=10)
             StringGrid1->Cells[i+1][6] = verteilung1[tag1++];
        }
    

    Diese Gesamtstunden dürfen nicht größer als 10 sein und das müßte ich bei Verteilung irgendwie festlegen!! Aber wie???



  • for(int i=0; i<gesamth; i++) 
    {
        int zufallstag;
        do {
            zufallstag = random(tage1);
        } while(verteilung1[zufallstag] >= 10);
    
        ++verteilung1[zufallstag]; 
    }
    

    Das führt allerdings zu einer Endlosschleife, wenn mehr als (Tage * 10) Stunden zu verteilen sind.



  • Und da liegt das Problem!!! Aber war schonmal ein guter Ansatz, danke!!! Nur wenn jemand 300 Stunden eingibt ist er in der Endlosschleife und das darf nicht sein. Wäre über jede weitere Hilfe dankbar!



  • Danke für deine Lösung, mir ist aufgefallen das man ja wenn man jeden Tag nur 10 Stunden arbeiten kann, gar nicht mehr als tage1*10 Stunden arbeiten kann. Das ist ja Quatsch, also bringe ich da jetzt eine Fehlermeldung und setze die Anzahl zurück. So siehts jetzt aus:

    for(int i=0; i<gesamth; i++)
        {
            if(gesamth>tage1*10)
            {
                 if((Application->MessageBox("Ihre Gesamtstundenanzahl ist zu hoch,sie wird auf die Anzahl zurückgesetzt, wenn sie an jedem Tag genau 10 Stunden arbeiten!","Fehlermeldung",MB_OK))== IDOK)
                 {
                    gesamth=tage1*10;
                    Edit3->Text=gesamth;
                 }
            }
            int zufallstag;
            do
            {
                zufallstag = random(tage1);
            } while(verteilung1[zufallstag] >= 10);
    
            ++verteilung1[zufallstag];
        }
    

    Danke Dir!!



  • Du solltest das vor der for-Schleife machen.



  • Habs jetzt davor geschrieben. Danke für deine Hilfe!!


Anmelden zum Antworten