Winform:Stoppuhr



  • Hallo zusammen. Ich möchte mir gerne eine Stoppuhr mit Microsoft Visual C++ bauen. Leider fehlt mir in jeglicher Hinsicht das know how. Bitte Helft mir. Ich möchte gerne eine HH:SS:mSmS, Anzeige und 3 buttons(Start;Stopp;Reset) Das alles gerne auf ein kleines Form gebracht würde mir reichen. Ich habe es versucht bin aber gescheitert. Ich hoffe jemand kann mir helfen.
    Dankeschön einmal im Voraus!



  • Friedmaster schrieb:

    Leider fehlt mir in jeglicher Hinsicht das know how.

    Vielleicht hast du nach den falschen Schlagwörtern gegooglet? Forms sind .NET, d.h. nicht Bestandteil von Standard-C++. Damit bist du hier im Froum falsch, ich denke mal dass du ins C++/CLI-Forum möchtest. (oder du willst dir sogar C# anschauen)

    Bitte Helft mir. Ich möchte gerne eine HH:SS:mSmS, Anzeige und 3 buttons(Start;Stopp;Reset) Das alles gerne auf ein kleines Form gebracht würde mir reichen. Ich habe es versucht bin aber gescheitert. Ich hoffe jemand kann mir helfen.

    Wo du allerdings schonmal hier im Forum bist, schau dir mal den Link in meiner Signatur an - und überleg dir, wie dein Text auf die Leute wirken könnte. "Hey Leute, ich geb euch keinerlei Infos darüber, was ich kann, weiß oder versucht habe, ich hätte gern die Komplettlösung. Mit Schlagobers."



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Das klingt nach grafischer Benutzeroberfläche. In welches Fachforum davon möchtest du verschoben werden? Wobei das Verschieben auch recht sinnlos ist, da man dir dort auch nur sagen wird, dass du erst einmal die Grundlagen lernen musst, bevor du irgendetwas machst.

    edit: Zu langsam.



  • /*timer.hpp*/
    
    #include "windows.h"
    
    #include <cassert>
    #include <stdexcept>
    
    struct large_integer_t
    {
    	typedef __int64 integral_type;
    	operator float() const
    	{
    		return static_cast<float>( static_cast<integral_type>(*this) );
    	}
    
    	operator integral_type() const
    	{
    		return data.QuadPart;
    	}
    	operator integral_type()
    	{
    		return data.QuadPart;
    	}
    
    	large_integer_t()
    	:	data(LARGE_INTEGER())
    	{}
    
    	large_integer_t(const LARGE_INTEGER& data)
    	:	data(data)
    	{}
    
    	large_integer_t& operator-= (const large_integer_t& other)
    	{
    		data.QuadPart -= other.data.QuadPart;
    		return *this;
    	}
    private:
    	LARGE_INTEGER data;
    };
    
    large_integer_t operator- (const large_integer_t& lhs, const large_integer_t& rhs)
    {
    	large_integer_t tmp(lhs);
    	tmp -= rhs;
    	return tmp;
    }
    
    class timer_t
    {
    public:
    	typedef float second_t;
    
    	timer_t()
    	:	begin(get_timestamp())
    #if !defined (NDEBUG)
    	,	stopped(false)
    #endif //#if !defined (_NDEBUG)
    	{
    		end = begin;
    	}
    
    	void stop()
    	{
    #if !defined (NDEBUG)
    		stopped = true;
    #endif //#if !defined (_NDEBUG)
    
    		end = get_timestamp();
    	}
    
    	second_t get_seconds() const
    	{
    		assert(stopped);
    
    		return (end-begin)/static_cast<second_t>(get_frequency());
    	}
    
    private:
    #if !defined (NDEBUG)
    	bool stopped;
    #endif //#if !defined (_NDEBUG)
    
    	static large_integer_t get_frequency()
    	{
    		LARGE_INTEGER ret_val;
    		BOOL succeed = QueryPerformanceFrequency(&ret_val);
    
    		if(!succeed)
    			throw std::runtime_error("calling QueryPerformanceFrequency failed");
    
    		return ret_val;
    	}
    
    	static large_integer_t get_timestamp()
    	{
    		LARGE_INTEGER ret_val;
    		BOOL succeed = QueryPerformanceCounter(&ret_val);
    
    		if(!succeed)
    			throw std::runtime_error("calling QueryPerformanceCounter failed");
    
    		return ret_val;
    	}
    
    	large_integer_t begin;
    	large_integer_t end;
    };
    

    hier hast du nen timer, den ich vor kurzem hier auch irgendwo gepostet hatte.
    du hättest jetzt eine globale instanz des timers (evtl. noch eine funktion start hinzufügen).
    bei stop und reset rufst du jeweils die passende funktion auf und dann gibst du halt auf nem label die zeit an.

    da du bestimmt die zeit "live" auf einem label anzeigen willst, müsstest du mal noch nach der passenden funktion für winforms suchen (update/onupdate sicherlich, wenns so was nicht gibt, musst du sie eben selbst bauen):

    void update()
    {
      on_update();
    
      Sleep(0);
      update();
    }
    
    void on_update()
    {
      timer.stop();
      std::stringstream ss;
      ss << timer;
      label_string_type /*hier den typ einsetzen! */ text; text << ss;
      label.text = text;
    }
    

    bb



  • Habt erst einmal vielen Dank! ich habe jetzt ein Programm geschrieben in .h Format. Muss ich denn nun auch etwas in andere Quelldateien oder Headerdateien schreiben? Wie gesagt, ich bin noch ein Greenhorn in Sachen C++.

    #pragma endregion
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    			 }
    	private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
    				 if(this->textBox4->TextLength==2)
    				 {
    					 this->label3->Visible=false;
    				 }
    				 if(this->textBox4->text ==("10"))
    				 {
    					 this->label3->Visible=false;
    				 }
    				 if(this->textBox4->Text==("99"))
    				 {this->timer1->Stop();
    				 this ->textBox2-Text=("59");
    				 this ->textBox1-Text=("9");
    				 }
    				 if(this->textBox2->Text ==("10"))
    				 {
    					 this->label1->Visible=false;
    				 }
    				 if(this->textbox2->Text == ("59"))
    				 {
    					 float num1 = 0;
    					 float num2 = 0;
    					 float ans = 0;
    					 num1 = system::Single:Parse(TextBox4->Text);
    					 num2 = system::Single:Parse("1");
    					 ans = num1+num2;
    					 textbox4->Text=ans.ToString();
    					 this->textBox2->Text = ("0");
    					 this-> label1->Visible=true;
    				 }
    				 if(this->textBox1->Text == ("9")
    				 {
    					 this->textBox1->Text=("1");
    					 float num1 = 0;
    					 float num2 = 0;
    					 float ans = 0;
    					 num1 = system::Single:Parse(TextBox2->Text);
    					 num2 = system::Single:Parse("1");
    					 ans = num1+num2;
    					 textbox2->Text=ans.ToString();
    				 }
    				 else
    				 {
    					 float num1 = 0;
    					 float num2 = 0;
    					 float ans = 0;
    					 num1 = system::Single:Parse(TextBox2->Text);
    					 num2 = system::Single:Parse("1");
    					 ans = num1+num2;
    					 textbox1->Text=ans.ToString();
    				 }
    
    			 }
    
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    				 this->timer1-Start();
    				 this->button1-SendToBack();
    			 }
    		 private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) {
    					  this->timer1->Stop();
    					  this->textBox1->Text = ("0");
    					  this->textBox2->Text = ("0");
    					  this->textBox4->Text = ("0");
    					  this->button1->BringToFront();
    					  this->label1-Visible=true;
    					  this->label3-Visible=true;
    					  this->textbox3->Visible=true;
    				  }
    private: System::Void textBox2_TextChanged(System::Object^  sender, System::EventArgs^  e) {
    		 }
    private: System::Void textBox4_TextChanged(System::Object^  sender, System::EventArgs^  e) {
    		 }
    }
    private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    			 this->timer1-Stop();
    			 this->button2->SendToBack();
    		 }
    };
    


  • Eine Stopuhr gibt es schon im .NET Framework:
    http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

    @unskilled:
    Eine native Implementierung im .NET Umfeld ist nicht angebracht, wenn schon eine .NET Alternative besteht.



  • Hallo,
    nachdem ich freundlicherweise über die Regeln der Community aufgeklärt wurde, habe ich mich nicht mehr vom PC entfert und habe endlich ein brauchbares Programm geschrieben. Leider habe ich noch ein Problem mit der "Reset"- Funktion. Ich möchte: Drücke ich den Button"Reset", soll die Anzeige "Anzeige" wieder auf seinen Anfangswert zurück, also "0:0:0". Ich hoffe mir kann da jemand behilflich sein. Bisher habe ich folgendes verfasst:

    #pragma once
    
    namespace Stoppuhr {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	/// <summary>
    	/// Zusammenfassung für Form1
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    		static int Anfang = 0;
    		static int Sekunde = 0;
    		static int Minute = 0;
    		static int Stunde = 0;
    		String^ Sek; 
    		String^	Min;
    	private: System::Windows::Forms::Button^  Reset;
    	private: System::Windows::Forms::Timer^  Zeit;
    			 String^	Std;
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	protected: 
    	private: System::Windows::Forms::Button^  Start;
    	private: System::Windows::Forms::Button^  Stop;
    	private: System::Windows::Forms::Label^  Anzeige;
    	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->Zeit = (gcnew System::Windows::Forms::Timer(this->components));
    			this->Start = (gcnew System::Windows::Forms::Button());
    			this->Stop = (gcnew System::Windows::Forms::Button());
    			this->Anzeige = (gcnew System::Windows::Forms::Label());
    			this->Reset = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// Zeit
    			// 
    			this->Zeit->Interval = 1000;
    			this->Zeit->Tick += gcnew System::EventHandler(this, &Form1::Zeit_Tick);
    			// 
    			// Start
    			// 
    			this->Start->Location = System::Drawing::Point(29, 168);
    			this->Start->Name = L"Start";
    			this->Start->Size = System::Drawing::Size(65, 23);
    			this->Start->TabIndex = 0;
    			this->Start->Text = L"Start";
    			this->Start->UseVisualStyleBackColor = true;
    			this->Start->Click += gcnew System::EventHandler(this, &Form1::Start_Click);
    			// 
    			// Stop
    			// 
    			this->Stop->Location = System::Drawing::Point(100, 168);
    			this->Stop->Name = L"Stop";
    			this->Stop->Size = System::Drawing::Size(65, 23);
    			this->Stop->TabIndex = 1;
    			this->Stop->Text = L"Stopp";
    			this->Stop->UseVisualStyleBackColor = true;
    			this->Stop->Click += gcnew System::EventHandler(this, &Form1::Stop_Click);
    			// 
    			// Anzeige
    			// 
    			this->Anzeige->AutoSize = true;
    			this->Anzeige->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 26.25F, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point, 
    				static_cast<System::Byte>(0)));
    			this->Anzeige->Location = System::Drawing::Point(51, 58);
    			this->Anzeige->Name = L"Anzeige";
    			this->Anzeige->Size = System::Drawing::Size(99, 39);
    			this->Anzeige->TabIndex = 2;
    			this->Anzeige->Text = L"0:0:0";
    			// 
    			// Reset
    			// 
    			this->Reset->Location = System::Drawing::Point(171, 169);
    			this->Reset->Name = L"Reset";
    			this->Reset->Size = System::Drawing::Size(65, 22);
    			this->Reset->TabIndex = 3;
    			this->Reset->Text = L"Reset";
    			this->Reset->UseVisualStyleBackColor = true;
    			this->Reset->Click += gcnew System::EventHandler(this, &Form1::Reset_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(284, 262);
    			this->Controls->Add(this->Reset);
    			this->Controls->Add(this->Anzeige);
    			this->Controls->Add(this->Stop);
    			this->Controls->Add(this->Start);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    #pragma endregion
    	private: System::Void Zeit_Tick(System::Object^  sender, System::EventArgs^  e) 
    			 {
    				  Anfang=Sekunde++;
    				 if(Sekunde == 60)
    				 {
    					 Sekunde=0;
    					 Minute++;
    				 }
    				 if(Minute == 60)
    				 {
    					 Minute = 0;
    					 Stunde ++;
    			 }
    
    				 Sek = Convert::ToString(Sekunde) ;
    				 Min = Convert::ToString(Minute) ;
    				 Std = Convert::ToString(Stunde) ;
    				 Anzeige->Text = Std + ":" + Min + ":" + Sek;
    			 }
    	private: System::Void Start_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
    
    				 this->Zeit->Start();
    			 }
    private: System::Void Reset_Click(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			this->Anzeige -> Text="00:00:00";
    		 }
    private: System::Void Stop_Click(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			 this->Zeit->Stop();
    		 }
    };
    }
    


  • 1. Warum sind die Variablen Anfang, Sekunde, Minute, Stunde static? Es gibt keinen Grund - mache sie nicht-statisch. Und: Falls Du denkst es gibt einen Grund... es ist häufig die falsche Lösung zum Problem.
    2. Warum sind Sek, Min und Std Member Variabeln? Das ist nicht nötig, denn sie werden nur in Zeit_Tick(..) als Zwischenresultat verwendet.
    3.

    Drücke ich den Button"Reset", soll die Anzeige "Anzeige" wieder auf seinen Anfangswert zurück, also "0:0:0".

    Und was geht nicht? Offensichtlich ist, dass dem Text "00:00:00" zugewiesen wird, was eben nicht gleich "0:0:0" ist. Ich vermute aber Du meinst was anderes - oder?



  • Dem Nächsten, der entweder a) diesen scheiß hier als C++ bezeichnet, oder b) vor jede Memberfunktion die Sichtbarkeit schreibt, statte ich persönlich einen Besuch ab, um ihm in die Fresse zu hauen.


Anmelden zum Antworten