![]() |
Delphi-Version: XE
Subrange als Parameter?
Hallo zusammen,
ich wieder mal mit einer dämlichen Frage: Ich habe eine Reihe von Objekten in einer ObjectList. Diese Objekte haben eine Eigenschaft "Level", welche ich setzen muss. Dabei ist der Aufzählungs-Typ TLevel aufgeteilt in mehrere SubRanges (hier mal zwei zur Veranschaulichung, sonst noch deutlich mehr). Und das Level, das den Objekten zugeordnet werden soll, richtet sich nach den Subranges. Zusätzlich gibt es noch eine weitere Reihe von Einflussfaktoren, sodass ich alles in eine "zentrale" Funktion auslagern wollte. Momentan löse ich das höchst umständlich über einen weiteren Index, den ich in getLevels über ein Case abfrage.
Delphi-Quellcode:
Erstens fehleranfällig, zweitens DRY-Prinzip?
type TLevel = (lev00, lev01, lev02, lev03, lev04, lev05, lev06, lev07, lev08, lev09, lev10);
SLevelRangeLow = lev01 .. lev05; SLevelRangeHigh = lev06 .. lev10; type TIntraLevelRangeMode = (irBase, irCenter, irTop); procedure TMyClass.modifyQueue; function getLevel(mode : TIntraLevelRangeMode; subRangeValue : Integer) : TLevel; begin //1 == SLevelRangeLow //2 == SLevelRangeHigh case mode of irBase : case SubRangeValue of 1 : Result := Low(SLevelRangeLow); 2 : Result := Low(SLevelRangeHigh); end; irCenter : case SubRangeValue of 1 : Result := TLevel((Ord(Low(SLevelLow)) + Ord(High(SLevelLow))) div 2); 2 : Result := TLevel((Ord(Low(SLevelMiddle)) + Ord(High(SLevelMiddle))) div 2); end; irTop : case SubRangeValue of 1 : Result := High(SLevelRangeLow); 2 : Result := High(SLevelRangeHigh); end; end; end; begin //1 == SLevelRangeLow //2 == SLevelRangeHigh FMyObjectList.Items[FMyIndex ].Level := getLevel(irBase, 1); FMyObjectList.Items[FMyIndex + 1].Level := getLevel(irBase, 2); FMyObjectList.Items[FMyIndex + 2].Level := getLevel(irTop , 1); FMyObjectList.Items[FMyIndex + 3].Level := getLevel(irTop , 2); end; Und da sowohl TIntraLevelRangeMode mehr als die zwei Werte umfasst und es auch deutlich mehr Subranges gibt, ist die Funktion getLevels wahnsinnig aufgeblasen. Das muss doch auch einfacher gehen? Mir schwebt soetwas vor wie:
Delphi-Quellcode:
nur welchen Typ hat der Subrange?
procedure TMyClass.modifyQueue;
function getLevel(mode : TIntraLevelRangeMode; subRange : ???) : TLevel; //<---------- begin case mode of irBase : Result := Low(subRange); irCenter : Result := TLevel((Ord(Low(SubRange)) + Ord(High(SubRange))) div 2) irTop : Result := High(subRange); end; end; begin FMyObjectList.Items[FMyIndex ].Level := getLevel(irBase, SLevelRangeLow); FMyObjectList.Items[FMyIndex + 1].Level := getLevel(irBase, SLevelRangeHigh); FMyObjectList.Items[FMyIndex + 2].Level := getLevel(irTop , SLevelRangeLow); FMyObjectList.Items[FMyIndex + 3].Level := getLevel(irTop , SLevelRangeHigh); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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