Laden...

TrackBar

Erstellt von dewebey vor 17 Jahren Letzter Beitrag vor 16 Jahren 2.466 Views
D
dewebey Themenstarter:in
119 Beiträge seit 2007
vor 17 Jahren
TrackBar

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

738 Beiträge seit 2007
vor 17 Jahren

hi,

du kannst maximal- und minimal wert der TrackBar angeben, und auch die skalierung!

(Aber ganz versteh ich dein Problem glaub ich nicht !)

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo dewebey,

gerade: i % 2 == 0
ungerade: i % 2 != 0

herbivore

D
dewebey Themenstarter:in
119 Beiträge seit 2007
vor 17 Jahren

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

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo dewebey,

ich denke mal mit

TrackBar.SmallChange
TrackBar.LargeChange

herbivore

B
1.529 Beiträge seit 2006
vor 17 Jahren

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 ]; }
   }
}
B
1.529 Beiträge seit 2006
vor 17 Jahren

Hiermit gebe ich allen Lesern einen virtuellen Schnaps aus.
Prost.
Schließlich ist die Zeit des vorherigen Posts ziemlich denkwürdig: 11:11:11

P
26 Beiträge seit 2007
vor 16 Jahren

Original von herbivore
Hallo dewebey,

ich denke mal mit

TrackBar.SmallChange
TrackBar.LargeChange

herbivore

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

49.485 Beiträge seit 2005
vor 16 Jahren

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

S
489 Beiträge seit 2007
vor 16 Jahren

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. 😭