Zählwert in Textbox ausgeben



  • Hallo,
    ich möchte einen Zähler in einer Textbox ausgeben.
    Der Zähler wird beim Debug erhöht und die Zeilen werden verarbeitet (Haltepunkte).
    Allerdings bleibt der angezeigte Wert bei 1 stehen.
    Was mache ich falsch?

    tx_count++;
    textBox1->Text=Convert::ToString(tx_count);
    

    Ich verwende Visual Studio Express 2010

    Die Variable ist global.

    volatile unsigned int tx_count;
    

    Hoffe das reicht.
    Danke!



  • Zeige ein lauffähiges minimal Bsp. wo der Fehler auftritt.



  • Ich gebe mal zwei Tipps ab:
    entweder du setzt tx_count jedesmal wieder auf 0 zurück oder aber du verwendest eine Schleife und erst am Ende wird der Wert in der TextBox richtig dargestellt...



  • So ich habe ein neues Projekt gemacht, um das ganze fast minimal testen zu können.
    Das Verhalten ist aber anders. Die Zeile

    textBox1->Text=Convert::ToString(tx_count);
    

    (ganz unten)
    Ist lt. den Haltepunkten die letzte Zeile die verarbeitet wird.
    Die zwei Zeilen danach werden hier gar nicht mehr aufgerufen.

    Zum Test verwende ich einen Timer, der alle 1000 ms aufgerufen wird.
    In der Textbox wird gar nichts angezeigt.
    Hier noch mal alles aus der Form:

    #pragma once
    			#include <windows.h>
    namespace date_time {
    
    	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::Timers;
    
    	/// <summary>
    	/// Zusammenfassung für Form1
    	/// </summary>
    	__int64 STicks;
    	__int64 ETicks;
    	volatile static int tx_count;
    	//extern __int64 GetTickCount64(void );
    
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			aTimer = gcnew System::Timers::Timer( 200 );
    			aTimer->Elapsed += gcnew ElapsedEventHandler(this,&Form1::OnTimedEvent );
    
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^  button1;
    	protected: 
    	private: System::Windows::Forms::Button^  button2;
    	private: System::Windows::Forms::TextBox^  textBox1;
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    		static System::Timers::Timer^ aTimer;
    
    #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->textBox1 = (gcnew System::Windows::Forms::TextBox());
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(0, 0);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(75, 23);
    			this->button1->TabIndex = 0;
    			this->button1->Text = L"button1";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    			// 
    			// button2
    			// 
    			this->button2->Location = System::Drawing::Point(112, 0);
    			this->button2->Name = L"button2";
    			this->button2->Size = System::Drawing::Size(75, 23);
    			this->button2->TabIndex = 1;
    			this->button2->Text = L"button2";
    			this->button2->UseVisualStyleBackColor = true;
    			this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);
    			// 
    			// textBox1
    			// 
    			this->textBox1->Location = System::Drawing::Point(59, 93);
    			this->textBox1->Name = L"textBox1";
    			this->textBox1->Size = System::Drawing::Size(100, 22);
    			this->textBox1->TabIndex = 2;
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(8, 16);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(282, 255);
    			this->Controls->Add(this->textBox1);
    			this->Controls->Add(this->button2);
    			this->Controls->Add(this->button1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    #pragma endregion
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    				STicks = GetTickCount64();
    				tx_count=0;
    				aTimer->AutoReset=true;
    				aTimer->Interval = 1000;
    				aTimer->Enabled = true;
    
    			 }
    	private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
    				ETicks = GetTickCount64();
    				__int64 diff=ETicks-STicks;
    				 //DateTime d1= DateTime::Now;
    				 //ETicks=d1.InternalTicks;
    			 }
    
    			void OnTimedEvent( Object^ source, ElapsedEventArgs^ e )
    		   {
    			 count_zählen();
    
    		   }
    			void count_zählen(void)
    			{
    				int testvar;
    				tx_count++;
    				textBox1->Text=Convert::ToString(tx_count);
    				textBox1->Refresh();
    				testvar=Convert::ToInt16(textBox1->Text);
    
    			}
    	};
    }
    


  • Für WinForms solltest du auch dessen Timer (System.Windows.Forms.Timer) benutzen, da der System.Timer in einem eigenen Thread läuft und (direkt) keinen Zugriff auf die GUI haben darf (ansonsten müßtest du Control.Invoke() benutzen).
    Dort heißt dann das Ereignis 'Tick'.

    P.S: Und 'static' solltest du den Timer nicht machen, sondern als ganz normale Membervariable des Forms.

    Bzgl. C++/CLI und WinForms könnte ich jetzt auf den Beitrag von Jochen Kalmbach verweisen, aber diesmal laß ich es -)



  • Vielen Dank!

    Mit dem Forms Timer funktioniert es. Könnte mir evtl. jemand kurz aufzeigen, wie es mit Control.Invoke() funktioniert? Aus den Beispielen in der Hilfe werde ich nicht so recht schlau.



  • Einen Artikel (wenn auch mit Code-Beispielen für C#) bzgl. Control.Invoke() gibt es unter http://www.mycsharp.de/wbb2/thread.php?threadid=33113


Anmelden zum Antworten