Laden...

Progessbar mit >100% füllen: Balken soll auf kurz auf voll springen u. dann den Überschuss anzeigen

Erstellt von Gorgomir vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.943 Views
Thema geschlossen
G
Gorgomir Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren
Progessbar mit >100% füllen: Balken soll auf kurz auf voll springen u. dann den Überschuss anzeigen

Hier ersteinmal der Code:


  int ep = 0;
                int epforlvlup = 15;
                int epget = 3;
 
                this.ep = ep + epget;
                richTextBox1.AppendText("Der Gegner wurde besiegt!\r\n\n");
                label3.Text = "Gegner Leben: 0/100";
                label4.Text = "Erfahrungspunkte:" + ep + "/" + epforlvlup + "\r\n\n";
                this.progressBar1.Maximum = epforlvlup;
                this.progressBar1.Value = ep;
               
                if (ep >= epforlvlup || ep>epforlvlup)
                {
                    stufe++;
                    //epforlvlup++;
                    this.epforlvlup = epforlvlup * 25 / 100 + epforlvlup;
                    this.ep = 0;
                    richTextBox1.AppendText("Herzlichen Glückwunsch, ihr seid eine Stufe aufgestiegen!\r\n\n");
                    this.progressBar1.Maximum = epforlvlup;
                    this.progressBar1.Value = 0;
                }

Mein Problem ist nun folgendes:

Ich habe diesen Code in einen Button geschrieben, wenn ich drauf drücke, werden EP berechnet und dann in der Progressbar angezeigt. Wenn ep ≥ epforlvlup ist, dann wir einem Laben die Stufe erhöht. Funktioniert ganz gut, aber ab Stufe 3 gibt es ein Problem. Von Stufe 3 bis Stufe 4 werden 22 EP benötigt, das geht bis 21/22 EP gut, dann kommt mein Problem.

Wenn jetzt die nächsten EP gut geschrieben werden, steht der Zähler quasi auf 24/22 und in diesem Moment schmiert die Progressbar ab, weil progressBar1.Value = ep.

Fehlermeldung:
Der Fehler lautet: ArgumentOutOfRangeExeption wurde niciht behandelt. Der Wert 24 ist für Value ungültig. Value sollte zwischen 'minimum' und 'maximum' liegen.
Parametername: Value

Ich habe schon vieles versucht. Was ich aber eigentlich will ist, dass die Progressbar sich einfach auf = setzt und die überschüssigen EP anschließend in der "neuen" progessbar nach dem Levlup anzeigt.

Es soll also einfach weiterlaufen und die überschüssigen EP dann anzeigen.

Ich hoffe, dass ihr versteht was ich meine.^^

Mfg, Gorgomir.

3.430 Beiträge seit 2007
vor 11 Jahren

Hallo Gorgomir,

also das Problem ist einfach dass du der Progressbar einen zu großen Wert mitgibst.
D.h. du gibst 24 mit wobei das Maximum 22 ist.
Zeig einfach in der Progressbar die 22 an und den Rest zeigst du in deiner zweiten Progressbar an.

Kurz gesagt musst du einfach abfragen ob dein EP größer als das Maximum der Progressbar ist. Wenn es das ist, dann zeigst du das Maximum in der Progressbar an. Ziehst das Maximum vom EP Wert ab und zeigst den Rest in der zweiten Progressbar an

Grüße
Michael

G
Gorgomir Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

Hi, deine Lösung ist logisch, aber leider nicht die die ich suche.

Ich möchte, dass die Progressbar, dass was zuviel ist erst speichert, dann ein lvl durch führt und sich leert und den Überhscuss anschließend anzeigt, alles in der selben progressbar.

Kurz gesagt: die progressbar soll sich wie die EP Leiste in WOW verhalten.

Mfg, Gorgomir.

EDIT: Habe noch ein Bild von dem Ganzen angehängt.

16.842 Beiträge seit 2008
vor 11 Jahren

Die Standard-Progressbar von Windows Forms kann keine Überlappung und keiner Überfüllung. Das alles hättest Du aber auch einfach der Fehlermeldung entnehmen können und in der Dokumentation nachlesen.
Du kannst nicht erwarten, dass Dein Wille und Wunsch und Erwartung überall umgesetzt ist. Das musst Du in diesem Fall einfach selbst umsetzen.

Entweder Du schreibst Dir ein eigenes Control oder suchst Dir irgendwelche Bibliotheken, die das können.
Andere Möglichkeit:

  1. Du füllst Deine Progressbar bis zum Maximum (Standard: Grüner Balken auf grauem Hintergrund).
  2. Wenn die Progressbar voll ist setzt Du den Wert auf 0, die Hintergrundfarbe auf Grün und Vordergrundfarbe auf Rot.
  3. Anschließend wieder füllen und ggfl. die nächste Stufe der Farbe erreichen.
G
Gorgomir Themenstarter:in
9 Beiträge seit 2012
vor 11 Jahren

Problem gelöst und zwar habe ich folgendes gemacht: this.progressBar1.Value = ep&epforlvlup; statt this.progressBar1.Value = ep;

Jetzt machts was ich will.^^

Mfg, Gorgomir.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo Gorgomir,

progressBar1.Value = ep&epforlvlup; ist Unsinn. Das ist eine Bitweise verUNDung. Das mag bei bestimmten Zahlen dazu führen, dass höchstens Maximum gesetzt wird, bei anderen Zahlen kann völliger Unsinn herauskommen.

Mit progressBar1.Value = Math.Min (ep, epforlvlup); wird ein Schuh daraus.

Wenn der ProgressBar nach einem kurzen Moment auf den Wert nach dem LevelUp springen soll, verwende einen System.Windows.Forms.Timer. Thread.Sleep oder ähnliches scheidet aus, wie du in [FAQ] Warum blockiert mein GUI? nachlesen kannst.

Insgesamt fällt deine Frage aber unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1. Die grundsätzliche Benutzung von Controls setzen wir als bekannt voraus.

herbivore

Thema geschlossen