monthCalendar - Problem bei BoldedDates - BUG?



  • Moin zusammen,

    Habe ein monthCalendar Element auf meiner Form und nutze es, um Termine festzulegen. Diese werden in einer TextDatei gespeichert und später in ein DateTime Array eingelesen:

    void kalenderaktualisieren ()
    			{
    			cli::array<DateTime>^ terminarray = gcnew cli::array<DateTime>(100);
    			int durchlauf = 0;
    			try
    				{
    				System::IO::StreamReader^ sr = gcnew System::IO::StreamReader (registryhilfe::regdaten::terminpfad + "termine.txt");
    				registryhilfe::regdaten::temp = sr->ReadLine ();
    				while (registryhilfe::regdaten::temp != "")
    					{
    					int  index1 = registryhilfe::regdaten::temp->IndexOf (".");					
    					String^ tag = registryhilfe::regdaten::temp->Substring (0, 2);	
    					String^ mon = registryhilfe::regdaten::temp->Substring (3, 2);
    					String^ jah = registryhilfe::regdaten::temp->Substring (6, 4);
    
    					String^ std = registryhilfe::regdaten::temp->Substring (11, 2);
    					String^ min = registryhilfe::regdaten::temp->Substring (14, 2);
    					String^ sek = registryhilfe::regdaten::temp->Substring (17, 2);
    
    					DateTime daten = DateTime ( Convert::ToInt32 (jah),Convert::ToInt32 (mon), Convert::ToInt32 (tag), Convert::ToInt32 (std), Convert::ToInt32 (min), Convert::ToInt32 (sek) );
    					registryhilfe::regdaten::temp = sr->ReadLine ();
    					terminarray->SetValue (daten, durchlauf);
    					durchlauf++;
    					}
    				}
    			catch (Exception^ e)
    				{
    				}
    			monthCalendar1->BoldedDates = terminarray;
    
    			monthCalendar1->UpdateBoldedDates ();
    			}
    

    Mein Problem besteht darin, dass die übernommenen Daten nicht wie gewünscht gesondert angezeigt werden - obwohl sie der Kalender ordnungsgemäß übernimmt.

    Habe natürlich ein wenig gegoogelt, und es scheint mal einen BUG gegeben zu haben. Ist das immer noch so?



  • Scherzkecks wie werden sie den in der Ausführung angezeigt und wie möchtes du es anders haben. Dass kann auch einfach an der Struktur deiner Datei liegen wie stehen denn da die Daten drinen?



  • Warum liest du die position von '.' aus wenn du sie dann nicht mal wieder verwedest? Sol das das trenzeichen sein?



  • Da ich nen Anfänger bin, und mir nicht anders zu helfen wusste, habe ich nach einer Lösung gesucht die Termine in einer Textdatei zu speicher. Das ganze sieht dann so aus:

    06.08.2009 00:00:00 > text1
    07.08.2009 00:00:00 > text 2
    14.08.2009 00:00:00 > text 3
    

    Mit dem Index hast du wohl recht, war wohl vom vorigen Versuch übriggeblieben.

    Angezeigt werden sollen die Daten in Fettschrift. Das Array scheint doch in Ordung zu sein, zumindest sehe ich hier keinen Fehler, da die Daten nach übergabe an den Kalendar ja in den BoldedDates Eigenschaften stehen.



  • Du meinst nicht zufälig den Fontstyle des Control monthCalendar?
    Diesen änderst du einfach über die Eigenschaft Font. Klar ist deine Datei muss in reiner ANSI oder Unicode Codierung bleiben. Da kannste nicht wenn du denn Text mit Wordpad Fett formatierst erwarten das ReadLine dass auch so übernimmt. Da werden nur einfache String^ übergeben.

    Ein besseres verfahren Daten aus und ein zu lessen, die fest gespeichert sein müssen ist XML, SQL, oder MySQL. Weil an sich wenn in deiner momentanen Formatierung sich irgendwo nur eine fehlende ziffer hinter einem '.' einschleicht wird es zur Laufzeit zu einem unbehandelten schwerwiegenden Fehler kommen! Weil du mit dem Substring dann ganz hinten auf eine Position zugreifen würdest die schon über der Länge des String^ ist.



  • Also, in meinem Buch steht geschrieben:

    "Welche Tage im Kaldenderblatt fett dargestellt werden, legen Sie fest, indem Sie die gewünschten Tage als DateTime-Arrays an die Eigenschaften BoldedDays, MonthlyBouldedDates und AnnuallyBoldedDates zuweisen.

    this->monthCalendar1->BoldedDates = gcnew array<DateTime>{DateTime(2009,7,7),DateTime(2009,9,7)};
    

    "

    Starte ich das Programm, müssten doch genau diese Tage als BOLD markiert werden - oder nicht.

    Du hast übrigens Recht mit meiner zugegeben etwas stumpfen Methode die Termine zu speichern. Das Problem dass du angesprochen hast, viel mir gestern bereits auf. Nur habe ich mich mit XML und Co. noch gar nicht auseinander gesetzt.

    Noch hinzu kommt das Problem, dass die Daten natürlich möglichst nach Datum sortiert in die Datei geschrieben werden sollten, und beim löschen eines Termines, sollten eigentlich keine Leerzeilen entstehen. All das habe ich wohl nicht bedacht.



  • Also bei mir funktioniert das BoldedDates Wunderbar. Wenn ich das mal so sagen darf ist deine while Schleife ziemlich schlampig und totalt unverständlich durch zu lesen um da deinen Fehler zu finden!

    Zunächst ein mal brauchst du nicht Try um das ende von ReadLine() auf zu fangen, dass kan man einfach mit einer if prüfung machen ob ReadLine() einen wert wiedergibt. Zu dem werden in deiner Schleife alle Variablen des Datentypes String^ jedesmal neu erstellt. Das ist unsinnig! deklariere die Variablen einmal lieber vor der Schleife und weise Sie die Werte in der Schleife zu.

    Genauso warum verwendest du für eine Item zu weisung bei einem Array '->SetValue()' ? Das verwirt blos beim schnellen drüber gehen des Codes. Viel besser ist 'Array[i] ='
    i wehre bei dir durchlauf.

    Übrigens funktioniert es bei mir auch ohne UpdateBoldedDates()

    Mache mal bei

    catch (Exception^ e)
                    {
                    }
    

    this->text = "!"; rein vielleicht trit ja der Exception fal ja immer ein und dann wird natürlich BoldedDates nichts übergeben.



  • Ok ... werde mir das mal zu Herzen nehmen. Muss jetzt allerdings erst mal Arbeiten.

    Deinen Tip bezüglich der Textdatei habe ich schon versucht umzusetzen. Habe die erforderlichen Daten einfach mit <Date> und </Date>, bzw mit <Termin> </Termin> eingefasst. Das ganze ist aber immer noch ne Textdatei ...



  • void kalenderaktualisieren ()
    			{
    			cli::array<DateTime>^ terminarray = gcnew cli::array<DateTime>(50);
    
    			int durchlauf = 0, index1, index2, tag, mon, jah;
    			String^ datumstring, ^temp;
    
    				System::IO::StreamReader^ sr = gcnew System::IO::StreamReader (registryhilfe::regdaten::terminpfad + "termine.xml");
    				temp = sr->ReadLine ();
    
    				while (temp != "")
    					{
    
    						index1			= temp->IndexOf ("<Date>") + 6;
    						index2			= temp->IndexOf ("</Date>");
    						datumstring		= temp->Substring (index1, index2 - index1);
    
    						index1			= datumstring->IndexOf (".",0);					
    						tag				= Convert::ToInt32 (datumstring->Substring (0, index1));
    
    						index1			= datumstring->IndexOf (".") + 1;
    						index2			= datumstring->IndexOf (".", index1 + 1);
    						mon				= Convert::ToInt32 (datumstring->Substring (index1, index2 - index1));
    
    						index1			= datumstring->IndexOf (".",index2) + 1;						
    						jah				= Convert::ToInt32 (datumstring->Substring (index1, 4));
    
    						DateTime daten = DateTime (jah, mon, tag);						
    						terminarray[durchlauf] = daten;
    
    						durchlauf++;
    						temp = sr->ReadLine ();
    
    						if (temp == "") 
    							{
    							sr->Close ();
    							break;
    							}
    					}				
    
    			//monthCalendar1->AnnuallyBoldedDates = terminarray;			
    			monthCalendar1->AnnuallyBoldedDates = gcnew array<DateTime> { DateTime (2009, 8, 8) };  // <-- zum Testen
    			monthCalendar1->UpdateBoldedDates ();
    			}
    

    Wie du siehst habe ich versucht deine Tips umzusetzen. Wenn du es jetzt noch anders machen würdest, wäre ich dankbar - das einmal zu sehen :). Allerdings besteht das Problem immer noch.



  • private: void termineLaden(void) {
    				 String^ ArbeitsOrdner = System::IO::Directory::GetCurrentDirectory();
    				 System::IO::StreamReader ^Reader = gcnew System::IO::StreamReader(ArbeitsOrdner + "\\termine.txt");
    				 int a, i;
    					 if(Reader->EndOfStream == false) {
    						 a = Convert::ToInt16(Reader->ReadLine());
    					 }
    					 array<DateTime> ^Dates = gcnew array<DateTime>(a);
    					 do {
    						 Dates[i] = Convert::ToDateTime(Reader->ReadLine());
    						 i++;
    					 } while(Reader->EndOfStream == false);
    					 Reader->Close();
    					 this->monthCalendar->BoldedDates = Dates;
    			 }
    

    termine.txt schrieb:

    3
    06.08.2009 00:02:00
    07.08.2009 00:00:00
    14.08.2009 00:00:00

    Convert::ToDateTime-Methode (String)

    http://msdn.microsoft.com/de-de/library/xhz1w05e.aspx



  • Sinvoller ist es natürlich die, die do - while schleife zwischen den { - } von der if(Reader->EndOfStream == false
    rein zu schreiben weil wenn ja das int a auslesen folglich nicht ging wird ja auch das array DateTime mit 0 erstellt und es wird crashen.

    Genauso gut kannst du dann unter der if {} eine
    else {
    ...
    }
    einbauen.



  • So sieht das ganze schon viel ruhiger aus - da muss ich dir zustimmen. Habe probeweise eine neue Termin Datei erstellt - welche deiner entspricht. Die Termine werden in das Array übernommen - und auch der MonthCalendar übernimmt sie in der Eigenschaft MonthlyBouldedDays - wie zuvor auch. Nur angezeigt werden Sie nicht.



  • Sag mal, kann das sein das du die Funktion in die Form Header (z.B. Form1.h) geschreiben hast ohne die Dates Funktion aufrufen zu lassen? 😃

    Lol xD

    Zeige mir bitte mal den ganzen Quelcode der Datei in der du die funtkion rein geschreiben hast.



  • Eigentlich befindet sich die Funktion in der Form1.cpp. Aufgerufen wird sie durch den Konstruktor in der Form1.h. Was meinst du mit Dates - Funktion?



  • Also wenn du wirklich ein Problem hast, dann must du schon mit mehr rausrücken, weil du nennt mir ja nicht einmal genau dein Anliegen. Wie soll ich nach einem fehler suchen, wenn ich noch nicht einmal weiß was denn in der Ausgabe Falsch ist? Für mich sieht das nach deiner Ausage so aus als wenn du da ganz anders wo ein fehler hast als in der Funktion die du hier offen gelegt hast.

    Den einzigen tip denn ich dir jetzt noch geben kann ist, Setze eine Zeile weiter unten, wo dem array die Termine zu gewiesen werden einen Roten Stoppoint. Beim debugen wird dann dort gestopt. Schauhe dir dann den Inhalt des Array an und gucke ob dort überhaupt Termine abgelegt wurden.



  • Aber das versuche ich dir doch die ganze Zeit über zu erklären. Das habe ich bereits vor dem erstellen dieses Threads gemacht! siehe Anfang! Die Daten werden wie genwünscht in der Eigenschaft MonthCalendar - BoldetDates übernommen. Habe ich eine Liste mit drei Daten - werden auch genau diese drei in das Bolded Days Array übernommen. Sie werden nur nicht im Kalender markiert.

    Form1.h

    #pragma once
    
    #include "stdafx.h"
    #include "registryhilfe.h"
    #include "registry.h"
    #include "Einstellungen.h"
    #include "internet.h"
    #include "Email.h"
    #include "termine.h"
    
    namespace Kinder {
    
    	ref class internet;	
    	ref class Email;	
    	ref class Einstellungen;	
    
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    
    	public:
    		Form1(void)
    		{
    			systeminformationen ();
    			InitializeComponent();					
    			regeinträgeholen   ();
    			wallpaperaktualisieren ();
    			sound ();
    			kalenderaktualisieren ();			
    
    			if (registryhilfe::regdaten::interval >0 && registryhilfe::regdaten::email == TRUE)
    				{				
    				progressBar1->Enabled = true;
    				progressBar1->Visible = true;
    				progressBar1->Refresh ();
    				emailwächterstarten();
    				}
    
    			if (registryhilfe::regdaten::hilfe == FALSE)	toolTip1->Active = false;
    
    		}
    
    public: void taskleisteverstecken ();
    		void taskleisteanzeigen   ();
    		void desktopsymboleeinblenden ();
    		void desktopsymboleausblenden ();
    		void emailwächterstarten ();
    		void emailwächteraus ();
    		void timersetzen ();
    		void sound ();
    		void systeminformationen ();
    		void wallpaperaktualisieren ();
    		void kalenderaktualisieren ();
    		void regeinträgeholen ();
    		void terminelöschen ();
    
    	private: System::Windows::Forms::Timer^  timer1;
    	private: System::Windows::Forms::ProgressBar^  progressBar1;
    	private: AxWMPLib::AxWindowsMediaPlayer^  axWindowsMediaPlayer1;
    	private: System::Windows::Forms::ProgressBar^  progressBar2;
    	private: System::ComponentModel::BackgroundWorker^  backgroundWorker1;
    	private: System::Windows::Forms::CheckedListBox^  checkedListBox1;
    	private: System::Windows::Forms::GroupBox^  groupBox1;
    	private: System::Windows::Forms::Timer^  timer2;
    	private: System::Windows::Forms::PictureBox^  pictureBox1;
    	private: System::Windows::Forms::Button^  button1;
    	private: System::Windows::Forms::TextBox^  textBox1;
    
    	private: System::Windows::Forms::PictureBox^  pictureBox8;			
    	protected:
    
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    ...
    ...
    ...
    

    For1.cpp

    #include "stdafx.h"
    #include "Form1.h"
    
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace Kinder;
    
    void Form1::taskleisteverstecken ()
    
    void Form1::taskleisteanzeigen ()
    
    void Form1::desktopsymboleausblenden ()
    
    void Form1::desktopsymboleeinblenden ()
    
    void Form1::emailwächterstarten ()
    
    void Form1::emailwächteraus ()
    
    void Form1::timersetzen ()
    
    void Form1::sound ()
    
    void Form1::systeminformationen ()
    
    void Form1::wallpaperaktualisieren ()
    
    void Form1::kalenderaktualisieren ()
    	{
    	 //String^ ArbeitsOrdner = System::IO::Directory::GetCurrentDirectory();
    	 int a, i = 0, index;
    	 String ^temp, ^datum;
    
    	 if (System::IO::File::Exists (registryhilfe::regdaten::terminpfad + "termine.xml") == FALSE) return;
    	 System::IO::StreamReader ^Reader = gcnew System::IO::StreamReader(registryhilfe::regdaten::terminpfad + "termine.xml");	 
    
         a = Convert::ToInt16(Reader->ReadLine()); 
    	 registryhilfe::regdaten::termine[0] = Convert::ToString (a);											// <-- Index0 für Anzahl von Terminen
    
         array<DateTime> ^Dates = gcnew array<DateTime>(a);
    
         do 
    		 {
             if(Reader->EndOfStream == false) 
    			 {
    			 temp  = Reader->ReadLine ();
    			 if (temp == "") break;
    			 registryhilfe::regdaten::termine[i+1] = temp;
    			 if (Reader->EndOfStream == TRUE) break;
    
    			 index = temp->IndexOf ("</Date>");
    			 datum = temp->Substring ( 6, temp->IndexOf ("</Date>") - 6 );
    
    			 Dates[i] = Convert::ToDateTime(datum);		 
    			 i++;
    			 }		 
    		 } 
    
    		 while(Reader->EndOfStream == false);
             Reader->Close();
    
             monthCalendar1->MonthlyBoldedDates = Dates;
    		 monthCalendar1->UpdateBoldedDates ();
         }
    

    Die anderen Funktionen habe ich hier mal verkürzt - damit es nicht zu viel wird.



  • Also monthCalendar1 steht in der Liste der Controls (Z 60-70) in der Form1.h nicht drinn, weil du monthCalendar1 nicht umbennant hast, richtig?

    Zeige mir bitte mal die Funktion InitializeComponent() aus der Form1.h

    Dann zum Test nehme mal kalenderaktualisieren (); aus der Form1(void) raus und rufe kalenderaktualisieren () in einem cklickevent von einem Button auf. Auf diessen du nach dem Laden des Form1 bitte mal drauf klickst und dann nach einem erfolg des monthCalendar1 schaust.



  • void InitializeComponent(void)
    		{
    		this->components = (gcnew System::ComponentModel::Container());
    		System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
    		this->pictureBox7 = (gcnew System::Windows::Forms::PictureBox());
    		this->pictureBox2 = (gcnew System::Windows::Forms::PictureBox());
    		this->toolTip1 = (gcnew System::Windows::Forms::ToolTip(this->components));
    		this->pictureBox3 = (gcnew System::Windows::Forms::PictureBox());
    		this->pictureBox5 = (gcnew System::Windows::Forms::PictureBox());
    		this->pictureBox4 = (gcnew System::Windows::Forms::PictureBox());
    		this->pictureBox6 = (gcnew System::Windows::Forms::PictureBox());
    		this->monthCalendar1 = (gcnew System::Windows::Forms::MonthCalendar());
    		this->progressBar1 = (gcnew System::Windows::Forms::ProgressBar());
    		this->pictureBox8 = (gcnew System::Windows::Forms::PictureBox());
    		this->checkedListBox1 = (gcnew System::Windows::Forms::CheckedListBox());
    		this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox());
    		this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
    		this->axWindowsMediaPlayer1 = (gcnew AxWMPLib::AxWindowsMediaPlayer());
    		this->progressBar2 = (gcnew System::Windows::Forms::ProgressBar());
    		this->backgroundWorker1 = (gcnew System::ComponentModel::BackgroundWorker());
    		this->groupBox1 = (gcnew System::Windows::Forms::GroupBox());
    		this->timer2 = (gcnew System::Windows::Forms::Timer(this->components));
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox7))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox2))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox3))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox5))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox4))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox6))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox8))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->pictureBox1))->BeginInit();
    		(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->axWindowsMediaPlayer1))->BeginInit();
    		this->groupBox1->SuspendLayout();
    		this->SuspendLayout();
    
    resources->ApplyResources(this->monthCalendar1, L"monthCalendar1");
    		this->monthCalendar1->ForeColor = System::Drawing::Color::DarkRed;
    		this->monthCalendar1->MinDate = System::DateTime(2008, 1, 1, 0, 0, 0, 0);
    		this->monthCalendar1->Name = L"monthCalendar1";
    		this->toolTip1->SetToolTip(this->monthCalendar1, resources->GetString(L"monthCalendar1.ToolTip"));
    		this->monthCalendar1->MouseLeave += gcnew System::EventHandler(this, &Form1::monthCalendar1_MouseLeave);
    		this->monthCalendar1->MouseHover += gcnew System::EventHandler(this, &Form1::monthCalendar1_MouseHover);
    		this->monthCalendar1->DateChanged += gcnew System::Windows::Forms::DateRangeEventHandler(this, &Form1::monthCalendar1_DateChanged);
    


  • Zeige mir bitte auch noch die Funktionen zu

    this->monthCalendar1->MouseLeave += gcnew System::EventHandler(this, &Form1::monthCalendar1_MouseLeave);
    this->monthCalendar1->MouseHover += gcnew System::EventHandler(this, &Form1::monthCalendar1_MouseHover);
    this->monthCalendar1->DateChanged += gcnew System::Windows::Forms::DateRangeEventHandler(this, &Form1::monthCalendar1_DateChanged);
    

    Ansonsten bin ich dann auch überfragt bis jetzt scheint bei dir alles in Ordnung sein.



  • private: System::Void monthCalendar1_MouseHover(System::Object^  sender, System::EventArgs^  e) 
    				{	
    				checkedListBox1->Items->Clear ();
    				timer2->Stop ();				
    				if (backgroundWorker1->IsBusy == FALSE) backgroundWorker1->RunWorkerAsync ();
    				}
    private: System::Void monthCalendar1_MouseLeave(System::Object^  sender, System::EventArgs^  e) 
    				{
    				if (backgroundWorker1->IsBusy == TRUE) backgroundWorker1->CancelAsync ();
    				timer2->Start ();
    				}
    private: System::Void monthCalendar1_DateChanged(System::Object^  sender, System::Windows::Forms::DateRangeEventArgs^  e) 
    				{
    				if (backgroundWorker1->IsBusy == TRUE) backgroundWorker1->CancelAsync ();
    
    				checkedListBox1->Items->Clear ();
    				checkedListBox1->Refresh ();
    
    				if (backgroundWorker1->IsBusy == FALSE) backgroundWorker1->RunWorkerAsync ();
    				}
    private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) // <-- Termine anzeigen
    				{	 
    				checkedListBox1->Items->Clear ();
    				DateTime^ datum = monthCalendar1->SelectionStart;
    				DateTime^ heute = datum->Date;	 	 	 
    				String^ heutigesdatum = heute->ToShortDateString();
    
    				groupBox1->Text = "Ausgewähltes Datum: "+heutigesdatum;	
    
    				String^ temp;	 
    				int index1, index2;
    
    				int count = Convert::ToInt16 (registryhilfe::regdaten::termine[0]);
    				for (int x = 0; x < count + 1; x++)
    					 {
    					 if ( registryhilfe::regdaten::termine[x]->Contains (heutigesdatum) == TRUE)
    						 {
    						 index1 = registryhilfe::regdaten::termine[x]->IndexOf("<Termin>") + 8;
    						 index2 = registryhilfe::regdaten::termine[x]->IndexOf("</Termin>", index1);
    						 temp = registryhilfe::regdaten::termine[x]->Substring (index1, index2 - index1);
    						 checkedListBox1->Items->Add (temp);
    						 }
    					 }
    				groupBox1->Visible = true;
    				checkedListBox1->Refresh ();
    				}
    

Anmelden zum Antworten