![]() |
Delphi-Version: 10.2 Tokyo
ComboBox alter ItemIndex
Hey,
ich bin es mal wieder :D Diesmal habe ich nicht direkt ein Problem, sondern eher eine Frage. Ich probiere mich momentan an ComboBoxen aus und dessen Indexen. Gibt es ein Event oder eine Möglichkeit beim ändern der ComboBox (-> Bspw. wählt der Nutzer irgendetwas aus), den alten ItemIndex herauszufinden? Bei
Delphi-Quellcode:
ist ja bereits der neue ItemIndex vorhanden.
OnChange
Eine Idee die ich hatte war, den Index in einer Variable zu speichern und diese dann zu verwenden aber geht das vielleicht etwas besser? |
AW: ComboBox alter ItemIndex
Zitat:
|
AW: ComboBox alter ItemIndex
Komponenten haben u. a. die Eigenschaft Tag. Die kann man für die Zwischenspeicherung von Integerwerten "missbrauchen".
Delphi-Quellcode:
Nur mal so hingedaddelt.
// Im Objektinspektor das Attribut Tag der Combobox auf -2 setzen.
// Oder an einer anderen sinnvollen Stelle. // Tag ist normalerweise 0, da dies ein gültiger Wert für 'nen Itemindex ist, muss er geändert werden. // -1 ist auch eher schlecht, da -1 bedeutet, das was in der ComboBox nicht enthalten ist. // -2 ist kein im "normalen Leben" als ItemIndex auftretender Wert ;-) // // Dann müsste man mit sowas arbeiten können. procedure TForm1.ComboBox1Change(Sender: TObject); begin if ComboBox.Tag <> ComboBox.ItemIndex then begin // alter ItemIndex <> neuem ItemIndex: end else begin // ItemIndex ist unverändert: end; // Hier merken wir uns den ItemIndex nach der Änderung. // Der Wert in Tag ist dann bei der nächsten Änderung der "alte" ItemIndex. ComboBox.Tag := ComboBox.ItemIndex; end; Ob's nun einfacher ist, als mit 'ner eigenen Variabel, ist wohl eher Geschmacksache ;-) |
AW: ComboBox alter ItemIndex
Du hast Zugriff auf den vorigen ItemIndex in den Ereignissen
Delphi-Quellcode:
und
OnKeyDown
Delphi-Quellcode:
. Diese beiden decken alle eventualitäten ab, die passiert sein müssen, bevor der
OnDropDown
Delphi-Quellcode:
geändert werden könnte. Was du nun also machen musst, ist, diesen zu speichern.
ItemIndex
Das in diesen Ereignissen und nicht im
Delphi-Quellcode:
oder
OnChange
Delphi-Quellcode:
zu machen, deckt leider nicht alle Eventualitäten ab.
OnEnter
Delphi-Quellcode:
var OldIndex: Integer;
procedure TForm1.ComboBox1DropDown(Sender: TObject); begin OldIndex := ComboBox1.ItemIndex.ToString; end; procedure TForm1.ComboBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin OldIndex := ComboBox1.ItemIndex.ToString; end; |
AW: ComboBox alter ItemIndex
Dann aber besser so
Delphi-Quellcode:
procedure TForm1.ComboBoxDropDown(Sender: TObject);
begin (Sender as TCombobox).Tag := (Sender as TCombobox).ItemIndex; end; procedure TForm1.ComboBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin (Sender as TCombobox).Tag := (Sender as TCombobox).ItemIndex; end; |
AW: ComboBox alter ItemIndex
Ich frage mal so:
Wo liegt denn genau der Vorteil in dem Tag, also weshalb sollte ich den Tag statt einer Variable nutzen? |
AW: ComboBox alter ItemIndex
Weil Tag ein "Teil" der Combobox ist, sie weiß damit selbst, was wie der "alte Index" war und muss nicht irgenwo nachfragen (Variabel) was der altze Index war.
Wenn Du "nur" eine Combobox nutzt, mag der Unterschied nicht sehr groß sein. Aber ab der zweiten Combobox wird es deutlich einfacher. Tag ist einfach vorhanden und nutztbar, 'ne Variabel musst Du deklarieren und global verfügbar machen, für mehrere Comboboxen brauchst Du mehrere Variabeln und musst in den Ereignissen ... immer die "richtige erwischen", das ist nicht wirklich objektorientiert. Tag ist einfach ein Teil der Klasse / des Objektes, für das es genutzt wird. Wenn Du Dir das Beispiel von mkinzler anschaust, wirst Du feststellen, dass das auch mit n Comboboxen funktioniert, denen Du allen die gleichen Routinen zuweist, d. h.: Die skizzierten 9 Zeilen Quellcode können für eine beliebige Anzahl von Comboboxen genutzt werden. Wenn Du hier statt Tag aber eine Variabel nutzen möchtest, musst Du für jede Combobox eine eigene Variabel haben und entweder diese neun Zeilen für jede Combobox implementieren oder in den beiden Routinen jeweils eine Abfrage einbauen, um welche Combobox es sich handelt und dann die jeweilige Variabel nutzen. Das wird schnell: viel - unübersichtlich - fehleranfällig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz