C# Title aktualisieren

slowpoke

Ensign
Registriert
Feb. 2007
Beiträge
241
Hallo zusammen!

Ich beschäftige mich mit C#, und habe folgendes Problem/ Herausforderung:

Es gibt eine Prozentangabe in meinem Programm. Jetzt möchte ich gerne, dass die Prozentangabe als Form Title angezeigt wird. Das an sich ist kein großes Problem, this.Text = Prozentangabe, aber ich möchte auch, dass sie sich ständig aktualisiert. Das passiert im Programm in einem timer1_Tick. Aber da kann ich ja nicht Form1.Text = Prozent; hinzufügen.

Wie schaffe ich es also, dass die sich aktualisierende Prozentvariable auch im Form1.Text ist?

Noch größere Herausforderung:
Kann man einstellen, dass der Form Title ein statischer Text ist (Standard), aber gleichzeitig in der Taskleiste eine Prozentzahl statt des Titles angezeigt wird?

Danke im Vorhinein!
slowpoke
 
Wegen dem setzen des Titels könntest du vlt. mit dem BackgroundWorker Erfolg haben.
 
Hmm BackgroundWorker is hier übertrieben, er hat ja schon ein Timer. Weiß ja nicht mit was du arbeitest, Forms oder WPF. In Forms musst du über Form1.BeginInvoke dein Titel aktualisieren in WPF geht das über den Dispatcher.BeginInvoke, beide nehmen jeweils eine Action in welcher dein Code ausgeführt wird. Das mit der Taskleiste wird schwieriger, wüsste keine Lösung dafür.
 
Ich arbeite mit Visual Studio 2008 und Windows Forms.

Danke schon einmal für eure Antworten, leider komme ich mit dem Form1.BeginInvoke nicht richtig klar. Wie muss so ein Term aussehen, wenn es um Form1.Text und eine int Prozent gibt?

Das MSDN von Microsoft ist für mich mehr Kryptografie als Hilfe ;)

LG
slowpoke
 
an deiner stelle würde ich mir mal das windows api code pack ansehen. in windows 7 gibts ja spezielle funktionen, damit in der taskbar eine progressbar angezeigt werden kann (ich glaube die funktionen sind auch im 4er .net enthalten, also müsste das theoretisch auch ausreichen). falls nicht einfach die dlls des code packs mitliefern.
 
slowpoke schrieb:
Hallo zusammen!

Ich beschäftige mich mit C#, und habe folgendes Problem/ Herausforderung:

Es gibt eine Prozentangabe in meinem Programm. Jetzt möchte ich gerne, dass die Prozentangabe als Form Title angezeigt wird. Das an sich ist kein großes Problem, this.Text = Prozentangabe, aber ich möchte auch, dass sie sich ständig aktualisiert. Das passiert im Programm in einem timer1_Tick. Aber da kann ich ja nicht Form1.Text = Prozent; hinzufügen.

Wie schaffe ich es also, dass die sich aktualisierende Prozentvariable auch im Form1.Text ist?

Noch größere Herausforderung:
Kann man einstellen, dass der Form Title ein statischer Text ist (Standard), aber gleichzeitig in der Taskleiste eine Prozentzahl statt des Titles angezeigt wird?

Danke im Vorhinein!
slowpoke

Du mußt im Timer ein Invoke verwenden, da er in einem anderen Thread als die Hauptform läuft und deshalb die Steuerelemente nicht manipulieren kann.
Entweder du schreibst in deinen Form-Konstruktur die Zeile

Control.CheckForIllegalCrossThreadCalls = false;

was gefährlic hsein kann, oder du Setzt den Text im Timer-Event so:

if (InvokeRequired)
{
Invoke((MethodInvoker)delegate { this.Text = "Der entsprechende Text"; });
}
 
toeffi schrieb:
Was genau bereitet dir denn Probleme?

Ich weiß nicht, was ich genau schreiben muss.
Habe im Timer:

Code:
Form1.BeginInvoke(new InvokeDelegate(Text = Prozent));

Das gibt die Fehlermeldung, dass der Namespace für 'InvokeDelegate' nicht gefunden werden kann.

Fehlt mir noch ein Namespace, oder muss ich "InvokeDelegate" durch etwas ersetzen?

Danke!
 
slowpoke schrieb:
Wie muss so ein Term aussehen, wenn es um Form1.Text und eine int Prozent gibt?
z.b. so:
Code:
public string NewItem
{
  set
  {
    if( this.listBox1.InvokeRequired )
      this.Invoke(
        (MethodInvoker)delegate
        {
          this.listBox1.Items.Add( value );
          this.listBox1.SelectedIndex = this.listBox1.Items.Count - 1;
        }
      );
    else
      this.listBox1.Items.Add( value );
  }
}
 
