Hallo,
ich hab eine Trackbar erstellt, jetzt möchte ich, dass diese nicht 1,2,3, etc. zurückgibt, sondern Vielfache einer Zahl.
Also ich hab z.B. 100, dann sollte sie mir 0,1,2,4,5, etc. zurückgeben.
ich hab mir gedacht, ich könnte das ja so machen, indem überprüft wird, ob eine gerade Zahl rauskommt, wenn man durch die entsprechende Zahl teile, also z.B.
100 / 2 = 50 -> gerade Zahl, also möglich
100/ 3 = 33.33 -> ungerade Zahl, nicht möglich!
Wie könnte ich das am geschicktesten umsetzen und wie kann ich das dann der Trackbar übergeben, dass diese nur diese Vielfache anzeigt.
Danke für eure Anregungen,
dewebey
hi,
du kannst maximal- und minimal wert der TrackBar angeben, und auch die skalierung!
(Aber ganz versteh ich dein Problem glaub ich nicht !)
Hallo dewebey,
gerade: i % 2 == 0
ungerade: i % 2 != 0
herbivore
modulo.. da hätt ich auch selbst drauf kommen können 🤔
danke dir!
aber wie kann ich das jetzt am besten in die Trackbar einbauen, also dass nur diese zahlen zurückgegeben werden und nicht 1,2,3,4, also nicht in diesen 1er Schritten
Hallo dewebey,
ich denke mal mit
TrackBar.SmallChange
TrackBar.LargeChange
herbivore
Ich verstehe dich so, dass du weder Vielfache einer Zahl noch gerade Zahlen ausgeben willst, sondern nur die Teiler einer Zahl.
Das Minimum einer derartigen Trackbar ist immer 1, dass Maximum diejenige Zahl, deren Teiler du haben willst.
Dazu kann man vorher die Teilermenge ermitteln und dann nur die Anzahl der Teiler als Wertebereich der Trackbar setzen.
Dies wird in folgendem Code gemacht.
public class DividerTrackBar : TrackBar
{
// der c'tor
public DividerTrackBar() : base()
{
this.SmallChange = 1;
this.LargeChange = 1;
this.TheNumberWhoseDividersYouWant = 1;
}
// hier kommen die Teiler rein
private List<int> Dividers;
// setze AllowZero auf true, um zusätzlich zu den Teilern auch 0 zu erlauben
private bool _AllowZero = false;
public bool AllowZero
{
get { return this._AllowZero; }
set
{
this._AllowZero = value;
CalculateTrackBar();
}
}
// ein zwar ziemlich bescheuerter Name, aber dafür selbsterklärend
private int _TheNumberWhoseDividersYouWant;
public int TheNumberWhoseDividersYouWant
{
get { return this._TheNumberWhoseDividersYouWant; }
set
{
if (value < 1)
{
throw new ArgumentOutOfRangeException( "Maximum", "Maximum must be greater or equal to 1" );
}
else
{
// die Quadratwurzel liefert eine relativ genaue Abschätzung der Teilerzahl
this.Dividers = new List<int>( Convert.ToInt32( Math.Sqrt( value ) ) );
// 1 ist immer Teiler
Dividers.Add( 1 );
// das Verfahren zur Ermittlung der Teiler ist deutlich verbesserungswürdig
for (int i = 2; i < (value / 2 + 1); i++)
{
if ((value % i) == 0)
{
Dividers.Add( i );
}
}
// die Zahl selbst ist immer Teiler
if (value != 1)
Dividers.Add( value );
CalculateTrackBar();
}
}
}
private void CalculateTrackBar()
{
// wenn die Null erlaubt ist, kommt sie als erster "Teiler"
if (AllowZero)
{
// 0 noch nicht in der Liste?
if (Dividers[0] != 0)
Dividers.Insert( 0, 0 );
}
else
{
// 0 in der Liste?
if (Dividers[0] == 0)
Dividers.RemoveAt(0);
}
// erstes Element in Dividers
this.Minimum = 0;
// letztes Element in Dividers
this.Maximum = this.Dividers.Count - 1;
// Defaultwert ist der erste Teiler
this.Value = Dividers[0];
}
}
public new int Value
{
set
{
int index = this.Dividers.IndexOf( value );
if (index == -1)
{
throw new ArgumentException( "Value must be a divider of TheNumberWhoseDividersYouWant", "Value" );
}
else
{
base.Value = index;
}
}
get { return this.Dividers[ base.Value ]; }
}
}
Hiermit gebe ich allen Lesern einen virtuellen Schnaps aus.
Prost.
Schließlich ist die Zeit des vorherigen Posts ziemlich denkwürdig: 11:11:11
Original von herbivore
Hallo dewebey,ich denke mal mit
TrackBar.SmallChange
TrackBar.LargeChangeherbivore
Kann mir mal jm. die Bedeutung dieser beiden Einstellungen erklären? Ich habe das Problem das ich mit einer Trackbar einen Strom einstellen möchte. Von 0-50A in 100mA(0,1A)schritten.
Erste Annahme: Kommawerte sind mit Trackbar nicht einstellbar, richtig?
Zweite Annahme: In 100-Schritten die Werte Verändern geht so einfach nicht, richtig?
Danke, Chris
Hallo pgxn84,
Kann mir mal jm. die Bedeutung dieser beiden Einstellungen erklären?
Ja, die :rtfm: Doku.
Erste Annahme: Kommawerte sind mit Trackbar nicht einstellbar, richtig?
Richtig, auch aus der Doku zu entnehmen, dass beide Properties vom Typ int sind.
Zweite Annahme: In 100-Schritten die Werte Verändern geht so einfach nicht, richtig?
Doch, sollte kein Problem sein. Natürlich müssen auch TrackBar.Minimum/Maximum passend eingestellt sein.
herbivore
Erste Annahme: Kommawerte sind mit Trackbar nicht einstellbar, richtig?
Alles eine Frage der Maßeinheit (ändere die Maßeinheit), sollte man eigentlich wissen, wenn man sich mit sowas beschäftigt. 😭