Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Subrange als Parameter? (https://www.delphipraxis.net/167968-subrange-als-parameter.html)

silver-moon-2000 27. Apr 2012 17:15

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:
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;
Erstens fehleranfällig, zweitens DRY-Prinzip?

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:
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;
nur welchen Typ hat der Subrange?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 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