Spinedit - Wert eines anderen Controls abfragen



  • Hi,

    ich habe auf meinem Form 2 Labels und 5 SpinEdits. Für die SpinEdits benutze ich das gleiche OnChange.

    Im ersten Label steht ein maximaler Wert, im zweiten Label steht der Wert der übrig bleibt nach dem abziehen der Werte der SpinEdits.

    Jetzt ist aber das Problem, wenn sozusagen der maximale Wert auf die SpinEdits verteilt wurde, und ich die Taste weiterhin drücke, sich der Wert im jeweiligen SpinEdit trotzdem noch erhöht. Ich möchte nicht, dass der Wert in den Spinedits geändert werden kann, wenn keine Punkte mehr vorhanden sind.

    Wie muss ich das anstellen?

    Danke!



  • Hi,

    wenn für die SpinEdits MaxValue gesetzt ist, sollte es ja gehen.
    Dann ist in der OnChange ein Schnitzer?



  • Also ich bin irgendwie zu doof dafür. Wie müsste ich den den maximalen Wert bei den SpinEdits aufteilen?

    Wenn ich z.b. bei SpinEdit den Wert ändere, muss ich ja den max Wert der anderen Spinedits anpassen. Nur wie?

    Eigentlich habe ich mir gedacht, dass, wenn keine Punkte mehr vorhanden sind, die Spinedits den eigenen Wert nicht mehr erhöhen können sobald es keine Punkte mehr gibt.

    Momentan habe ich es so gemacht:

    int max	= 		stxtPointsAvaible->Caption.ToInt();
     int left	= 		stxtPointsAvaible->Caption.ToInt()
    				-	Spin1->Value
    				-	Spin2->Value
    				-	Spin3->Value
    				-	Spin4->Value
    				-	Spin5->Value;
    
     stxtPointsLeft->Caption	= IntToStr(left);
    

    Was mir aber eben abgeht ist, dass ich nicht weiss wie ich den max. Wert bei den Spinedits setzen muss 😞

    Möchte eben nicht für jedes Spinedit ein eigenes OnChange machen, wobei das Problem dann eigentlich immer noch bestehen würde wegen MaxValue.



  • Hallo

    Um die OnChange-Events wirst du nicht umhinkommen, den genau dafür sind sie da. Aber es sollte möglich sein, alle SpinCtrls auf eine Eventmethode verweisen zu lassen. Zur Identifikation kannst du dann den Parameter Sender einsetzen.

    bis bald
    akari



  • Hallo,

    in OnChange setzt du den MaxValue des SpinEdit auf seinen aktuellen Wert, also zB

    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Spin1Change(TObject *Sender)
    {
        left = 0;
        for ( int i = 1; i <= 5; i++) {
            TCSpinEdit* spin;
            spin = dynamic_cast<TCSpinEdit*>(Form1->FindComponent("Spin" + IntToStr(i)));
            left    += spin->Value;
            spin->MaxValue = spin->Value;   // hier MaxValue neu festlegen
    
        }
        stxtPointsLeft->Caption =  IntToStr(left);
    }
    

    Edit:
    @akari, sry, hab nicht mit deinem Posting gerechnet. 😉



  • @kpeter

    Aber damit wird ja left immer wieder erhöht, da hier ja der Wert immer wieder addiert wird. Wenn ich z.b. einen Wert 100 habe und diesen Wertmäßig auf die Spins verteilen will, würde ich den maximalen Wert von 100 mit nur ein paar klicks erreichen 😉

    Das ist aber "eigentlich" nicht gewollt 😃

    OK, ich vermute mal das meine Fragestellung vielleicht nicht ganz so rüber kommt wie ich gehofft habe - dann versuche ich es nochmal besser:

    Also:

    In einem Label steht ein Wert, z.b. 100. Diesen Wert möchte ich auf 5 SpinEdits verteilen, wobei jedes Spinedit einen individuellen Wert haben kann, solange die 100 ingesamt (von allen Spins zusammen) nicht überschritten wird.

    Z.b. könnte Spin1 den Wert 30 haben, Spin2 60, Spin3 5, Spin4 0, Spin5 5.



  • würde mir ne Funktion bauen, die im OnChange aufgerufen wird und das entspr. Edit anpasst.
    Also alle SpinEdits ausser akt. ++, dann aktuelles = 100 - alle.

    kurz mal aus der Hüfte geschossen 🙂

    grüssle 🙂



  • @smitty

    Das war meine erste Idee, die funktioniert aber nicht so ganz da ich hier nicht weiss wie ich den MaxValue berechnen kann für die SpinEdits.

    Ich habs zwar schon soweit hinbekommen gehabt das ich den max. Wert nicht überschreiten kann, aber die Spinedits selbst konnte ich noch erhöhen - und das will ich ja eben nicht.



  • SpinEdit->MaxValue = ???

    grüssle 🙂



  • Smitty schrieb:

    SpinEdit->MaxValue = ???

    grüssle 🙂

    Du hast die anderen Posts nicht wirklich gelesen, oder?



  • Hi,

    Annahme:
    Du hast einen maximalen Wert von 100 , und alle Werte der 5 SpinEdits zusammen müssen diese Summe bilden.
    Verminderst du jetzt einen Wert, vergrössert sich zwangsweise der Wert von mindestens einem anderen SpinEdit. Die Summe soll ja 100 bleiben.

    Insofern kann dein Plan nicht aufgehen.



  • kpeter schrieb:

    Hi,

    Annahme:
    Du hast einen maximalen Wert von 100 , und alle Werte der 5 SpinEdits zusammen müssen diese Summe bilden.
    Verminderst du jetzt einen Wert, vergrössert sich zwangsweise der Wert von mindestens einem anderen SpinEdit. Die Summe soll ja 100 bleiben.

    Insofern kann dein Plan nicht aufgehen.

    Warum? Der Wert beim vermindern von SpinEditX muss ja nicht einem anderen Spinedit zugewiesen werden sondern ist eben wieder 'frei'.



  • Du brauchst doch nur im Change-Event abfragen, ob du die Gesamtsumme (über alle SpinEdits) erreicht hast.
    Wenn ja, dann jeweils

    SpinEditX->MaxValue = SpinEditX->Value;
    

    Und wenn noch nicht, dann

    SpinEditX->MaxValue = 100; // bzw. alternativ: SpinEditX->Value + 1 (da es ja immer wieder angepaßt wird)
    


  • Th69 schrieb:

    Du brauchst doch nur im Change-Event abfragen, ob du die Gesamtsumme (über alle SpinEdits) erreicht hast.
    Wenn ja, dann jeweils

    SpinEditX->MaxValue = SpinEditX->Value;
    

    Und wenn noch nicht, dann

    SpinEditX->MaxValue = 100; // bzw. alternativ: SpinEditX->Value + 1 (da es ja immer wieder angepaßt wird)
    

    Jetzt gehts, danke!


Log in to reply