Kalender mit Termineintrag



  • Problem gelöst! Hier der Code falls andere auch benutzen möchten:

    // AnsiString-Array zum Ablegen von 5 Terminen
    	AnsiString str[5];
    
    	// Variablen fuer bold days
    	int d1, d2, d3, d4, d5;
    
    	// fuer Zelle 1
    	if ( StringGrid1->Cells[0][1].Length() > 1) {
    	TStringList* dlist = new TStringList;
    	dlist->Add(StringGrid1->Cells[0][1]);
    	int Pos1 = dlist->Text.Pos("")+1;
    	int Pos2 = dlist->Text.Pos(".");
    	str[0] = dlist->Text.SubString(Pos1,Pos2-Pos1);
    	}
    
    	// fuer Zelle 2
    	if ( StringGrid1->Cells[0][2].Length() > 1) {
    	TStringList* dlist2 = new TStringList;
    	dlist2->Add(StringGrid1->Cells[0][2]);
    	int Pos1_2 = dlist2->Text.Pos("")+1;
    	int Pos2_2 = dlist2->Text.Pos(".");
    	str[1] = dlist2->Text.SubString(Pos1_2,Pos2_2-Pos1_2);
    	}
    
    	// fuer Zelle 3
    	if ( StringGrid1->Cells[0][3].Length() > 1) {
    	TStringList* dlist3 = new TStringList;
    	dlist3->Add(StringGrid1->Cells[0][3]);
    	int Pos1_3 = dlist3->Text.Pos("")+1;
    	int Pos2_3 = dlist3->Text.Pos(".");
    	str[2] = dlist3->Text.SubString(Pos1_3,Pos2_3-Pos1_3);
    	}
    
    	// fuer Zelle 4
    	if ( StringGrid1->Cells[0][4].Length() > 1) {
    	TStringList* dlist4 = new TStringList;
    	dlist4->Add(StringGrid1->Cells[0][4]);
    	int Pos1_4 = dlist4->Text.Pos("")+1;
    	int Pos2_4 = dlist4->Text.Pos(".");
    	str[3] = dlist4->Text.SubString(Pos1_4,Pos2_4-Pos1_4);
    	}
    
    	// fuer Zelle 5
    	if ( StringGrid1->Cells[0][5].Length() > 1) {
    	TStringList* dlist5 = new TStringList;
    	dlist5->Add(StringGrid1->Cells[0][5]);
    	int Pos1_5 = dlist5->Text.Pos("")+1;
    	int Pos2_5 = dlist5->Text.Pos(".");
    	str[4] = dlist5->Text.SubString(Pos1_5,Pos2_5-Pos1_5);
    	}
    
    	// falls Zelle belegt, in Int umwandeln
    	if ( StringGrid1->Cells[0][1].Length() > 1) {
    	d1 = str[0].ToInt();
    	} else d1 = 0;
    	if ( StringGrid1->Cells[0][2].Length() > 1) {
    	d2 = str[1].ToInt();
    	} else d2 = 0;
    	if ( StringGrid1->Cells[0][3].Length() > 1) {
    	d3 = str[2].ToInt();
    	} else d3 = 0;
    	if ( StringGrid1->Cells[0][4].Length() > 1) {
    	d4 = str[3].ToInt();
    	} else d4 = 0;
    	if ( StringGrid1->Cells[0][5].Length() > 1) {
    	d5 = str[4].ToInt();
    	} else d5 = 0;
    
    	// Im Kalender Termine fett darstellen
    	unsigned bolddays[5] = {d1,d2,d3,d4,d5};
    	unsigned Buffer = MonthBoldInfo;
    	MonthCalendar1->BoldDays(bolddays,4,Buffer);
    	MonthBoldInfo = Buffer;
    }
    

    und am besten Datum folgendermaßen formatieren :

    // ausgewaehltes Datum in die Zelle schreiben
    StringGrid1->Cells[StringGrid1->Col][StringGrid1->Row] =
    MonthCalendar1->Date.FormatString("d.mm.yyyy");
    

    Herzlichen Dank an alle, die mir dabei geholfen haben!



  • Hi,

    lösche wenigstens deine vielen TStringList an Ende der Routine.

    mfg
    kpeter



  • oder packe sie in auto_ptr.



  • kpeter schrieb:

    Hi,

    lösche wenigstens deine vielen TStringList an Ende der Routine.

    mfg
    kpeter

    ach das hab ich ja total vergessen, danke kpeter



  • Ich hätte da noch einen Tipp:

    Ich würde für die Integer einen Array nehmen.
    Und dann alles schön in eine For-Schleife packen.

    Dann würde dein Sourcecode 5 mal kleiner und 1000 mal variabler sein.
    Zudem müssen dann Änderungen nur noch an einem Ort durchgeführt werden und nicht x mal.



  • Krielon schrieb:

    Ich hätte da noch einen Tipp:

    Ich würde für die Integer einen Array nehmen.
    Und dann alles schön in eine For-Schleife packen.

    Dann würde dein Sourcecode 5 mal kleiner und 1000 mal variabler sein.
    Zudem müssen dann Änderungen nur noch an einem Ort durchgeführt werden und nicht x mal.

    Mit der for-Schleife habe ich es schon ausprobiert. Da werden aber Tage im Kalender fett markiert, die gar nicht angeklickt wurden.

    Am effektivsten müsste schon Variante sein, die ich gewählt habe



  • kenux schrieb:

    Da werden aber Tage im Kalender fett markiert, die gar nicht angeklickt wurden.

    Hi,

    so richtig dahintergekommen bist du noch nicht ;).

    Das Ereignis *GetMonthInfo(TObject Sender, DWORD Month, DWORD &MonthBoldInfo)
    wird mehrmals hintereinander aufgerufen.
    Je nachdem, wieviel Monate angezeigt werden, werden auch benachbarte nichtsichtbare Monate (aufsteigend) abgefragt.
    Dabei schickt die Komponente immer in Month den Monat als DWORD mit.

    Zur Veranschaulichung ein Beispiel:

    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
       strList = new TStringList;
       strList->Sorted = false;
       strList->Add("07.06.2009");
       strList->Add("12.06.2009");
       strList->Add("22.06.2009");
       strList->Add("23.06.2009");
       strList->Add("29.06.2009");
       strList->Add("07.07.2009");
       strList->Add("08.07.2009");
       strList->Add("09.07.2009");
       strList->Add("10.07.2009");
       strList->Add("07.08.2009");
       // beliebig ergänzen bzw.
       // gehören hier die Werte aus deinem StringGrid rein
       Memo1->Text = strList->Text;
    }
    //---------------------------------------------------------------------------
    
    __fastcall TForm1::~TForm1(void)
    {
       delete strList;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::MonthCalendar1GetMonthInfo(TObject *Sender, DWORD Month, DWORD &MonthBoldInfo)
    {
       if (Form1) ShowMessage("aktualisiere Monat : " + IntToStr((__int64)Month));  
    
       int tage = 0;
       unsigned bolddays[31];
       memset(bolddays, 0, sizeof(bolddays));
       for (int i = 0; i < strList->Count; i++) {
          TDateTime dt = strList->Strings[i];
          WORD yr    = YearOf(dt);
          WORD mt    = MonthOf(dt);
          WORD day   = DayOf(dt);
    
          if (mt == Month) {
             bolddays[tage] = day;
             tage++;
          }
       }
       unsigned int Buffer = MonthBoldInfo;
       MonthCalendar1->BoldDays(bolddays, 30, Buffer);
       MonthBoldInfo = Buffer;
    }
    //---------------------------------------------------------------------------
    

    mfg
    kpeter



  • @kpeter

    Sind YearOf, MonthOf und DayOf selbstgeschriebene Funktionen?
    Wenn ja, kannst du sie mal hier reinschreiben bitte?



  • kenux schrieb:

    Sind YearOf, MonthOf und DayOf selbstgeschriebene Funktionen?

    Nö, die sind in der DateUtils.hpp deklariert. Musst du einbinden.
    Kennst du die sagenumwobene Mächtigkeit der Funktionstaste 1 ? 😃

    mfg
    kpeter



  • kpeter schrieb:

    Kennst du die sagenumwobene Mächtigkeit der Funktionstaste 1 ? 😃

    Eine indirekte Anspielung darauf, dass ich zu faul bin?? 🙂
    Bin ich aber bestimmt nicht; ich finde die Hilfe nicht so toll, weil man nicht so richtig schlau daraus wird. Bei euch Profis ist das sicherlich anders, da ich euch mit dem Programm schon richtig gut auskennt.
    Zur Hilfe nehme ich meistens immer das Buch CppBuilder 2007 von Kaiser, (Übrigens wer es will, dem kann ich das Ebook zur Verfügung stellen), und wenn mir da nicht geholfen wird, such ich meistens hier um Rat



  • War nicht so gemeint, faul sind andere. 😉
    Profi bin ich lang nicht.

    mfg
    kpeter


Anmelden zum Antworten