C# Timeout möglich / Formübergreifende Variablen

Kantholy

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
323
Hiho Leute... ich bin seit nem knappen Jahr am C# lernen, bis jetzt hab ich ausschliesslich Konsolenapps geschrieben und jetzt dachte ich wagst dich mal an eine WindowsForms Anwendung...

Naja, wie ich natürlich wieder drauf bin reicht ja ein Fenster nicht sondern müssen gleich zwei sein - und Systemtray mit Kontextmenü natürlich^^

Naja, ich hab mir gedacht, bastelst dir halt nen kleinen Countdown zusammen...

So, jetzt möchte ich quasi in einem Fenster meine Einstellungen treffen wie lang ich den Countdown haben möchte und ein anderes Fenster soll mir quasi einen Fortschrittsbalken anzeigen, desweiteren möchte ich gern im Kontextmenü des Systemtrayicons die Zeit heruntergezählt bekommen...

Zu den Formübergreifenden Variablen:

Das brauch ich sowohl im Systemtray als auch in meinem zweiten Fenster die Variable der Gesamtzeit (in Sekunden) aus der Mainform quasi....

wie funktioniert das?



und das nächste:

Gibt es die Möglichkeit eines Timeout in C#?
Also quasi, dass nach einer bestimmten Zeit eine Funktion eine andere (oder sich selbst) wieder aufruft, diese (also die aufrufende Funktion) aber nach dem aufrufen selbst beendet wird?

Sowas ähnliches wie setTimeout("foor()", 1000); bei Javascript...

Dies bräuchte ich für den Fortschrittsbalken, denn der solls sich wenns geht sekündlich aktualisieren aus dem Wert der Mainform und diesen dann quasi als Fortschrittsbalken anzeigen.

ich habs mit einer Rekursiven Funktion probiert, die ich beim laden der Form ausführe, dass hat aber zur Folge, dass diese Funktion bis zum Ende ausgeführt wird, und danach erst der Inhalt des Fensters anzeigt wird - verfehlt irgentwie den Sinn eines Fortschrittsbalkens, wenn der erst angezeigt wird, wenn die Zeit abgelaufen ist...
 

Anhänge

  • ultimatecountdown.png
    ultimatecountdown.png
    124,1 KB · Aufrufe: 428
Wie wärs mit übergabe von Vars per "ref" und nem Timer ?
 
kann mir wer mal ein beispiel mit dem ref machen? MSDN macht mich da auch net wirklich schlauer wie ich des verwenden soll...
 
Code:
private DateTime countdown;
private Timer timer = new Timer();
public Konstruktor(ref DateTime time)
{
       countdown = time;
       timer.Intervall = 1000;
       timer.Tick += new EventHandel(timer_tick)
       timer.Start();
}

private void timer_tick(object sender, EventArgs e)
{
       if (countdown == DateTime.Now)
               MessageBox.Show("Hallo welt");
       //do this do that
}

Das ganze hab ich jetzt aber ohne IDE geschrieben also keine Garantie das das alles Syntaktisch korrekt ist :)
 
Simple geschichte... anstatt das du eine kopie des DateTime's übergibst, übergibst du die Variable per Referenz d.h. wenn du den Wert da drin änderst wirken sich die Änderungen auch auf das darunter liegende aus.
 
okay, vielleich is blöd beschrieben, pass auf, in meiner form "mainwindow" hab hab quasi die einstellungen und da sind die ganzen variablen drin..
Code:
mainwindow.cs

                dCTO = ((double)iSecsLeft / (double)iSecsStart) * 100;
                dCTO = 100-Math.Round(dCTO);

jetzt hab ich eine weitere window.form und will damit eine progressbar darstellen

so, jetzt war mein gedanke:

Code:
progressbarform.cs

            mainwindow form_main = new mainwindow();
            progressBar1.Value = Convert.ToInt32(form_main.dCTO);

aber das ist die falsche variante: erstens hab ich unendlich viele systemtrayicons und zweitens geht das nur mit dem startwert der variable - der is standard null, aber ich berechne ja in dem timer die variable dCTO immer neu...


so, wie kann ich jetzt in der progressbarform die variable aus der mainwindow form benutzen?
 
Könntest du evtl. noch den Kot ääääh Code vom Konstruktor von der ProgressForm posten ?
 
Du willst also von einem Form auf Variablen eines anderen zugreifen.
Am einfachsten wäre es, eine Referenz auf das Hauptfenster als Parameter dem Konstruktor des 2. Forms zu übergeben.

Code im MainForm:
Code:
SecondForm sf = new SecondForm(this); //Referenz auf aktuelles Form übergeben

Code im 2. Form:
Code:
MainForm mainform;

public SecondForm(MainForm mf)
        {
            InitializeComponent();
            mainform = mf;
        }

Dann kann man auch auf die Eigenschaften/Variablen/Controls des MainForm vom 2. Form aus zugreifen z.B:
Code:
progressBar1.Value = mainform.dCTO
Allerdings müssen die betreffenden Werte (hier: dCTO) im MainForm den Modifizierer public haben und global deklariert sein.

