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;  // Global oder entsprechend
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

user profile iconTilman hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconTilman hat folgendes geschrieben Zum zitierten Posting springen:
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.