StringGrid markierte Zellen



  • Wie bekomme ich heraus wieviele Zellen in meinem StringGrid mit Kreuzen ausgefüllt sind, wenn ich diese Kreuze vorher eingefügt habe?



  • ich möchte ausrechnen wieviele Tage in meinem Monat zu arbeiten sind, also von meiner Gesamtanzahl an Tagen, die Tage abziehen, wie Sa/So und Krank bzw. Urlaub.

    for(int i=0; i<31; i++)
        {
            Edit1->Text= (StringGrid1->ColCount-1)-(StringGrid1->Cells[i+1][6]=="XXX");
        }
    

    In meinem StringGrid1->Cells[i+1][6]=="XXX" stehen die Tage, die also abgezogen werden müssen (Sa/So/Krank/Urlaub)

    Doch das funktioniert nicht so richtig, also er zeigt mir immer nur die Gesamtanzahl der Tage an. was mache ich falsch?????



  • du mußt doch die anzahl der felder die ein XXX haben in einer variable hochzählen
    bei deiner möglichkeit wird max. ein XXX-Feld abgezogen, da du dein Edit-Feld jedesmal neu überschreibst

    hier ein Vorschlag:

    int Anzahl = 31;
    
    for(int i=0; i<31; i++)
     Anzahl -= StringGrid1->Cells[i+1][6] == "XXX";
    
    Edit1->Text = IntToStr(Anzahl);
    


  • Irgendwie funktioniert das nicht ganz so wie es sollte. Er zeigt mir jetzt plötzlich mehr Tage an als wie der Monat überhaupt hat!!!



  • Ich müßte doch irgendwie nur die markierten Zellen auszählen und dann von den Gesamtzellen abziehen oder?? Doch wie könnte ich das am dümmsten anstellen???



  • Über alle Zeilen und Spalten iterieren und den Zelleninhalt abfragen!?
    Aber warum merkst du dir die Anzahl nicht einfach beim Setzen der "XXX"?



  • hä???

    Das mit dem setzen macht er ja teilweise automatisch, bei Sa/So laß ich gleich beim erstellen des Kalenders die Kreuze setzen.



  • wenn du auf "XXX" abtestest, dann muss auch wirklich ein "XXX" in der Zelle stehen (auch auf groß und kleinschreibung achten sowie leerzeichen vor oder hinter dem XXX)
    besser wäre diese variante:

    Anzahl -= StringGrid1->Cells[i+1][6].LowerCase().Pos("xxx") >0;
    

    da ist es egal wie das XXX geschrieben ist und wo es steht.

    und da wo ich anzahl mit 31 initialisiert hab, muß natürlich die anzahl der Tagte in dem aktuellen Monat stehen.

    P.S. ist es wirklich zeile 7 die du abtesten willst?
    bei Cells wird mit der Zählung immer bei 0 begonnen



  • Also ich hab das jetzt so

    //Monatsstunden bei 8 Stundentag berechnen
        int Anzahl=StringGrid1->ColCount-1;
        for(int i=0; i<StringGrid1->ColCount-1; i++)
            Anzahl -= StringGrid1->Cells[i+1][6].LowerCase().Pos("XXX") >0;
    
        Edit1->Text = IntToStr(Anzahl);
    

    Bei StringGrid1->ColCount-1 stehen meine aktuellen Tage des Monats, aber er zeigt mir bei Edit1 immernoch die Gesamtanzahl der Tage an, ohne etwas abzuziehen!!!



  • Sonnenschein84 schrieb:

    bei Sa/So laß ich gleich beim erstellen des Kalenders die Kreuze setzen.

    Was hindert dich daran, da mitzuzählen?



  • Das ich nicht weiß wie das geht!!!!



  • hast du mein P.S. bei meinem letzten Beitrag gelesen?



  • Ja ich möchte Zeile 7 ablesen, weil da meine Gesamtstundenanzahl steht und da immer ein Kreuz reingesetzt wird sobald SA/SO ist oder jemand krank bzw. Urlaub angekreuzt hat.



  • du hast ja immer noch drei großgeschriebene XXX in deinem Code
    schreib di mal klein (xxx)



  • Stimmt aber trotzdem noch nicht bei allen Monaten überein!!!Irgendwie läßt er immer was weg, wenn SA/SO ganz am Anfang des Monats liegen bzw. am Ende!!



  • Könnte man nicht auch eine extra Funktion schreiben, die erstens aus dem ShowCalendar() die Tage übernimmt und die Felder wo bei SA/SO schon XXX sind und zweitens die Werte übernimmt die noch hinzukommen während der Laufzeit wenn man ein XXX bei Krank/Urlaub setzt???



  • Ich hab das mal mit einer extra Funktion versucht, allerdings kommt bei mir da jetzt wieder ein Fehler:

    void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int Col,
          int Row, bool &CanSelect)
    {
        if(StringGrid1->Cells[Col][Row]!="XXX")
        {
            if(Row!=6)       //in Gesamtstunden (reihe 6) darf nichts geschrieben werden
            {
                 StringGrid1->Cells[Col][Row]="XXX";
            }
    
            if(Row==4)      //bei Urlaub werden alle anderen Reihen (außer Krank) automatisch gefüllt
            {
                StringGrid1->Cells[Col][2]="XXX";
                StringGrid1->Cells[Col][3]="XXX";
                StringGrid1->Cells[Col][6]="XXX";
            }
            if(Row==5)   //bei Krank werden alle anderen Reihen (außer Urlaub) automatisch gefüllt)
            {
                StringGrid1->Cells[Col][2]="XXX";
                StringGrid1->Cells[Col][3]="XXX";
                StringGrid1->Cells[Col][6]="XXX";
           }
        }
        else
        {
            StringGrid1->Cells[Col][Row]="";
        }
    
        for(int i=0; i<31; i++)
        Monatsstunden(DaysInMonth(Year,Month),StringGrid1->Cells[i+1][6]);
    }
    
    void __fastcall TForm1::ShowCalendar(int Year, int Month)
    {
        for(int i=0; i<31; i++)
           for(int j=0; j<2; j++)
            StringGrid1->Cells[i+1][j] = "";
        int FirstDayOfMonth = (DayOfWeek(EncodeDate(Year, Month, 1)) - 1) % 7;
        for(int i=0; i<DaysInMonth(Year, Month); i++)
        {
            StringGrid1->Cells[i+1][1] = ShortDayNames[(FirstDayOfMonth + i) % 7];
            StringGrid1->Cells[i+1][0] = IntToStr(i+1);
        }
    
        StringGrid1->ColCount=(DaysInMonth(Year,Month))+1; //Anzahl d. Spalten nach Monatstagen setzen
        for(int i=0; i<31; i++)
        Monatsstunden(DaysInMonth(Year,Month),StringGrid1->Cells[i+1][6]);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Monatsstunden(int tage, AnsiString kreuze )
    {
        //Monatsstunden bei 8 Stundentag
        int Anzahl=StringGrid1->ColCount-1;
        for(int i=0; i<StringGrid1->ColCount-1; i++)
            Anzahl -= StringGrid1->Cells[i+1][6].LowerCase().Pos("xxx") >0;
    
        Edit1->Text = IntToStr(Anzahl);
    }
    

    Da kommt ein Fehler bei void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int Col,
    int Row, bool &CanSelect), dass Year und Month nicht definiert sind. Woran liegt das denn??Kann mir dabei jemand helfen und mir sagen ob ich das überhaupt so machen kann wie ich mir das jetzt vorstelle???



  • du mußt die DaysInMonth-Funktion über die StringGrid1SelectCell-Methode schreiben



  • das versteh ich jetzt nicht, ich will doch auch in der Funktion die Tage dann ausrechnen, wenn jemand während der Laufzeit die Tage krank / Urlaub markiert!!! Oder hab ich jetzt was falsch verstanden????



  • jup, du verstehst da was falsch

    du sollst einfach die DaysInMonth-Funktion aus deinem quelltext rauskopieren und über der StringGrid1SelectCell-Methode wieder einfügen

    da du die DaysInMonth-Funktion innerhalb der StringGrid1SelectCell-Methode verwendest, mußt du sie logischerweise vor der StringGrid1SelectCell-Methode deklarieren.


Anmelden zum Antworten