Zugegeben, mein Code ist schon etwas nerdig... Aber die Idee dafür, einen Nachfolger einer Aufzählung zu finden, wobei am Ende wieder von vorne angefangen werden soll, ist: Nimm den Zahlenwert des Aufzählungselements und erhöhe ihn um die gewünschte Differenz, damit bist du beim gewünschten Element - es sei denn, du hast die Anzahl der Elemente überschritten und musst wieder von vorne anfangen. Deshalb die Division durch die Anzahl der Aufzählungselemente - der Divisionsrest ist immer ein Element der Menge. Zum Schluss kommt dann noch ein Type-Cast, der die Ordnungszahl des gefundenen Elements wieder in den Aufzählungstyp umwandelt.
Bei einer Aufzählung mit zwei Elementen ist dein Code natürlich einfacher und klarer zu verstehen. Interessanter wird's aber, wenn die Menge mehr Elemente enthält. Statt eines ellenlangen "if" oder "case" geht's bei mir in einer Zeile.
Weiß gerade kein gutes Beispiel, aber versuche mal in der Aufzählung TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose, bkAbort, bkRetry, bkIgnore, bkAll, bkNoToAll, bkYesToAll) das übernächste Element zu finden...
Code: Alles auswählen
var
bk: TBitBtnKind;
new_bk: TBitBtnKind
...
new_bk := TBitBtnKind((ord(bk)+2) mod (ord(High(TBitBtnKind))+1)); // ok, ich sehe, das ist noch etwas nerdiger...
// oder
case bk of
bkCustom: new_bk := bkCancel;
bkOK: new_bk := bkHelp;
bkCancel: new_bk := bkYes;
bkHelp: new_bk := No;
bkYes: new_bk := bkClose;
bkNo: new_bk := bkAbort;
bkClose: new_bk := bkRetry;
bkAbort: new_bk := bkIgnore;
bkRetry: new_bk := bkAll;
bkIgnore: new_bk := bkNoToAll;
bkAll: new_bk := bkYesToAll;
bkNoToAll: new_bk := bkCustom;
bkYesToAll := new_bk := bkOK;
end;