Es gibt allerdings noch andere Wege: http://www.google.de/search?hl=de&q=passing+variables+between+forms+c#&btnG=Google-Suche&meta=

Bei der 2. Frage könnte ich auch nur einen Timer empfehlen.

1 Jahr lang nur Konsole? Ist das nicht langweilig geworden?:D
 
okay, danke erstmal für die kompetente Hilfe Leute :-)

werd ich gleich mal ausprobieren


@Konsole: naja, ich hab viel viel rumexperimentiert und hab mich an kleinen Spielchen für die Konsole versucht, an der Kollisionsabfrage in meinem Konsolentetris bin ich allerdings gescheitert :p
 
also ich bekomms irgentwie net hin :-(

hier mal jetzt mein kompletter quellcode:

Overview.cs
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace UltimateCountdown
{
    public partial class Overview : Form
    {

        mainwindow form_main = new mainwindow();
        double dCTO = 0.0;

        public Overview()
        {
            InitializeComponent();
            timer1.Enabled = true;
            dCTO = form_main.dCTO;
            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            progressBar1.Value = Convert.ToInt32(dCTO);


            if (progressBar1.Value == 100)
             timer1.Enabled = false;
        }
    }
}


wenn ich aber dieses
Code:
mainwindow form_main = new mainwindow();
reinschreib kommt irgentwas mit OverflowStackExecption...


und hier mal die abgespeckte Mainform

Code:
namespace UltimateCountdown
{
    public partial class mainwindow : Form
    {
        Overview Overview = new Overview();
        public int iSecsLeft = 0;
        public int iSecsStart = 0;
        public double dCTO = 0.0;
        public bool ctd_started = false;


        public mainwindow()
        {
            InitializeComponent();
        }

        private void showProgress_Click(object sender, EventArgs e)
        {
            Overview.Show();
        }
		
		#region
		//...
		#endregion

        private void timer1_Tick(object sender, EventArgs e)
        {

            if(ctd_started)
                iSecsLeft--;
            if (iSecsLeft > 0)
            {
                //debug.Text = iSecsLeft.ToString()
                dCTO = ((double)iSecsLeft / (double)iSecsStart) * 100;
                dCTO = 100-Math.Round(dCTO);
                debug.Text = Convert.ToString(dCTO);
            }
            else
            {
                timer1.Enabled = false;
                MessageBox.Show("Countdown finished");
            }
        }

    }
}
 
Die rufen sich gegenseitig auf das is klar das der Stack da überläuft weil jede Instanz von dem einen wieder ne Instanz von dem anderen erstellt
 
kann ich den net einfach zur laufzeit auf die scheiss variable zugreifen? (kann ich vllt. irgentwie die physikalische adresse irgentwie rausfinden und mit der dann einfach zugreifen... omg, kein bock mehr, gleich schmeiss ich das 2. fenster weg)
 
Code:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace UltimateCountdown
{
    public partial class Overview : Form
    {
        [B]private mainwindow frmMainWindow;[/B]

        public Overview(mainwindow window)
        {
            InitializeComponent();
            timer1.Enabled = true;
            [B]frmMainWindow = window;[/B]
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

            progressBar1.Value = Convert.ToInt32([B]frmMainWindow.dCTO[/B]);


            if (progressBar1.Value == 100)
             timer1.Enabled = false;
        }
    }
}

Code:
namespace UltimateCountdown
{
    public partial class mainwindow : Form
    {
        public int iSecsLeft = 0;
        public int iSecsStart = 0;
        public double dCTO = 0.0;
        public bool ctd_started = false;


        public mainwindow()
        {
            InitializeComponent();
        }

        private void showProgress_Click(object sender, EventArgs e)
        {
            [B]Overview overview = new Overview(this);
            overview.Show();[/B]
        }
		
		#region
		//...
		#endregion

        private void timer1_Tick(object sender, EventArgs e)
        {

            if(ctd_started)
                iSecsLeft--;
            if (iSecsLeft > 0)
            {
                //debug.Text = iSecsLeft.ToString()
                dCTO = ((double)iSecsLeft / (double)iSecsStart) * 100;
                dCTO = 100-Math.Round(dCTO);
                debug.Text = Convert.ToString(dCTO);
            }
            else
            {
                [B]timer1.Stop(); //anstatt timer1.Enabled = false;[/B]
                MessageBox.Show("Countdown finished");
            }
        }

    }
}

versuchs mal so
 
Zuletzt bearbeitet:
okay Leute, danke euch allen, aber heute ist es endlich so weit:

Ich hab die erste Version quasi released, wer Bock hat sich das ganze mal anzugucken: Immer ran an den Speck:

Download: UltimateCountdown (ganz unten is der Downloadlink, dazwischen nur paar Bildchen und bisschen Blah Blah, ein typischer Blog eben^^, nebenbei gibts mein tolles UI noch zu bewundern :-))
 
Zurück
Oben