AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ComboBox alter ItemIndex

Ein Thema von Pytroxis · begonnen am 23. Apr 2019 · letzter Beitrag vom 24. Apr 2019
Antwort Antwort
Pytroxis

Registriert seit: 12. Apr 2019
46 Beiträge
 
#1

ComboBox alter ItemIndex

  Alt 23. Apr 2019, 12:27
Delphi-Version: 10.2 Tokyo
Hey,

ich bin es mal wieder
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 OnChange ist ja bereits der neue ItemIndex vorhanden.
Eine Idee die ich hatte war, den Index in einer Variable zu speichern und diese dann zu verwenden aber geht das vielleicht etwas besser?
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
701 Beiträge
 
Delphi 12 Athens
 
#2

AW: ComboBox alter ItemIndex

  Alt 23. Apr 2019, 12:52
Hey,

ich bin es mal wieder
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 OnChange ist ja bereits der neue ItemIndex vorhanden.
Eine Idee die ich hatte war, den Index in einer Variable zu speichern und diese dann zu verwenden aber geht das vielleicht etwas besser?
Leider nicht, die Windows-Combobox verschickt keine Notification bevor der Benutzer den Eintrag wechselt. Den Index des letzten geählten Eintrags für später zu speichern ist daher wirklich so ziemlich die einzige Möglichkeit, die funktioniert, egal wie der Benutzer zur Combobox gelangt und wie er den Eintrag auswählt (geht ja auch per Tastatur). Der OnEnter-event wäre noch ganz brauchbar, allerdings feuert er nicht, wenn die Combobox beim Öffnen des Forms schon den Fokus bekommt.
Peter Below
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#3

AW: ComboBox alter ItemIndex

  Alt 23. Apr 2019, 12:54
Komponenten haben u. a. die Eigenschaft Tag. Die kann man für die Zwischenspeicherung von Integerwerten "missbrauchen".
Delphi-Quellcode:
// 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;
Nur mal so hingedaddelt.

Ob's nun einfacher ist, als mit 'ner eigenen Variabel, ist wohl eher Geschmacksache
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
485 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: ComboBox alter ItemIndex

  Alt 23. Apr 2019, 19:23
Du hast Zugriff auf den vorigen ItemIndex in den Ereignissen OnKeyDown und OnDropDown . Diese beiden decken alle eventualitäten ab, die passiert sein müssen, bevor der ItemIndex geändert werden könnte. Was du nun also machen musst, ist, diesen zu speichern.
Das in diesen Ereignissen und nicht im OnChange oder OnEnter zu machen, deckt leider nicht alle Eventualitäten ab.

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;
Dennis
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: ComboBox alter ItemIndex

  Alt 24. Apr 2019, 00:02
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;
Markus Kinzler
  Mit Zitat antworten Zitat
Pytroxis

Registriert seit: 12. Apr 2019
46 Beiträge
 
#6

AW: ComboBox alter ItemIndex

  Alt 24. Apr 2019, 12:19
Ich frage mal so:
Wo liegt denn genau der Vorteil in dem Tag, also weshalb sollte ich den Tag statt einer Variable nutzen?
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#7

AW: ComboBox alter ItemIndex

  Alt 24. Apr 2019, 12:35
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz