Funktion immer wieder aufrufen
-
Ich hbe folgendes Problem:
Ich will ein Widows-Form erstellen, dass über ein anderes Programm wacht. Funktioniert ja soweit auch. Aber nun will ich, dass es ständig erneuert wird (ca. alle 100- 1000 ms). Ich habe es schon mit
while(true) { Fenster_generieren() // So heißt die Funktion. und nein, die funktioniert auch! Sleep(500); }
funktioniert aber nicht!
Könnt ihr mir helfen???
Hier noch der restliche Code:
#include "windows.h" #include <string> #pragma once namespace Ueberwacher { 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 System::IO; /// <summary> /// Zusammenfassung für Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } public: System::Windows::Forms::Button^ button1; System::Windows::Forms::Button^ button2; System::Windows::Forms::Button^ button3; System::Windows::Forms::Label^ label1; private: /// <summary> /// Erforderliche Designervariable. /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->button1 = (gcnew System::Windows::Forms::Button()); this->button2 = (gcnew System::Windows::Forms::Button()); this->button3 = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(13, 231); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = L"Pause"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew EventHandler(this,&Form1::Pause_Weiter); // // button2 // this->button2->Location = System::Drawing::Point(175, 231); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(75, 23); this->button2->TabIndex = 1; this->button2->Text = L"Beenden"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew EventHandler(this,&Form1::Beenden_Starten); // // button3 // this->button3->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 5, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->button3->Location = System::Drawing::Point(94, 231); this->button3->Name = L"button3"; this->button3->Size = System::Drawing::Size(75, 23); this->button3->TabIndex = 2; this->button3->Text = L"Noch keine Funktion!"; this->button3->UseVisualStyleBackColor = true; // // label1 // this->label1->AutoSize = true; this->label1->Font = (gcnew System::Drawing::Font(L"Comic Sans MS", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->label1->Location = System::Drawing::Point(13, 13); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(53, 23); this->label1->TabIndex = 3; this->label1->Text = L"label1"; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch; this->ClientSize = System::Drawing::Size(265, 266); this->Controls->Add(this->label1); this->Controls->Add(this->button3); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Name = L"Form1"; this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen; this->Text = L"Überwacher"; this->ResumeLayout(false); this->PerformLayout(); Fenster_generieren(); //Sleep(10000); /*while(true) { Fenster_generieren(); Sleep(100); }*/ } System::Void Fenster_generieren() { String ^str = ""; StreamReader^ Datei = gcnew StreamReader("Zustand.txt"); bool aktiv = true, pause = false; if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Ende") aktiv = false; else if (str == "Pause") pause = true; Fenster_generieren(aktiv, pause); } System::Void Fenster_generieren(bool Programm_aktiv, bool Programm_pausiert) { String ^str = "", ^str2 = "Beenden", ^str3 = "Pause"; if (!Programm_aktiv) { str = "Das Programm läuft nicht!"; str2 = "Starten"; button1->Enabled = false; } else { str = "Das Programm läuft!"; if (Programm_pausiert) { str += "\nDas Programm ist pausiert. Sie\nkönnen nun die Datei bearbeiten!"; str3 = "Weiter"; } button1->Enabled = true; } label1->Text = str; button2->Text = str2; button1->Text = str3; } System::Void Pause_Weiter(System::Object^ Sender, System::EventArgs^ e) { String ^str = ""; StreamWriter^ Zustand; StreamReader^ Datei; Datei = gcnew StreamReader("Pause.txt"); if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); Zustand = gcnew StreamWriter("Pause.txt"); if (str != "Stopp") Zustand->Write("Stopp"); else Zustand->Write("Los"); Zustand->Close(); Fenster_generieren(true, str != "Stopp"); } System::Void Beenden_Starten(System::Object^ Sender, System::EventArgs^ e) { String ^str = ""; StreamWriter^ Zustand; StreamReader^ Datei; Datei = gcnew StreamReader("Zustand.txt"); if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Läuft...") { Zustand = gcnew StreamWriter("Pause.txt"); Zustand->Write("Ende"); Zustand->Close(); } else { Zustand = gcnew StreamWriter("Pause.txt"); Zustand->Write("Los"); Zustand->Close(); //System::Diagnostics::Process::Start("C:\\Dokumente und Einstellungen\\Yannick\\Eigene Dateien\\Visual Studio 2010\\Projects\\Errinerer\\Release\\Erinnerer.exe"); System::Diagnostics::Process::Start("Erinnerer.exe"); } Fenster_generieren(str != "Läuft...", false); } #pragma endregion }; }
(Micht wundern, ist nur das Form)
P.S.: ich verwende M Visual C++ 2010 Express
-
-
Ich habe jetzt die Klasse etwas abgeändert. Die Datei sieht jetzt so aus:
#include "windows.h" #include <string> #pragma once 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 System::IO; ref class Class1 { static System::Windows::Forms::Timer^ myTimer = gcnew System::Windows::Forms::Timer; static void TimerEventProcessor( Object^ myObject, EventArgs^ myEventArgs ) { myTimer->Stop(); Form1::Fenster_generieren(); myTimer->Enabled = true; } public: static void Main() { myTimer->Tick += gcnew EventHandler( TimerEventProcessor ); myTimer->Interval = 100; myTimer->Start(); while (true) Application::DoEvents(); } }; namespace Ueberwacher { /// <summary> /// Zusammenfassung für Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } public: System::Windows::Forms::Button^ button1; System::Windows::Forms::Button^ button2; System::Windows::Forms::Button^ button3; System::Windows::Forms::Label^ label1; private: /// <summary> /// Erforderliche Designervariable. /// </summary> System::ComponentModel::Container ^components; #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->button1 = (gcnew System::Windows::Forms::Button()); this->button2 = (gcnew System::Windows::Forms::Button()); this->button3 = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(13, 231); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = L"Pause"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew EventHandler(this,&Form1::Pause_Weiter); // // button2 // this->button2->Location = System::Drawing::Point(175, 231); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(75, 23); this->button2->TabIndex = 1; this->button2->Text = L"Beenden"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew EventHandler(this,&Form1::Beenden_Starten); // // button3 // this->button3->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 5, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->button3->Location = System::Drawing::Point(94, 231); this->button3->Name = L"button3"; this->button3->Size = System::Drawing::Size(75, 23); this->button3->TabIndex = 2; this->button3->Text = L"Noch keine Funktion!"; this->button3->UseVisualStyleBackColor = true; // // label1 // this->label1->AutoSize = true; this->label1->Font = (gcnew System::Drawing::Font(L"Comic Sans MS", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->label1->Location = System::Drawing::Point(13, 13); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(53, 23); this->label1->TabIndex = 3; this->label1->Text = L"label1"; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch; this->ClientSize = System::Drawing::Size(265, 266); this->Controls->Add(this->label1); this->Controls->Add(this->button3); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Name = L"Form1"; this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen; this->Text = L"Überwacher"; this->ResumeLayout(false); this->PerformLayout(); Class1::Main(); } public: System::Void Fenster_generieren() { String ^str = ""; StreamReader^ Datei = gcnew StreamReader("Zustand.txt"); bool aktiv = true, pause = false; if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Ende") aktiv = false; else if (str == "Pause") pause = true; Fenster_generieren(aktiv, pause); } System::Void Fenster_generieren(bool Programm_aktiv, bool Programm_pausiert) { String ^str = "", ^str2 = "Beenden", ^str3 = "Pause"; if (!Programm_aktiv) { str = "Das Programm läuft nicht!"; str2 = "Starten"; button1->Enabled = false; } else { str = "Das Programm läuft!"; if (Programm_pausiert) { str += "\nDas Programm ist pausiert. Sie\nkönnen nun die Datei bearbeiten!"; str3 = "Weiter"; } button1->Enabled = true; } label1->Text = str; button2->Text = str2; button1->Text = str3; } private: System::Void Pause_Weiter(System::Object^ Sender, System::EventArgs^ e) { String ^str = ""; StreamWriter^ Zustand; StreamReader^ Datei; Datei = gcnew StreamReader("Pause.txt"); if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); Zustand = gcnew StreamWriter("Pause.txt"); if (str != "Stopp") Zustand->Write("Stopp"); else Zustand->Write("Los"); Zustand->Close(); Fenster_generieren(true, str != "Stopp"); } System::Void Beenden_Starten(System::Object^ Sender, System::EventArgs^ e) { String ^str = ""; StreamWriter^ Zustand; StreamReader^ Datei; Datei = gcnew StreamReader("Zustand.txt"); if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Läuft...") { Zustand = gcnew StreamWriter("Pause.txt"); Zustand->Write("Ende"); Zustand->Close(); } else { Zustand = gcnew StreamWriter("Pause.txt"); Zustand->Write("Los"); Zustand->Close(); //System::Diagnostics::Process::Start("C:\\Dokumente und Einstellungen\\Yannick\\Eigene Dateien\\Visual Studio 2010\\Projects\\Errinerer\\Release\\Erinnerer.exe"); System::Diagnostics::Process::Start("Erinnerer.exe"); } Fenster_generieren(str != "Läuft...", false); } #pragma endregion }; }
jetzt kommt aber die Fehler:
------ Erstellen gestartet: Projekt: Ueberwacher, Konfiguration: Release Win32 ------ Ueberwacher.cpp c:\dokumente und einstellungen\yannick\eigene dateien\visual studio 2010\projects\errinerer\ueberwacher\Form1.h(21): error C2653: 'Form1': Keine Klasse oder Namespace c:\dokumente und einstellungen\yannick\eigene dateien\visual studio 2010\projects\errinerer\ueberwacher\Form1.h(21): error C3861: "Fenster_generieren": Bezeichner wurde nicht gefunden. ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
Was kann ich machen, um diese wegzukriegen?
-
1. Du darfst Class1 nicht vor Form1 stellen. Der Designer ist sonst verwirrt. Zur selben Kategorie gehört: Niemals Code in InitializeComponents(..) rein packen. Das darf nur der Designer.
2. Wieder mal klassisch.. lass die static's in Class1 weg, instanzier die Klasse Class1 in Form1 und gut ist (edit: besser ist). Oder mach den Timer doch direkt in Form1.
3. Form1::Fenster_generieren(..) ist eine Instanz Methode. Dh. Du brauchst ein Objekt von Form1 um diese Methode aufzurufen.
-
Und bei
while (true) Application::DoEvents();
freut sich die CPU...
-
Hast du ne bessere Methode? Und außerdem wird die ja automatisch beendet, wenn das Fenster zu gemacht wird, weil das Programm dann auch endet.
Ich komme trotzdem nicht weiter! Hat einer ne idee?
public ref class Form1 : public System::Windows::Forms::Form { static System::Windows::Forms::Timer^ myTimer = gcnew System::Windows::Forms::Timer; public: Form1(void) { InitializeComponent(); Main(); // //TODO: Konstruktorcode hier hinzufügen. // } System::Void Fenster_generieren() { String ^str = ""; StreamReader^ Datei = gcnew StreamReader("Zustand.txt"); bool aktiv = true, pause = false; if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Ende") aktiv = false; else if (str == "Pause") pause = true; Fenster_generieren(aktiv, pause); } static void TimerEventProcessor( Object^ myObject, EventArgs^ myEventArgs ) { myTimer->Stop(); Fenster_generieren(); myTimer->Enabled = true; } static void Main() { myTimer->Tick += gcnew EventHandler( TimerEventProcessor ); myTimer->Interval = 100; myTimer->Start(); while (true) Application::DoEvents(); } #pragma endregion }; }
Das war die kuzfassung. und hier die Fehlermeldung:
------ Erstellen gestartet: Projekt: Ueberwacher, Konfiguration: Release Win32 ------ Ueberwacher.cpp c:\dokumente und einstellungen\yannick\eigene dateien\visual studio 2010\projects\errinerer\ueberwacher\Form1.h(232): error C2352: 'Ueberwacher::Form1::Fenster_generieren': Unzulässiger Aufruf einer nicht statischen Memberfunktion c:\dokumente und einstellungen\yannick\eigene dateien\visual studio 2010\projects\errinerer\ueberwacher\Form1.h(128): Siehe Deklaration von 'Ueberwacher::Form1::Fenster_generieren' ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
Hat jemand ne Idee, wie ich´s hingrig, dass es klappt?
-
Ändere an Deiner Main-Methode bitte nix!
Und zieh einfach den "Timer" aus der Toolbox auf Dein Form...
-
Dann kommt.
------ Erstellen gestartet: Projekt: Ueberwacher, Konfiguration: Release Win32 ------ Ueberwacher.cpp c:\dokumente und einstellungen\yannick\eigene dateien\visual studio 2010\projects\errinerer\ueberwacher\Form1.h(237): error C2352: 'Ueberwacher::Form1::Fenster_generieren': Unzulässiger Aufruf einer nicht statischen Memberfunktion c:\dokumente und einstellungen\yannick\eigene dateien\visual studio 2010\projects\errinerer\ueberwacher\Form1.h(134): Siehe Deklaration von 'Ueberwacher::Form1::Fenster_generieren' ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
Dann übergebe in dem Event auch noch das "this"... oder zeig die *entsprechende* Codestelle.. nur mit einer Fehlermeldung ohne _passenden_ Code kann man nicht viel anfangen...
-
myTimer->Tick += gcnew EventHandler(this, &Form1::TimerEventProcessor );
Und nimm endlich die static's weg!!!
Simon
Edit:
- Erledige das was Du in Form1::Main(..) hast im Form1 Konstruktor.
- Lass das DoEvents weg. Es gibt gute Gründe, dass das nicht gut ist. Ausserdem ist es nicht nötig!
-
ok. Dann kommt hier halt der Code:
#include "windows.h" #include <string> #pragma once namespace Ueberwacher { 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 System::IO; /// <summary> /// Zusammenfassung für Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { static System::Windows::Forms::Timer^ myTimer = gcnew System::Windows::Forms::Timer; public: Form1(void) { InitializeComponent(); Main(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } public: System::Windows::Forms::Button^ button1; System::Windows::Forms::Button^ button2; System::Windows::Forms::Button^ button3; System::Windows::Forms::Label^ label1; private: System::Windows::Forms::Timer^ timer1; public: private: System::ComponentModel::IContainer^ components; private: /// <summary> /// Erforderliche Designervariable. /// </summary> #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->components = (gcnew System::ComponentModel::Container()); this->button1 = (gcnew System::Windows::Forms::Button()); this->button2 = (gcnew System::Windows::Forms::Button()); this->button3 = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->timer1 = (gcnew System::Windows::Forms::Timer(this->components)); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(13, 231); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = L"Pause"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew EventHandler(this,&Form1::Pause_Weiter); // // button2 // this->button2->Location = System::Drawing::Point(175, 231); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(75, 23); this->button2->TabIndex = 1; this->button2->Text = L"Beenden"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew EventHandler(this,&Form1::Beenden_Starten); // // button3 // this->button3->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 5, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->button3->Location = System::Drawing::Point(94, 231); this->button3->Name = L"button3"; this->button3->Size = System::Drawing::Size(75, 23); this->button3->TabIndex = 2; this->button3->Text = L"Noch keine Funktion!"; this->button3->UseVisualStyleBackColor = true; // // label1 // this->label1->AutoSize = true; this->label1->Font = (gcnew System::Drawing::Font(L"Comic Sans MS", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->label1->Location = System::Drawing::Point(13, 13); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(53, 23); this->label1->TabIndex = 3; this->label1->Text = L"label1"; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch; this->ClientSize = System::Drawing::Size(265, 266); this->Controls->Add(this->label1); this->Controls->Add(this->button3); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Name = L"Form1"; this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen; this->Text = L"Überwacher"; this->ResumeLayout(false); this->PerformLayout(); } System::Void Fenster_generieren() { String ^str = ""; StreamReader^ Datei = gcnew StreamReader("Zustand.txt"); bool aktiv = true, pause = false; if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Ende") aktiv = false; else if (str == "Pause") pause = true; Fenster_generieren(aktiv, pause); } System::Void Fenster_generieren(bool Programm_aktiv, bool Programm_pausiert) { String ^str = "", ^str2 = "Beenden", ^str3 = "Pause"; if (!Programm_aktiv) { str = "Das Programm läuft nicht!"; str2 = "Starten"; button1->Enabled = false; } else { str = "Das Programm läuft!"; if (Programm_pausiert) { str += "\nDas Programm ist pausiert. Sie\nkönnen nun die Datei bearbeiten!"; str3 = "Weiter"; } button1->Enabled = true; } label1->Text = str; button2->Text = str2; button1->Text = str3; } System::Void Pause_Weiter(System::Object^ Sender, System::EventArgs^ e) { String ^str = ""; StreamWriter^ Zustand; StreamReader^ Datei; Datei = gcnew StreamReader("Pause.txt"); if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); Zustand = gcnew StreamWriter("Pause.txt"); if (str != "Stopp") Zustand->Write("Stopp"); else Zustand->Write("Los"); Zustand->Close(); Fenster_generieren(true, str != "Stopp"); } System::Void Beenden_Starten(System::Object^ Sender, System::EventArgs^ e) { String ^str = ""; StreamWriter^ Zustand; StreamReader^ Datei; Datei = gcnew StreamReader("Zustand.txt"); if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Läuft...") { Zustand = gcnew StreamWriter("Pause.txt"); Zustand->Write("Ende"); Zustand->Close(); } else { Zustand = gcnew StreamWriter("Pause.txt"); Zustand->Write("Los"); Zustand->Close(); System::Diagnostics::Process::Start("Erinnerer.exe"); } Fenster_generieren(str != "Läuft...", false); } static void TimerEventProcessor( Object^ myObject, EventArgs^ myEventArgs ) { myTimer->Stop(); Fenster_generieren(); myTimer->Enabled = true; } static void Main() { myTimer->Tick += gcnew EventHandler( TimerEventProcessor ); myTimer->Interval = 100; myTimer->Start(); while (true) Application::DoEvents(); } #pragma endregion }; }
alte Fehlermeldung. Und das mit staic weglassen geht nicht! (Sagt mein Compiler)
-
Kannst Du eigentlich nicht einmal machen, was man Dir empfiehlt?
-
Was denn? ich habe bis jetzt alle gemacht, was ihr gesagt habt. Die Klasse zusammen gefasst und sogra versucht die statics weg zumachen, mein compiler sagt aber, dass das nicht geht!
-
theta schrieb:
Und nimm endlich die static's weg!!!
- Erledige das was Du in Form1::Main(..) hast im Form1 Konstruktor.
- Lass das DoEvents weg. Es gibt gute Gründe, dass das nicht gut ist. Ausserdem ist es nicht nötig!
-
Code:
#include "windows.h" #include <string> #pragma once namespace Ueberwacher { 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 System::IO; /// <summary> /// Zusammenfassung für Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { System::Windows::Forms::Timer^ myTimer = gcnew System::Windows::Forms::Timer; public: Form1(void) { InitializeComponent(); Main(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } public: System::Windows::Forms::Button^ button1; System::Windows::Forms::Button^ button2; System::Windows::Forms::Button^ button3; System::Windows::Forms::Label^ label1; private: System::Windows::Forms::Timer^ timer1; public: private: System::ComponentModel::IContainer^ components; private: /// <summary> /// Erforderliche Designervariable. /// </summary> #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->components = (gcnew System::ComponentModel::Container()); this->button1 = (gcnew System::Windows::Forms::Button()); this->button2 = (gcnew System::Windows::Forms::Button()); this->button3 = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->timer1 = (gcnew System::Windows::Forms::Timer(this->components)); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(13, 231); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = L"Pause"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew EventHandler(this,&Form1::Pause_Weiter); // // button2 // this->button2->Location = System::Drawing::Point(175, 231); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(75, 23); this->button2->TabIndex = 1; this->button2->Text = L"Beenden"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew EventHandler(this,&Form1::Beenden_Starten); // // button3 // this->button3->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 5, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->button3->Location = System::Drawing::Point(94, 231); this->button3->Name = L"button3"; this->button3->Size = System::Drawing::Size(75, 23); this->button3->TabIndex = 2; this->button3->Text = L"Noch keine Funktion!"; this->button3->UseVisualStyleBackColor = true; // // label1 // this->label1->AutoSize = true; this->label1->Font = (gcnew System::Drawing::Font(L"Comic Sans MS", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->label1->Location = System::Drawing::Point(13, 13); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(53, 23); this->label1->TabIndex = 3; this->label1->Text = L"label1"; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch; this->ClientSize = System::Drawing::Size(265, 266); this->Controls->Add(this->label1); this->Controls->Add(this->button3); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Name = L"Form1"; this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen; this->Text = L"Überwacher"; this->ResumeLayout(false); this->PerformLayout(); } System::Void Fenster_generieren() { String ^str = ""; StreamReader^ Datei = gcnew StreamReader("Zustand.txt"); bool aktiv = true, pause = false; if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Ende") aktiv = false; else if (str == "Pause") pause = true; Fenster_generieren(aktiv, pause); } System::Void Fenster_generieren(bool Programm_aktiv, bool Programm_pausiert) { String ^str = "", ^str2 = "Beenden", ^str3 = "Pause"; if (!Programm_aktiv) { str = "Das Programm läuft nicht!"; str2 = "Starten"; button1->Enabled = false; } else { str = "Das Programm läuft!"; if (Programm_pausiert) { str += "\nDas Programm ist pausiert. Sie\nkönnen nun die Datei bearbeiten!"; str3 = "Weiter"; } button1->Enabled = true; } label1->Text = str; button2->Text = str2; button1->Text = str3; } System::Void Pause_Weiter(System::Object^ Sender, System::EventArgs^ e) { String ^str = ""; StreamWriter^ Zustand; StreamReader^ Datei; Datei = gcnew StreamReader("Pause.txt"); if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); Zustand = gcnew StreamWriter("Pause.txt"); if (str != "Stopp") Zustand->Write("Stopp"); else Zustand->Write("Los"); Zustand->Close(); Fenster_generieren(true, str != "Stopp"); } System::Void Beenden_Starten(System::Object^ Sender, System::EventArgs^ e) { String ^str = ""; StreamWriter^ Zustand; StreamReader^ Datei; Datei = gcnew StreamReader("Zustand.txt"); if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Läuft...") { Zustand = gcnew StreamWriter("Pause.txt"); Zustand->Write("Ende"); Zustand->Close(); } else { Zustand = gcnew StreamWriter("Pause.txt"); Zustand->Write("Los"); Zustand->Close(); System::Diagnostics::Process::Start("Erinnerer.exe"); } Fenster_generieren(str != "Läuft...", false); } void TimerEventProcessor( Object^ myObject, EventArgs^ myEventArgs ) { myTimer->Stop(); Fenster_generieren(); myTimer->Enabled = true; } void Main() { myTimer->Tick += gcnew EventHandler( TimerEventProcessor() ); myTimer->Interval = 100; myTimer->Start(); } #pragma endregion }; }
Fehlermeldung:
------ Erstellen gestartet: Projekt: Ueberwacher, Konfiguration: Release Win32 ------ Ueberwacher.cpp c:\dokumente und einstellungen\yannick\eigene dateien\visual studio 2010\projects\errinerer\ueberwacher\Form1.h(20): error C3845: "Ueberwacher::Form1::myTimer": Nur statische Datenmember können innerhalb einer Verweisklasse oder eines Werttyps initialisiert werden. c:\dokumente und einstellungen\yannick\eigene dateien\visual studio 2010\projects\errinerer\ueberwacher\Form1.h(244): error C2660: 'Ueberwacher::Form1::TimerEventProcessor': Funktion akzeptiert keine 0 Argumente c:\dokumente und einstellungen\yannick\eigene dateien\visual studio 2010\projects\errinerer\ueberwacher\Form1.h(244): error C3350: "System::EventHandler": Ein Delegatkonstruktor erwartet 2 Argument(e). ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
20: Member-Variablen Initialisation bei der Deklaration geht nur in C#
244: Du rufst hier eine Methode auf und übergibst keine; theta hat es Dir schon gesagt, wie man es richtig macht; ausserdem sind in Deinem Code zig Beispiele dafür drin!Und wenn Du meinen Rat befolgt hättest (im Designer reinziehen), dann hättest Du die ganzen Probleme nicht...
Und damit war das für Dich mein letztes Posting, da Du nicht in der Lage bist zu lesen, relevanten Code zu posten oder sonst irgendwie die anderen Beiträge liest...
-
Problem 1:
public ref class Form1 : public System::Windows::Forms::Form { System::Windows::Forms::Timer^ myTimer; public: Form1(void) { InitializeComponent(); myTimer = gcnew System::Windows::Forms::Timer(components); Main(); // //TODO: Konstruktorcode hier hinzufügen. // } // ... }
Dieses Problem hättest Du nicht gehabt, wenn Du, wie Jochen gesagt hat, den Timer als Komponente im Designer hinzugefügt hättest.
Problem 2 + 3:
void Main() { myTimer->Tick += gcnew EventHandler(this, &Form1::TimerEventProcessor); myTimer->Interval = 100; myTimer->Start(); }
Ausserdem würde ich den Code aus Main direkt im Konstruktor von Form1 plazieren oder mindestens die Methode in z.B. setupTimer(..) umbenennen.
Simon
Edit
Jochen schrieb:
Und damit war das für Dich mein letztes Posting, da Du nicht in der Lage bist zu lesen, relevanten Code zu posten oder sonst irgendwie die anderen Beiträge liest...
Dem schliesse ich mit auch gleich an.
-
Nein, funktioniert nicht!
kommt ne Fehlermeldung, die in der Hauptdatei aufgerufen wird:
Es ist ein Fehler aufgetreten. (Das ist ist von mir!) System.ArgumentNullException: Der wert darf nivht NULL sein. (...)Zeile 27(...)
Hier der Rest:
#include "windows.h" #include <string> #pragma once namespace Ueberwacher { 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 System::IO; /// <summary> /// Zusammenfassung für Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { System::Windows::Forms::Timer^ myTimer; public: Form1(void) { InitializeComponent(); myTimer = gcnew System::Windows::Forms::Timer(components); myTimer->Tick += gcnew EventHandler(this, &Form1::TimerEventProcessor); myTimer->Interval = 100; myTimer->Start(); // //TODO: Konstruktorcode hier hinzufügen. // } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } public: System::Windows::Forms::Button^ button1; System::Windows::Forms::Button^ button2; System::Windows::Forms::Button^ button3; System::Windows::Forms::Label^ label1; private: System::Windows::Forms::PictureBox^ pictureBox1; public: private: System::ComponentModel::IContainer^ components; private: /// <summary> /// Erforderliche Designervariable. /// </summary> #pragma region Windows Form Designer generated code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> void InitializeComponent(void) { this->button1 = (gcnew System::Windows::Forms::Button()); this->button2 = (gcnew System::Windows::Forms::Button()); this->button3 = (gcnew System::Windows::Forms::Button()); this->label1 = (gcnew System::Windows::Forms::Label()); this->pictureBox1 = (gcnew System::Windows::Forms::PictureBox()); (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->BeginInit(); this->SuspendLayout(); // // button1 // this->button1->Location = System::Drawing::Point(13, 231); this->button1->Name = L"button1"; this->button1->Size = System::Drawing::Size(75, 23); this->button1->TabIndex = 0; this->button1->Text = L"Pause"; this->button1->UseVisualStyleBackColor = true; this->button1->Click += gcnew EventHandler(this,&Form1::Pause_Weiter); // // button2 // this->button2->Location = System::Drawing::Point(175, 231); this->button2->Name = L"button2"; this->button2->Size = System::Drawing::Size(75, 23); this->button2->TabIndex = 1; this->button2->Text = L"Beenden"; this->button2->UseVisualStyleBackColor = true; this->button2->Click += gcnew EventHandler(this,&Form1::Beenden_Starten); // // button3 // this->button3->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 5, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->button3->Location = System::Drawing::Point(94, 231); this->button3->Name = L"button3"; this->button3->Size = System::Drawing::Size(75, 23); this->button3->TabIndex = 2; this->button3->Text = L"Noch keine Funktion!"; this->button3->UseVisualStyleBackColor = true; // // label1 // this->label1->AutoSize = true; this->label1->Font = (gcnew System::Drawing::Font(L"Comic Sans MS", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0))); this->label1->Location = System::Drawing::Point(13, 13); this->label1->Name = L"label1"; this->label1->Size = System::Drawing::Size(53, 46); this->label1->TabIndex = 3; this->label1->Text = L"label1\nlol"; // // pictureBox1 // this->pictureBox1->Location = System::Drawing::Point(13, 62); this->pictureBox1->Name = L"pictureBox1"; this->pictureBox1->Size = System::Drawing::Size(237, 163); this->pictureBox1->SizeMode = System::Windows::Forms::PictureBoxSizeMode::CenterImage; this->pictureBox1->TabIndex = 4; this->pictureBox1->TabStop = false; // // Form1 // this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; this->BackgroundImageLayout = System::Windows::Forms::ImageLayout::Stretch; this->ClientSize = System::Drawing::Size(265, 266); this->Controls->Add(this->pictureBox1); this->Controls->Add(this->label1); this->Controls->Add(this->button3); this->Controls->Add(this->button2); this->Controls->Add(this->button1); this->Name = L"Form1"; this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen; this->Text = L"Überwacher"; (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->pictureBox1))->EndInit(); this->ResumeLayout(false); this->PerformLayout(); } System::Void Fenster_generieren() { String ^str = ""; StreamReader^ Datei = gcnew StreamReader("Zustand.txt"); bool aktiv = true, pause = false; if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Ende") aktiv = false; else if (str == "Pause") pause = true; Fenster_generieren(aktiv, pause); } System::Void Fenster_generieren(bool Programm_aktiv, bool Programm_pausiert) { String ^str = "", ^str2 = "Beenden", ^str3 = "Pause"; if (!Programm_aktiv) { str = "Das Programm läuft nicht!"; str2 = "Starten"; button1->Enabled = false; } else { str = "Das Programm läuft!"; if (Programm_pausiert) { str += "\nDas Programm ist pausiert. Sie\nkönnen nun die Datei bearbeiten!"; str3 = "Weiter"; } button1->Enabled = true; } label1->Text = str; button2->Text = str2; button1->Text = str3; } System::Void Pause_Weiter(System::Object^ Sender, System::EventArgs^ e) { String ^str = ""; StreamWriter^ Zustand; StreamReader^ Datei; Datei = gcnew StreamReader("Pause.txt"); if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); Zustand = gcnew StreamWriter("Pause.txt"); if (str != "Stopp") Zustand->Write("Stopp"); else Zustand->Write("Los"); Zustand->Close(); Fenster_generieren(true, str != "Stopp"); } System::Void Beenden_Starten(System::Object^ Sender, System::EventArgs^ e) { String ^str = ""; StreamWriter^ Zustand; StreamReader^ Datei; Datei = gcnew StreamReader("Zustand.txt"); if (Datei->Peek() != -1) str = Datei->ReadLine(); Datei->Close(); if (str == "Läuft...") { Zustand = gcnew StreamWriter("Pause.txt"); Zustand->Write("Ende"); Zustand->Close(); } else { Zustand = gcnew StreamWriter("Pause.txt"); Zustand->Write("Los"); Zustand->Close(); System::Diagnostics::Process::Start("Erinnerer.exe"); } Fenster_generieren(str != "Läuft...", false); } void TimerEventProcessor( Object^ myObject, EventArgs^ myEventArgs ) { myTimer->Stop(); Fenster_generieren(); myTimer->Enabled = true; } #pragma endregion }; }
Danke schon mal im Voraus!
-
Tja,
von Jochen und theta wirst du wohl nichts mehr hören...
und von mir auch nur soviel, daß ich dir rate ersteinmal mit C# anzufangen.Den Link von Jochen bzgl. C++/CLI und WinForms kennst du ja wahrscheinlich schon -)
Dir fehlen einfach die elementaren Grundkenntnisse des Programmierens (mit OOP, d.h. Klassen, Member, Methoden, etc.). Und dafür ist es besser, wenn du C# benutzt, da dessen Syntax einfacher ist (und der Designer auch bessere Unterstützung anbietet, z.B. die Aufteilung der Form-Klasse in zwei Dateien: MyForm.cs und MyForm.designer.cs).
Und dann programmiere die ersten 3-5 Projekte ersteinmal nur mit einer Konsolenapplikation (bis du die sprachlichen Mittel der Sprache C# im Schlaf kannst) und dann kannst du zu einer WinForms-Anwendung wechseln und nochmal bei Fragen einen neuen Beitrag im C#-Unterforum stellen...
Bis dahin Viel Erfolg
-
Ich habe im Standard C++ schon einige Erfahrung. Nur C++/CLI ist absolutes Neuland für mich. Ich fände es von daher nicht schlecht, wenn ihr mir gegenüber auch nur ein winziges Bisschen Geduld zeigen könntet.
Wie es schon in einigen Threads geheißen hat, ist C++ und C++/CLI was völlig Verschiedenes. Ich habe auch ein Buch, mit dem ich C++/CLI lernen will, aber solche Sachen stehen da gar nicht drin! ich fände es deshalb sehr nett von euch, wenn ihr mir weiterhelfen könntet.ich sehe absolut keinen Sinn 1. eine neue Sprache zu lernen und 2. deshalb 2 Projekte komplett neu zu gestalten!
Ich hoffe ihr versteht das.