Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - ComboBox mit Sicherheitsabfrage
Quake User - So 02.01.11 16:14
Titel: ComboBox mit Sicherheitsabfrage
Ich verwende bspw. eine ComboBox zur Auswahl von A,B,C. Nun habe ich eine Sicherheitsabfrage eingebaut, die fragt ob der Nutzer wirklich von A nach B wechseln möchte. Falls nicht, wird der Wechseln nicht durchgeführt. Leider welchselt die ComboBox trotzdem Ihren Text.
Das liegt daran, dass ich auf das OnChange Ereignis reagiere. nach OnChange hat die ComboBox natürlcih schon einen anderen Text. Aber ich sehe auch keinen anderen Event, den ich nutzen könnte. (bspw. OnBevorChange)
Was ist hier der eleganteste Weg?
Tilman - So 02.01.11 16:29
Hm, so würde es gehen, aber sehr elegant ist es nicht, vielleicht fällt jemandem noch was besseres ein.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| alt: integer = -1; implementation
{$R *.dfm}
procedure TForm1.ComboBox1Change(Sender: TObject); var neu: Integer; begin neu := ComboBox1.ItemIndex; combobox1.ItemIndex := alt; if (messageBox(handle,'Wirklich?','Ja?',36) = IDYES) then begin alt := neu; ComboBox1.ItemIndex := neu; label1.Caption := combobox1.Text; end; end; |
Quake User - Mo 03.01.11 01:21
Ich suche natürlich eine Lösung, ohne eine globale Variable zu verwenden.
Tilman - Mo 03.01.11 01:26
Natürlich :roll:
In dem Fall steht TCombobox.tag zur Verfügung und kann benutzt werden, oder du musst dir halt die Mühe machen eine neue Komponente von TCombobox abzuleiten, das ist auch gar nicht schwer. Würde ich aber in dem Fall nur machen wenn ich die Combobox an mehr als einer Stelle brauche, sonst lohnt sich das kaum.
Quake User - Mo 03.01.11 01:29
Tilman hat folgendes geschrieben : |
Natürlich :roll:
In dem Fall steht TCombobox.tag zur Verfügung... |
Wie soll ich das nutzen?
Tilman - Mo 03.01.11 01:32
Nun, Tag ist ein 32-Bit Integer, und wenn du keine Globale Variable einsetzen willst, dann kannst du eben Tag dazu verwenden.
Quake User - Mo 03.01.11 01:35
Tilman hat folgendes geschrieben : |
| Nun, Tag ist ein 32-Bit Integer, und wenn du keine Globale Variable einsetzen willst, dann kannst du eben Tag dazu verwenden. |
Aha, hast Du dazu ein Bsp. ?
jaenicke - Mo 03.01.11 02:18
Wie meinst du das? :gruebel:
Delphi-Quelltext
1:
| MyComboBox.ItemIndex := MyComboBox.Tag; |
Ich würde allerdings ein privates Feld im Formular verwenden.
Quake User - Di 04.01.11 03:22
Kein weiteren Vorschläge? Es gibt keine Möglichkeit für einen Abbruch nach der Auswahl in einer ComboBox?
jaenicke - Di 04.01.11 06:53
Ich nehme an das einfachste ist, eine eigene Komponente abzuleiten und darin auf CN_COMMAND zu reagieren. Denn wie du ja im Delphi-Quelltext siehst, bekommst du bei einer Änderung der Auswahl im NotifyCode dieser Message ein CBN_SELCHANGE.
Darin kannst du dann vor der Zuweisung des Anzeigetextes die Abfrage machen (in einem neuen Ereignis am besten) und ggf. den alten Wert wiederherstellen. Da hast du dann auch den Vorteil, dass du direkt unter private deiner neuen Komponente die letzte Auswahl speichern kannst.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!