Monthcalendar problem mit bolddays - FAQ = nix gefunden



  • hallo,

    bitte erst lesen, nicht auf faq verweisen:

    ich habe ein problem festgestellt mit dem Kalender vom BCB. ich habe mir ostern errechnet (wichtig wegen wanderndem datum) und auch mit bolddays anzeigen lassen, funkt prima, wenn man es macht. jedoch habe ich bemerkt, dass er irgendein notwendiges event nicht mehr aufruft, wenn man direkt oben die jahres zahl ändert. er rechnet zwar ostern und so richtig aus, allerdings zeichnet er für das neu ausgewählte jahr nicht die bolddays sofort neu, sondern erst, wenn sich der monat ändert. wer kann helfen?

    zum nachvollziehen:

    Unit1.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    #include <math.h>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    	TMonthCalendar *MonthCalendar1;
    	TListBox *ListBox1;
    	void __fastcall MonthCalendar1GetMonthInfo(TObject *Sender, DWORD Month,
              DWORD &MonthBoldInfo);
    	void __fastcall MonthCalendar1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
    	__fastcall TForm1(TComponent* Owner);
        TDate __fastcall Ostern(int Year);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    TDate __fastcall TForm1::Ostern(int Year)
    {
    	int a, b, c, d, e, f, g, h, i, k, l, m, n, p;
    
      	a = Year % 19;
      	b = Year / 100;
      	c = Year % 100;
    
      	d = b / 4;
      	e = b % 4;
    
      	f = (b + 8) / 25;
    
      	g = (b - f + 1) / 3;
    
      	h = (19 * a + b - d - g + 15) % 30;
    
      	i = c / 4;
      	k = c % 4;
    
      	l = (32 + 2 * e + 2 * i - h - k) % 7;
    
      	m = (a + 11 * h + 22 * l) / 451;
    
      	n = (h + l - 7 * m + 114) / 31;
      	p = (h + l - 7 * m + 114) % 31;
    
      	/*
        Jetzt enthält n die Monatsnummer
      	(also 3 = März bzw. 4 = April),
      	und (p + 1) gibt den Tag an,
      	auf den in diesem Monat
      	das Osterdatum fällt.
      	*/
    
      return EncodeDate(Year, n, p + 1);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::MonthCalendar1GetMonthInfo(TObject *Sender,
          DWORD Month, DWORD &MonthBoldInfo)
    {
    	// Feiertagsberechnung pro Monat hier hin
        TDate my;
    	unsigned short y,m,d;
        unsigned long day;
        unsigned int month;
    
        MonthCalendar1->Date.DecodeDate(&y,&m,&d);
        my = Ostern(y);
    
        my.DecodeDate(&y,&m,&d);
        day = d;
        month = m;
    
      	MonthBoldInfo = 0;
        ListBox1->Clear();
    	ListBox1->Items->Add(DateToStr(my) + " - Ostern");
        if(Month == month)
        {
        	MonthBoldInfo += pow(2 , day-1); // Ostersonntag
        	MonthBoldInfo += pow(2 , day-3); // Karfreitag
          	MonthBoldInfo += pow(2 , day);   // Ostermontag
        }
        my = my + 39;
        my.DecodeDate(&y,&m,&d);
        day = d;
        month = m;
    
        if(Month == month)
        {
        	MonthBoldInfo += pow(2 , day-1); // Himmelfahrt
        }
    
        my = my + 10;
        my.DecodeDate(&y,&m,&d);
        day = d;
        month = m;
    
        if(Month == month)
        {
        	MonthBoldInfo += pow(2 , day-1); // Pfingstsonntag
            MonthBoldInfo += pow(2 , day); // Pfingstmontag
        }
    
        if(Month == 12)
        {
        	MonthBoldInfo += pow(2 , 24); // Weihnachten 1
            MonthBoldInfo += pow(2 , 25); // Weihnachten 2
        }
        if(Month == 10)
        {
    	   	MonthBoldInfo += pow(2 , 2);  // Tag der deutschen Einheit
        }
        if(Month == 1)
        {
           	MonthBoldInfo += pow(2 , 0);  // Neujahr
    		MonthBoldInfo += pow(2 , 5);  // Hlg. 3 Könige
        }
        if(Month == 5)
        {
        	MonthBoldInfo += pow(2 , 0);  // Tag der Arbeit
        }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::MonthCalendar1Click(TObject *Sender)
    {
    	MonthCalendar1->Update();	
    }
    //---------------------------------------------------------------------------
    

    gruß gerd



  • Und die Hinweise aus diesem FAQ-Beitrag helfen tatsächlich nicht?



  • ich werde es nochmals damit versuchen, jedoch reagiert er nicht bevor nicht ein Monatswechsel stattfindet. erst danach wird der monat aktualisiert, und die feiertage für z.b. 2007 korrigiert.

    gruß gerd



  • also, mein ergebnis ist nicht befriedigend. er aktuelisiert das datum immer ein jahr zu spät.

    irgendwelche ideen?

    gruß gerds

    hier mal der neue code:

    Unit1.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    #include <math.h>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    	TMonthCalendar *MonthCalendar1;
    	TListBox *ListBox1;
    	void __fastcall MonthCalendar1GetMonthInfo(TObject *Sender, DWORD Month,
              DWORD &MonthBoldInfo);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
    	__fastcall TForm1(TComponent* Owner);
        TDate __fastcall Ostern(int Year);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    TDate __fastcall TForm1::Ostern(int Year)
    {
    	int a, b, c, d, e, f, g, h, i, k, l, m, n, p;
    
      	a = Year % 19;
      	b = Year / 100;
      	c = Year % 100;
    
      	d = b / 4;
      	e = b % 4;
    
      	f = (b + 8) / 25;
    
      	g = (b - f + 1) / 3;
    
      	h = (19 * a + b - d - g + 15) % 30;
    
      	i = c / 4;
      	k = c % 4;
    
      	l = (32 + 2 * e + 2 * i - h - k) % 7;
    
      	m = (a + 11 * h + 22 * l) / 451;
    
      	n = (h + l - 7 * m + 114) / 31;
      	p = (h + l - 7 * m + 114) % 31;
    
      	/*
        Jetzt enthält n die Monatsnummer
      	(also 3 = März bzw. 4 = April),
      	und (p + 1) gibt den Tag an,
      	auf den in diesem Monat
      	das Osterdatum fällt.
      	*/
    
      return EncodeDate(Year, n, p + 1);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::MonthCalendar1GetMonthInfo(TObject *Sender,
          DWORD Month, DWORD &MonthBoldInfo)
    {
    	TCommonCalendar *Calendar = dynamic_cast <TCommonCalendar *> (Sender); 
        unsigned short y,m,d;
    	TDate my;
    	MonthCalendar1->Date.DecodeDate(&y,&m,&d);
    	my=Ostern(y);
        my.DecodeDate(&y,&m,&d);
    	unsigned bdays[11] = {d};
    	MonthBoldInfo = 0;
    	Calendar->BoldDays(bdays, sizeof(bdays)/sizeof(bdays[0]), (unsigned)MonthBoldInfo);
    }
    


  • gibt es vielleicht irgend eine möglichkeit den klick auf den jahresbereich abzufangen und nicht durch zu führen? sodass der klick vorher abgewickelt wird, und die komponente nicht das jahreszahlfenster öffnet?

    oder gibt es eventuell die möglichkeit auf der canvas des tmonthcalendars zu zeichnen? das wäre noch besser! 🙂

    gruß gerd


Anmelden zum Antworten