Progressbar, Prozentrechnung

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von sadhow.

    Progressbar, Prozentrechnung

    Hi,

    ich versuche in meine progressbar eine funktion einzubauen wo man mit der maus den value ändern kann nur leider bekomme ich es nicht auf die reihe es richtig auszurechnen.
    mein problem ist nun das wenn ich die werte ändere also nicht min =0 / max = 100 sondern zb. min = 200 / max = 500 und dann mit der maus auf die mitte klicke bekomme ich nicht die mitte sonder irg was anderes. es hat auch noch was mit der breite der progressbar zutuhen aber ich komme auf keinen grünen zweik. Danke.


    VB.NET-Quellcode

    1. Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
    2. MyBase.OnMouseMove(e)
    3. If e.Button = Windows.Forms.MouseButtons.Left Then
    4. Dim Diff As Integer = Maximum - Minimum
    5. Value = CInt(e.X / ClientRectangle.Width * Diff)
    6. Me.Invalidate()
    7. End If
    8. End Sub
    Du musst das hier einfach umformen:

    Value_Progressbar/Maximum_Progressbar = CursorPosition/Breite_Progressbar

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim pt As Point
    3. Private Sub ProgressBar1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ProgressBar1.MouseMove
    4. pt = e.Location
    5. End Sub
    6. Private Sub ProgressBar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProgressBar1.Click
    7. 'Value_Progressbar/Maximum_Progressbar = CursorPosition/Breite_Progressbar
    8. '(CursorPosition/Breite_Progressbar) * Maximum_Progressbar = Value_Progressbar
    9. Dim new_value = (pt.X / ProgressBar1.Width) * (ProgressBar1.Maximum - ProgressBar1.Minimum)
    10. ProgressBar1.Value = Math.Round(new_value, 0)
    11. End Sub
    12. End Class

    8-) faxe1008 8-)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „faxe1008“ ()

    Wenn ich das so machen geht das nicht. Ich klicke mit der maus auf 100% also wie aus mein bs. 500 aber es wird nur 400 angezeigt in der progressbar.

    wenn die pbar size.x = 400 , min= 100 , max= 500 und man dann in die mitte klickt müsste 300 raus kommen aber kommt es nicht. komischer weise ich versuch das jetzt schon mit den verschiedensten formeln aber keine klappt so richtig etwar nur 0-100 dann gehts aber nicht wenn alles unterschiedlich ist.

    VB.NET-Quellcode

    1. Dim pt As Point
    2. Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
    3. MyBase.OnMouseDown(e)
    4. If MoveValue Then
    5. If e.Button = Windows.Forms.MouseButtons.Left Then
    6. Dim n_val As Decimal = (pt.X / ClientRectangle.Width) * (Maximum - Minimum)
    7. Value = Math.Round(n_val, 0)
    8. End If
    9. End If
    10. End Sub
    11. Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
    12. MyBase.OnMouseMove(e)
    13. If MoveValue Then
    14. pt = e.Location
    15. End If
    16. End Sub
    Moin,

    SpaceyX hat dir doch schon die Lösung genannt, der simple Dreisatz. Hab dir mal ein Beispiel runtergetippt.

    VB.NET-Quellcode

    1. Public Class PBar
    2. Inherits ProgressBar
    3. Sub New()
    4. Me.Minimum = 0
    5. Me.Maximum = 100
    6. End Sub
    7. Protected Overrides Sub OnMouseClick(e As MouseEventArgs)
    8. MyBase.OnMouseClick(e)
    9. Me.Value = CInt(e.X / Me.Width * 100)
    10. End Sub
    11. Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
    12. MyBase.OnMouseMove(e)
    13. If e.Button = Windows.Forms.MouseButtons.Left Then
    14. If e.X <= Me.Width AndAlso e.X > 0 Then
    15. Me.Value = CInt(e.X / Me.Width * 100)
    16. ElseIf e.X < 0 Then
    17. Me.Value = Minimum
    18. ElseIf e.X > Me.Width Then
    19. Me.Value = Maximum
    20. End If
    21. End If
    22. End Sub
    23. End Class


    mfG
    Hi
    übrigens, wenn der Nenner * 100 gerechnet wird, kann auf Double verzichtet werden:

    VB.NET-Quellcode

    1. Dim x As Integer = 100 * e.X \ DirectCast(sender, Control).ClientSize.Width

    Zu beachten ist hier die Integer-Division \. Außerdem kann es zu einem Überlauf kommen, wenn e.X > Integer.MaxValue \ 100 wäre (was aber in diesem Fall keine Rolle spielt, sollte man nur im Hinterkopf haben).

    Gruß
    ~blaze~
    Ja wenn du die standart werte nimmst dann geht das ja hatte ich schon wenn min 0 max 100 dann gehts ohne probleme. es geht ja darum wenn die werte unterschiedlich sind das es dann immer noch geht was nicht der fall ist. versuch es selber es geht so nicht mit der formel.
    Ist schon "unfein" wenn ein die Mathematik einen Strich durch die Rechnung macht :D , ändere den Code von mir mal etwas ab, ist aber immer noch der Dreisatz :S

    VB.NET-Quellcode

    1. If e.X <= Me.Width AndAlso e.X > 0 Then
    2. Me.Value = CInt(e.X / Me.Width * Maximum)
    3. ElseIf e.X < 0 Then
    4. Me.Value = 0
    5. ElseIf e.X > Me.Width Then
    6. Me.Value = Maximum
    7. End If


    dann geht es auch mit dem Maximum-Wert den du bestimmst, vorausgesetzt das Maximum ist <=Integer.MaxValue

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Derfuhr“ ()

    So jetzt mal mein stand obs richtig ist kp aber ich komm der sache näher. Is aber leider falsch herrum


    VB.NET-Quellcode

    1. Dim diff = ProgressBar1.Minimum - 100
    2. Dim re = (ProgressBar1.Value / ProgressBar1.Maximum) * (ProgressBar1.Minimum - 100)
    3. Label1.Text = Math.Abs(re - diff) & " %"



    edit:
    das eigliche problem ist ja weil min nicht 0 ist sonder höher sonst würde ddie ganzen formeln von euch gehen hab ich gerade festgestellt.
    Bilder
    • 2.PNG

      7,4 kB, 723×297, 170 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sadhow“ ()

    Wieso minus 100?

    Dim re = (ProgressBar1.Value / ProgressBar1.Maximum) * (ProgressBar1.Minimum - 100)

    meinetwegen auch minus 100
    Dim re = (100 / ProgressBar1.Maximum-100) * (ProgressBar1.Value-100)

    Du kannst beim Dreisatzrechnen nicht eine Seite ohne lassen. Wenn du auf der einen Seite hundert abziehst musst du das auch auf der anderen Seite die auch abziehen.

    Ich hoffe das ist richtig. Ist jemand andere Meinung? Vielleicht habe ich das Problem falsch verstanden.

    Nochmals zur Verdeutlichung:

    Mein Prgramm gibt aus: 503 MB verarbeitet.
    Ich weiß das es 2000 MB gibt.
    Es ist wichtig das du immer Max und Min weißt.
    Also:
    100/MAX*MIN
    100/2000*503=(ProgressBar1.Value=25,25 Prozent)

    Wie gesagt 100/MAX*MIN da läßt sich alles von ableiten.
    Da geht es anders rum. Ich habe 25% abgearbeitet,
    dann zeige ich dem Benutzer an:
    2000/100*25=500MB


    Weiß jetzt nicht, ob ich dein Problem getroffen habe. aber ich ich hoffe ich konnte helfen.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Gelöschter Benutzer“ ()

    Und wie wird das jetzt angewand wenn man es mit e.x macht ?! Weil das ist das problem ich bekomme die maus eingabe nicht hin weil der wert min nicht 0 ist.

    Wenn....

    min 250
    max 750
    wigth 150
    e.X 75

    Wie kommt man da jetzt auf eine lösung ?! Weil dann muss 50% raus kommen in der progressbar.
    @sadhow:: Was für eine mathematische Ausbildung hast Du bisher gehabt?
    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!