Lambada?

Code:
           this.BeginInvoke(() =>
                {
                    this.Form1.Text = Prozent.ToString();
                }
            );

1. Cannot convert lambda expression to type System.Delegate because it is not a Delegate type

2. 'WindowsFormsApplication1.Form1' does not contain a definition for 'Form1' and no extension method 'Form1' accepting a first argument of type 'WindowsFormsApplication1.Form1' could be found (are you missing a using directive or an assembly reference?)

Warum klappt das bei mir nicht?
Sorry für die Anfängerfragen ;) Bin noch in der Startphase..
 
Den zweiten Fehler bekomme ich aber nicht weg, habe alle Varianten von "Form" ausprobiert.

Form1, Form1(), Form, Form().....

Hast Du/ habt ihr da auch noch einen Tipp für mich? :)

'WindowsFormsApplication1.Form1' does not contain a definition for 'Form1' and no extension method 'Form1' accepting a first argument of type 'WindowsFormsApplication1.Form1' could be found (are you missing a using directive or an assembly reference?)

Meine usings:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
 
Etwas anstrengen könntest du deinen Kopf aber auch mal ;)

Ich habe this. geschrieben.wenn du schon in der aktuellen Form1 bist, dann ist klar warum Form1 nicht gefunden werden kann. Benutze doch einfach this.
 
Ich dachte ich müsste noch auf Form1 verweisen :D

Jetzt funktioniert es, danke euch und vor allem Dir, toeffi.
Nun kann ich mir neue Sachen für mein Programm einfallen lassen... :cool_alt:

LG
slowpoke
 
Du kannst auch einfach in der Timer Methode das Textattribut setzen und dann mit Application.DoEvents(); die EventQueue abarbeiten lassen.
 
@NetCrack: Diese Lösung ist eher schlecht als Recht. DoEvents fordert JEDES Event auf das es abgearbeitet wird, heißt also wenn der User wild rumdrückt irgendwo auf Buttons werden auch diese Events immer ausgeführt. Die Methode mit dem Timer und dem Invoke ist meines erachtens die einzig Vernünftige.
 
bei Invoke kann man keine Anonyme Delegates einsetzen, deswegen klappt es auch nicht!

Ich habe sowas ähnliches geschrieben! ich sende hier mal den Code.

Code:
///Diesen Codenabschnitt kannst du einfach so hinnehmen. 
///Invoking ist nur eine Methode die den Invoke Einleitet.
...
if (tag > maxdays)
{
    Invoking(1, "Einsatz Nr.: " + i + ", Tag: " + dr["tag"] + " kann für diesen Monat nicht geladen werden. Monat ist kürzer als die Vorlagenmonat.");
    numoflables--;
}
...

Code:
delegate void SetValueText(int len, String text);

private void TextValue(int len, String text)
{
    MeinControl.ProgressPush(len, text); 
//Wenn du das über einen Separaten Form mit Progressbar, 
//sollst du die Klasse des Forms angeben, sonst den Bezeichner deiner Progressbar.
}

private void Invoking(int len, String text)
{
    if (MeinControl.InvokeRequired)
    {
        SetValueText v = new SetValueText(TextValue);
        this.Invoke(v, new object[2] { len, text });
    }
    else { TextValue(len, text); }
}

jetzt kommt die Methode PushProgressbar. Wieso this.Invoke(...) funktioniert habe ich keine ahnung. Es klappt auch wenn du deine Klasse Invokest. Ergebnis ist der gleicher. Ich denke es funktiniert weil es this in den anderen Thread sich befindet wie ProgressBar.

Code:
/// <summary>
/// Addiert zum alten Wert den neuen Wert der Progressbar.
/// </summary>
/// <param name="len">Länge des Wertes was zum Gesamtwert addiert werden sollte.</param>
/// <param name="text">Beschreibung zu der Operation.</param>
/// <returns></returns>
public int ProgressPush(int len, String text)
{
    try
    {
        if (LadeProgress.Value >= LadeProgress.Maximum)
            return LadeProgress.Maximum;
        LadeProgress.Value += len; ///Musst du jetzt aufpassen wie es behandelt wird wenn
        InfoBox.Text = text; ///das Maximum des Ladebalker erreicht wurde.

    }
    catch (Exception e)
    {
        ...
    }
    return 0;
}
 
@roker: Danke für deinen Code, aber was willst du uns damit jetzt sagen? Wir haben doch schon gezeigt wie man vorgehen muss oder verstehe ich gerade dein Ansatz nicht?
 
Die Invoke-Variante von teoffi funktioniert bei mir aber einwandfrei.

Gibt es dennoch einen Grund jetzt noch zu wechseln?

Danke trotzdem für Deinen Code, roker!

LG
slowpoke
 
Zurück
Oben