Abfrage, ob Integer in Typ-Bereich liegt

    Abfrage, ob Integer in Typ-Bereich liegt

    Neu

    Hallo,

    ich hab mir ein paar Integertypen angelegt.
    Sagen wir:

    Delphi-Code

    1. TSchuhgroesseKlein = 0..25;
    2. TSchuhgroesseMittel = 26..35;
    3. TSchuhgroesseGross = 36..100;


    Und jetzt gibt's immer mal wieder Abfrage der Art:

    Delphi-Code

    1. if (Schuhgroesse >= Low(TSchuhgroesseMittel)) and (Schuhgroesse <= High(TSchuhgroesseMittel))


    Und das hätt ich gern umgeschrieben in sowas wie:

    Delphi-Code

    1. if inRange(Schuhgroesse, TSchuhgroesseMittel)


    und kriegs einfach nicht hin. Gibt's da ne Möglichkeit?

    PS: Vergessen zu schreiben: Die Funktion sollte alle Integer-Typen können

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Klausens“ ()

    Neu

    Moin... 8o

    Ein Lösungsvorschlag...

    Delphi-Code

    1. unit Main;
    2. interface
    3. uses
    4. Winapi.Windows, Winapi.Messages,
    5. System.SysUtils, System.Variants, System.Classes,
    6. Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    7. type
    8. TSizeGroup = (siSmall, siNormal, siBig, siNotInRange);
    9. TSizeSmall = 0..25;
    10. TSizeNormal = 26..35;
    11. TSizeBig = 36..100;
    12. TCalculate = class
    13. strict private
    14. public
    15. function InRange(Size: Integer; SizeGroup: TSizeGroup): Boolean;
    16. function GetSizeGroup(Size: Integer): TSizeGroup;
    17. end;
    18. TFormCalculate = class(TForm)
    19. edtSize: TEdit;
    20. rbSmall: TRadioButton;
    21. rbNormal: TRadioButton;
    22. rbBig: TRadioButton;
    23. btnCalculate: TButton;
    24. lblSizeGroup: TLabel;
    25. edtSizeGroup: TEdit;
    26. lblInSize: TLabel;
    27. edtInSize: TEdit;
    28. procedure btnCalculateClick(Sender: TObject);
    29. procedure FormCreate(Sender: TObject);
    30. procedure FormDestroy(Sender: TObject);
    31. procedure rbSmallClick(Sender: TObject);
    32. procedure rbNormalClick(Sender: TObject);
    33. procedure rbBigClick(Sender: TObject);
    34. private
    35. FCalculate: TCalculate;
    36. FCurrentSizeGroup: TSizeGroup;
    37. public
    38. end;
    39. var
    40. FormCalculate: TFormCalculate;
    41. implementation
    42. {$R *.dfm}
    43. // Initalisation
    44. procedure TFormCalculate.FormCreate(Sender: TObject);
    45. begin
    46. FCalculate := TCalculate.Create;
    47. FCurrentSizeGroup := siNotInRange;
    48. rbSmall.Checked := True;
    49. end;
    50. procedure TFormCalculate.FormDestroy(Sender: TObject);
    51. begin
    52. FCalculate.Free;
    53. end;
    54. // Work
    55. procedure TFormCalculate.btnCalculateClick(Sender: TObject);
    56. begin
    57. case FCalculate.InRange(StrToInt(edtSize.Text), FCurrentSizeGroup) of
    58. True: edtInSize.Text := 'Jupp';
    59. False: edtInSize.Text := 'Nö';
    60. end;
    61. case FCalculate.GetSizeGroup(StrToInt(edtSize.Text)) of
    62. siSmall: edtSizeGroup.Text := 'kleine Größe';
    63. siNormal: edtSizeGroup.Text := 'normale Größe';
    64. siBig: edtSizeGroup.Text := 'große Größe';
    65. siNotInRange: edtSizeGroup.Text := 'nicht zugeordnet';
    66. end;
    67. end;
    68. // GUI Events
    69. procedure TFormCalculate.rbBigClick(Sender: TObject);
    70. begin
    71. FCurrentSizeGroup := siBig;
    72. end;
    73. procedure TFormCalculate.rbNormalClick(Sender: TObject);
    74. begin
    75. FCurrentSizeGroup := siNormal;
    76. end;
    77. procedure TFormCalculate.rbSmallClick(Sender: TObject);
    78. begin
    79. FCurrentSizeGroup := siSmall;
    80. end;
    81. { TCalculate }
    82. function TCalculate.GetSizeGroup(Size: Integer): TSizeGroup;
    83. var
    84. I: TSizeGroup;
    85. begin
    86. Result := siNotInRange;
    87. for I := Low(TSizeGroup) to High(TSizeGroup) do
    88. begin
    89. case I of
    90. siSmall:
    91. begin
    92. if (Size >= Low(TSizeSmall)) and (Size <= High(TSizeSmall)) then
    93. begin
    94. Result := I;
    95. Break;
    96. end;
    97. end;
    98. siNormal:
    99. begin
    100. if (Size >= Low(TSizeNormal)) and (Size <= High(TSizeNormal)) then
    101. begin
    102. Result := I;
    103. Break;
    104. end;
    105. end;
    106. siBig:
    107. begin
    108. if (Size >= Low(TSizeBig)) and (Size <= High(TSizeBig)) then
    109. begin
    110. Result := I;
    111. Break;
    112. end;
    113. end;
    114. end;
    115. end;
    116. end;
    117. function TCalculate.InRange(Size: Integer; SizeGroup: TSizeGroup): Boolean;
    118. begin
    119. Result := False;
    120. case SizeGroup of
    121. siSmall:
    122. begin
    123. Result := (Size >= Low(TSizeSmall)) and (Size <= High(TSizeSmall));
    124. end;
    125. siNormal:
    126. begin
    127. Result := (Size >= Low(TSizeNormal)) and (Size <= High(TSizeNormal));
    128. end;
    129. siBig:
    130. begin
    131. Result := (Size >= Low(TSizeBig)) and (Size <= High(TSizeBig));
    132. end;
    133. end;
    134. end;
    135. end.
    Bilder
    • Screen.PNG

      5,95 kB, 467×248, 2 mal angesehen
    Dateien
    • Calculator.zip

      (2,15 kB, 1 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „haentschman“ ()

    Neu

    Wenn es nur einmalig gebraucht wird wäre Folgendes möglich

    Quellcode

    1. const
    2. cKleinMin = 0;
    3. cKleinMax = 25;
    4. cMittelMin = cKleinMax+1;
    5. cMittelMax = 35;
    6. cGrossMin = cMittelMax+1;
    7. cGrossMax = 100;
    8. type
    9. TSchuhGruppe = (sgKlien,sgMittel,sgGross,sgFehler);
    10. function SchuhGruppe(Schuhgroesse:integer):TSchuhGruppe;
    11. begin
    12. case Schuhgroesse of
    13. cKleinMin..cKleinMax : result:=sgKlien;
    14. cMittelMin..cMittelMax : result:=sgMittel;
    15. cGrossMin..cGrossMax : result:=sgGross;
    16. else result:=sgFehler
    17. end;
    18. end;