Dezimalstellen in einer Trackbar
-
So ich schon wieder.
Bei der Hitze kann ich irgendwie nicht richtig denken
So die original Trackbar kann nur mit ganzen Zahlen umgehen, also dachte ich ich überschreibe die Trackbar und mache eine eigene.
Nun gut, aber ich suchte erstmal in google ob nicht schon dort was gibt. Ok was gefunden aber funktioniert nicht so ganz, der Berechnet nur Stuß und gibt an 0,004 dann beim nächsten mal sowas wie 0,000004 und so weiter.
Also meine Trackbar sollte folgendes können.
Der Minimalbereich soll bei -10 und der Maximalbereich bei 10 liegen.
Durch den Schieber sollen auch Dezimalwerte eingestellt werde die z.B bei 1,5 oder 2,6 liegen.Dachte das wäre ja nicht schwer wenn ich die Methoden überschreibe. Selbst hab ich es nicht ganz hinbekommen.
Hier den Code den ich im Internet gefunden habe:
public partial class TrackBarDecimals : TrackBar { private decimal factor = 0.10M; private decimal _value = 4; private decimal _minimum = 0; private decimal _maximum = 10; private decimal _largeChange = 2; private decimal _smallChange = 1; private decimal _tickFrequency = 1; private void RecalcValue () { Value = (decimal) (Value * factor); } protected override void OnValueChanged (EventArgs e) { base.OnValueChanged (e); RecalcValue (); this.Invalidate (); } protected override void OnScroll (EventArgs e) { base.OnScroll (e); RecalcValue (); this.Invalidate (); } [Browsable (true)] public new decimal Maximum { get { return (decimal) (_maximum * factor); } set { _maximum = (int) (value / factor); if (_maximum < _value) _value = _maximum; if (_maximum < _minimum) _minimum = _maximum; this.Invalidate (); } } [Browsable (true)] public new decimal Minimum { get { return (decimal) (_minimum * factor); } set { _minimum = (int) (value / factor); if (_minimum > _maximum) _maximum = _minimum; if (_minimum > _value) _value = _minimum; this.Invalidate (); } } [Browsable (true)] public decimal Factor { get { return factor; } set { factor = value; this.Invalidate (); } } [Browsable (true)] public new decimal Value { get { return _value; } set { if (_value != value) { if (value < _minimum) _value = _minimum; else if (value > _maximum) _value = _maximum; else _value = value; } this.Invalidate (); } } [Browsable (true)] public new decimal TickFrequency { get { return (decimal) (_tickFrequency * factor); } set { if (_tickFrequency != value) { _tickFrequency = (int) (value / factor); this.Invalidate (); } this.Invalidate (); } } [Browsable (true)] public new decimal SmallChange { get { return (decimal) (_smallChange * factor); } set { _smallChange = (int) (value / factor); this.Invalidate (); } } [Browsable (true)] public new decimal LargeChange { get { return (decimal) (_largeChange * factor); } set { _largeChange = (int) (value / factor); this.Invalidate (); } } }
Finden jemand den Fehler und kann mir helfen. Bräuchte den Schieber dringend in meinem Projekt.
Besten Dank.
-
Ok habs. Im RecalcValue muss mit base.Value gearbeitet werden
Jetzt geht das Maximum aber nur bis 1,0
Da muss ich jetzt nochmal drüberschaun.
Nachtrag:
Ich hätte das auch ganz einfach haben können den Value-Wert einfach durch 10 Teilen und den Max und Min-Wert mit 10 Multiplizieren
Liegt doch wohl an der Hitze...