Progressbar Value-Change-Event
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.
-
-
Glaub nicht. Du könntest dir ja ein eigenes Control auf Basis der Progressbar erstellen und dort solch ein Event implementieren. Sollte nicht sonderlich schwer sein"Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."
Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
Wie man VisualStudio nutzt? => VisualStudio richtig nutzen -
-
Aktionen sollten normalerweise nicht über solch einen Weg gehen.
Wenn du einfach mehrere Dinge hast die getan werden sollen, dann schreib eine Methode, oder ggf. auch Property, die dann eben alle nötigen Werte mit einem aufruf anpasst...Ich wollte auch mal ne total überflüssige Signatur:
---Leer--- -
-
-
Humax schrieb:
jedes mal machen
Mach Dir eine eigene KlasseMyProgressBar Inherits ProgressBar
und gib ihr das Event.
Feddich.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
-
Humax schrieb:
gänzlich andersFalls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert! -
RodFromGermany schrieb:
Humax schrieb:
jedes mal machenMyProgressBar Inherits ProgressBar
und gib ihr das Event.Feddich.
RodFromGermany schrieb:
und wie?
Hab die PB ganz weg gelassen und einfach für den Vorgang den Mauszeiger in "Cursors.wait" gesetzt -
@Humax So etwa:
Spoiler anzeigen VB.NET-Quellcode
- Public Class MyProgressBar
- Inherits ProgressBar
- Public Event ValueChanged(sender As Object, e As EventArgs) ' Event deklarieren
- Public Overloads Property Value As Integer
- Get
- Return MyBase.Value
- End Get
- Set(value As Integer)
- MyBase.Value = value
- RaiseEvent ValueChanged(Me, EventArgs.Empty) ' Event senden
- End Set
- End Property
- End Class
Dazu eine Form mit MyProgressBar, TrackBar und Label und dies:Spoiler anzeigen VB.NET-Quellcode
- Public Class Form1
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- TrackBar1.Maximum = 100 ' TrackBar1 und MyProgressBar1 haben denselben Max-Wert
- End Sub
- Private Sub MyProgressBar1_ValueChanged(sender As Object, e As EventArgs) Handles MyProgressBar1.ValueChanged
- Label1.Text = MyProgressBar1.Value.ToString ' Wert anzeigen
- End Sub
- Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
- Me.MyProgressBar1.Value = TrackBar1.Value ' Wert setzen
- End Sub
- End Class
Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „RodFromGermany“ ()
-
RodFromGermany schrieb:
Kompilieren
Sollte das deklarieren heißen?
Musste es etwas umschreiben, aber ja das funktioniert prima. Danke
Habe jetzt allerdings auch hier das Problem, das wie bei einer "echten" Progressbar der Balken nicht voll gefüllt (bzw. angezeigt) wird.
Das Maximum der MyProgressbar1 und der sichtbaren Progressbar1 wird berechnet, Value auf 0 gesetzt.
Bei meinen Tests ist das Maximum dann 317 und beide Progressbars haben am ende auch diese Value, aber der grüne Fortschrittsbalken wird nicht mal bis zur hälfte gefüllt (angezeigt, value = wie berechnet 317), wenn ich die Progressbar wieder mit ausblende. Anscheinend geht der Fortschritt zu schnell. Wenn ich anstelle einen timer mit 500MS starte und dort die PB ausblende wird der Fortschritt dann ganz angezeigt.
Gibt es da eine bessere Möglichkeit anstelle des timers oder soll ich das einfach so lassen? -
-
ich hab das mal geschrieben, aber nicht getestet.
Spoiler anzeigen C#-Quellcode
- public class Processbar : Control
- {
- private event Action<Processbar, double> ValueChange;
- private Point _textloc;
- private double _deltaValue;
- private Rectangle _processRect;
- private string _text;
- #region Properties
- private double _maxValue = 100;
- public double MaxValue {
- get => _maxValue;
- set {
- if (MaxValue < Value)
- {
- _maxValue = Value;
- }
- else
- {
- _maxValue = value;
- }
- UpdateDeltaValue();
- Invalidate();
- }
- }
- private double _minValue = 0;
- public double MinValue {
- get => _minValue;
- set {
- if (MinValue > Value)
- {
- _minValue = Value;
- }
- else
- {
- _minValue = value;
- }
- UpdateDeltaValue();
- Invalidate();
- }
- }
- private double _Value;
- public double Value {
- get => _Value;
- set {
- if (Value < MinValue)
- throw new IndexOutOfRangeException();
- if (Value > MaxValue)
- throw new IndexOutOfRangeException();
- _Value = value;
- ValueChange?.Invoke(this, value);
- Invalidate();
- }
- }
- private Color _ProcessColor;
- public Color ProcessColor {
- get => _ProcessColor;
- set {
- _ProcessColor = value;
- BrushProcess = new SolidBrush(value);
- Invalidate();
- }
- }
- private bool _ValueVisible;
- public bool ValueVisible {
- get => _ValueVisible;
- set {
- _ValueVisible = value;
- Invalidate();
- }
- }
- #endregion
- #region Settings
- private SolidBrush BrushProcess;
- #endregion
- public Processbar()
- {
- ControlStyles styles = ControlStyles.ResizeRedraw
- | ControlStyles.SupportsTransparentBackColor
- | ControlStyles.UserPaint;
- SetStyle(styles, true);
- _maxValue = 100;
- _minValue = 0;
- _Value = 20;
- ValueVisible = false;
- }
- protected override void OnPaint(PaintEventArgs e)
- {
- Graphics graphics = e.Graphics;
- if (BrushProcess != null){
- graphics.FillRectangle(BrushProcess, _processRect);
- if (ValueVisible)
- {
- TextRenderer.DrawText(graphics, _text, Font, _textloc, ForeColor);
- }
- }
- }
- protected override void OnSizeChanged(EventArgs e)
- {
- UpdateRect();
- }
- private void UpdateRect()
- {
- double step = Width / _deltaValue;
- double width = (Value - MinValue) * step;
- Point topcorner = Point.Empty;
- Size progressSize = new Size((int) width, Height);
- _processRect = new Rectangle(Point.Empty, progressSize);
- UpdateText();
- }
- private void UpdateDeltaValue()
- {
- _deltaValue = MaxValue - MinValue;
- UpdateText();
- }
- private void UpdateText()
- {
- double textValue = 100 * Value / _deltaValue;
- _text = $"{Math.Round(textValue, 1)}%";
- Size sizeText = TextRenderer.MeasureText(_text, Font);
- int textX = (Width - sizeText.Width) / 2;
- int textY = (Height - sizeText.Height) / 2;
- _textloc = new Point(textX, textY);
- }
- }
-
VB1963 schrieb:
Versuche es einmal mit der Methode
Progressbar.Refresh()
Hatte ich auch schon probiert...
-
Es wäre gut, wenn du deine ganze Codepassage vom Progressbar und wie du die Bar anwendest, herzeigen würdest...
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB1963“ ()
-
Also der Anwender öffnet eine Datei, die dann eingelesen und verarbeitet wird.
Es wird dabei unter anderem ein Treeview befüllt.
Für jeden Knoten wird im Treeview die Value-Eigenschaft der Progressbar um 1 erhöht. (Vorher wurde die max Value ermittelt und gesetzt).
Da je nach eingelesener Datei große Unterschiede in der Anzahl der Knoten sind (es können blos zehn sein, aber auch mehrere hundert), dauert es unterschiedlich lange bis die Datei verarbeitet und der Inhalt im Treeview angezeigt wird, deshalb zur Fortschrittsanzeige die Progressbar.
Code sieht so aus:
Dann wird das Treeview gefüllt (habe ich mal verkürzt dargestellt, der ablauf ist der selbe, nur mit mehr Knoten...)
VB.NET-Quellcode
- Public Sub TreeViewfüllen()
- If Spielstand.basis(0) Is Nothing Then Exit Sub
- Dim BasisIndex As Integer = 0
- Dim NodeIndex As Integer = 0
- TreeView1.Nodes.Clear()
- For Each Basis In Spielstand.basis
- MyProgressBar1.Value += 1
- TreeView1.Nodes.Add(Basis.Name)
- My.Application.DoEvents()
- Next
- TreeView1.Focus()
- TreeView1.SelectedNode = TreeView1.Nodes(0)
- End Sub
und anschließend die PB wieder ausgeblendet
Wenn ich das Progressbar1.visible=false in einen Timer aufrufe, nach 500ms wird der Fortschrittsbalken ganz gefüllt, ansonsten nur so bis zur Hälfte.
Ist Für mich im Grunde mit dem Timer OK! -
-
Basis kann ein Wert von 1- 8 sein.
Darin können dann ein paar Schiffe sein, beliebig viele Gegenstände, beliebig viele Soldaten etc.
Ich habe hier Spielstände da wird die Progressbar.Maximum mit 317 berechnet, aber auch nur mit 10, das ist immer anders, aber ich habe geprüft, wenn ich die Progressbar ausblende, dann hat progressbar1.value den selben Wert wie progressbar1.maximum, also sollte der grüne Fortschrittsbalken ganz voll sein. - Was er ja auch ist, wenn ich dann im Timer die PB ausblende -
-
Ähnliche Themen
-
VbTutorials11 - - Sonstige Problemstellungen