monthCalendar - Problem bei BoldedDates - BUG?
-
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:00Convert::ToDateTime-Methode (String)
-
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 (); }