StringGrid markierte Zellen
-
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.
-
Das hab ich jetzt noch nicht so ganz verstanden, kannst du mir das irgendwie mal an dem Stück Code zeigen?
-
Die Funktion ist aber doch in meiner Headerdatei deklariert!!!
-
ups, ich seh grad, dass ich einen ganz schönen schrott geschrieben hab
der kennt Year und Month nicht, und ich dachte er kennt die DaysInMonth-Funktion nicht.
sorrydeklarier einfach zwei globale variablen Year und Month und setzt deren inhalt wenn das jahr oder der monat geändert wird (du hast ja schon die beiden ereignisse abgefangen)
dann kennt er auch die beiden variablen
hier nochmal zu veranschauung:int Year, Month; . . . void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int Col, int Row, bool &CanSelect) { ... } void __fastcall TForm1::ComboBoxChange(TObject *Sender) { Year = StrToInt(Edit->Text); } void __fastcall TForm1::EditChange(TObject *Sender) { Month = ComboBox->ItemIndex + 1; }
musst halt deine namen von der combobox und dem editfeld einsetzen, da ich nicht weiß, wie sie bei dir heißen
-
Hab das nun anders gelöst. Jetzt habe ich allerdings noch ein Problem:
Ich muß um das auszurechnen immer 2 Mal auf den Monat klicken, was hab ich da noch falsch gemacht????
-
wie soll man dass erraten, was du falsch gemacht hast
du hast nur geschrieben dass du es anders gelöst hast
dass läßt viel raum für spekulationen
zeig mal deinen code, was du bisher gemacht hast (aber nur den teil, der für das problem relevant ist, nich das du hier dein komplettes projekt postest)
-
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int Col, int Row, bool &CanSelect) { int Year=ComboBox1->ItemIndex + 1 ; int Month=StrToInt(Edit6->Text) ; for(int i=0; i<31; i++) Monatsstunden(DaysInMonth(Year,Month),StringGrid1->Cells[i+1][6]); } //--------------------------------------------------------------------------- void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button) { ShowCalendar(StrToInt(Edit6->Text), ComboBox1->ItemIndex + 1); for(int i=0; i<31; i++) { if((StringGrid1->Cells[i+1][1]=="Sa")||(StringGrid1->Cells[i+1][1]=="So")) { StringGrid1->Cells[i+1][2]="XXX"; StringGrid1->Cells[i+1][3]="XXX"; StringGrid1->Cells[i+1][4]="XXX"; StringGrid1->Cells[i+1][5]="XXX"; StringGrid1->Cells[i+1][6]="XXX"; } // schließt den ganzen Samstag und Sonntag aus else { StringGrid1->Cells[i+1][2]=""; StringGrid1->Cells[i+1][3]=""; StringGrid1->Cells[i+1][4]=""; StringGrid1->Cells[i+1][5]=""; StringGrid1->Cells[i+1][6]=""; } } } //--------------------------------------------------------------------------- void __fastcall TForm1::ComboBox1Change(TObject *Sender) { ShowCalendar(StrToInt(Edit6->Text), ComboBox1->ItemIndex + 1); for(int i=0; i<31; i++) { if((StringGrid1->Cells[i+1][1]=="Sa")||(StringGrid1->Cells[i+1][1]=="So")) { StringGrid1->Cells[i+1][2]="XXX"; StringGrid1->Cells[i+1][3]="XXX"; StringGrid1->Cells[i+1][4]="XXX"; StringGrid1->Cells[i+1][5]="XXX"; StringGrid1->Cells[i+1][6]="XXX"; } // schließt den ganzen Samstag und Sonntag aus else { StringGrid1->Cells[i+1][2]=""; StringGrid1->Cells[i+1][3]=""; StringGrid1->Cells[i+1][4]=""; StringGrid1->Cells[i+1][5]=""; 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); } //---------------------------------------------------------------------------
Und mein Problem liegt darin, dass wenn ich das Programm starte und auf einen Monat klicke, dann kommt immer erst die Gesamtzahl der Monatstage und beim zweiten Mal auf den selben Monat klicken kommt die richtige Anzahl der Monatsstunden (krank und Sa/So abgezogen)!! Ich habe keine ahnung was da nun falsch ist. Weiß das vielleicht jemand???
Das was du in deinem Beitrag vorhins geschrieben hast, hatte ich derweil selbst herausgefunden und auch so gelöst!!! *fg*