OnChange if Change [gelöst]
-
Hallo Miteinander,
habe mal wieder ein Problem und freue mich über Hilfe.
Die Frage ist: Wie gelingt es mir, dass eine Ereignisbehandlungsroutine OnChange() nur ausgeführt wird, wenn tatsächlich eine Änderung durchgeführt wurde.Es geht dabei um eine ComboBox mit zwei Items.
Wird bei ausgewähltem Item[0], Item[1] ausgewählt, soll eine Aktion durchgeführt werden. Wird jedoch bei ausgewähltem Item[0] wieder auf Item[0] geklickt wird die Aktion auch durchgeführt. Wie vermeide ich letzteres??Vielen Dank für's Interesse und für Hilfe!
Viele Grüße
Deepling
-
Hallo,
merke dir einfach den letzten Eintrag (bzw. Index) und vergleiche ihn dann mit dem aktuell ausgewählten Eintrag.
-
Hallo Th69,
danke für Deine Antwort.
Die Idee hatte ich auch schon ... es scheitert aber am noch Grundsätzlicheren:
Wie mache ich das?Innerhalb der Ereignisbehandlungsroutine OnChange funktioniert es ja nicht ...
Vielen Dank und liebe Grüße
Deepling
-
Hallo,
warum nicht? Du mußt natürlich die Variable als Klassenmember bzw. als static anlegen (damit sie über alle Aufrufe hinweg erhalten bleibt).
Ich sehe gerade, daß du explizit von OnChange schreibst?
Wenn du eine DropDownList hast, nimm besser das OnSelect-Ereignis. Und dann greifst du dadrin auf die Eigenschaft 'ItemIndex' zu.
-
Hallo Th69,
das funktioniert schon mal in eine Richtung, danke.
void __fastcall TForm1::ComboBox1Select(TObject *Sender) { static int i = ComboBox1->ItemIndex; int number; if (TryStrToInt(Edit1->Text, number) == true && ComboBox1->ItemIndex != i) { float X = StrToFloat(Edit1->Text); switch (ComboBox1->ItemIndex) { case 0: X = X * 1/5; break; case 1: X = X * 5; break; default: break; } Edit1->Text = FloatToStrF(X,ffFixed, 7, 2); } }
Wenn ich eine Zahl in Edit1 schreibe, Item 0 und danach Item 1 wähle, wird die Zahl nun so multipliziert, wie sie soll. Wähle ich jedoch wiederum Item 0, sollte ja die Rechnung rückwärts ablaufen und die ursprünglich eingegebene Zahl wieder da stehen. Geschieht nur leider nicht ...
Wähle ich dann wieder Item 1, geschieht die Umrechnung wieder.Es klappt also in eine Richtung, in die andere aber noch nicht.
Ich schätze es liegt am "static". Aber wie umgehe ich das?
Danke für Deine Geduld und liebe Grüße
Deepling
-
Hallo
So funktioniert das mit dem static nicht. Denn eine solche Variable wird zwar tatsächlich noch über das Ende der Methode erhalten, aber beim nächsten Aufruf auch nicht neu initialisiert. Damit ändert sich bei dir der Wert von i nach dem ersten Aufruf nicht mehr. Du könntest die entsprechende Zuweisung nach der Initialisierung machen :
static int i = ComboBox1->ItemIndex; // Hier dein Vergleich von i mit dem aktuellen ItemIndex i = ComboBox1->ItemIndex; // Der aktuelle Werte wird in i für den nächsten Aufruf gespeichert
aber das ganze ist nicht sehr elegant. Du solltest lieber wie erwähnt diese Variable als Member der Formklasse deklarieren (und gleich einen sinnvolleren Namen vergeben :
// In der Headerdatei deines Forms class Form... { private : int LastIndex; } // In der Cpp-Datei deines Forms // Konstruktor Form::Form(...) { LastIndex = -1; // Hier die Variable für den Start initialisieren } void __fastcall TForm1::ComboBox1Select(TObject *Sender) { // Hier LastIndex wie gewünscht verwenden LastIndex = ComboBox1->ItemIndex; }
bis bald
akari
-
Vielen Dank für die Erläuterung akari! Und danke auch nochmal an Th69 :).
Werde es versuchen.Liebe Grüße
-
Hervorragend!
Es hat einwandfrei funktioniert.
Vielen Dank nochmal für die Hilfe!