![]() |
Problem mit Prozedur (Integerprüfung) + Überladungen
Ich versuche gerade eine Prozedur zu schreiben der ich eine numerische Variable übergebe sowie einen Standard-, Minimal- und Maximalwert.
Befindet sich In nicht im Rahmen, wird der Standardwert zurückgegeben. Das klappt auch aber ich bekomme es nicht hin das mit überladenen Prozeduren zu realisieren, sodass ich Int64, Integer und alle anderen übergeben kann. Mein kläglicher Versuch. Kompiliert nicht mit dem Fehler, dass keine überladene Prozedur im zweiten Aufruf unten gefunden werden kann
Delphi-Quellcode:
Der Aufruf sähe etwa so aus. Im Beispiel unten hätte die Variable X danach den Wert 123.
type
TIntUtils = record public class procedure CheckInteger(var IntToCheck: Int64; iDefaultValue: Int64; iMinValue: Int64; iMaxValue: Int64); overload; static; class procedure CheckInteger(var IntToCheck: Integer; iDefaultValue: Int64; iMinValue: Int64; iMaxValue: Int64); overload; static; end; implementation class procedure TIntUtils.CheckInteger(var IntToCheck: Int64; iDefaultValue: Int64; iMinValue: Int64; iMaxValue: Int64); begin if (IntToCheck < iMinValue) or (IntToCheck > iMaxValue) then IntToCheck := iDefaultValue; end; class procedure TIntUtils.CheckInteger(var IntToCheck: Integer; iDefaultValue: Int64; iMinValue: Int64; iMaxValue: Int64); begin CheckInteger(Int64(IntToCheck), iDefaultValue, iMinValue, iMaxValue); end;
Delphi-Quellcode:
Wie würdet ihr diese Prozedur schreiben?
var X : Integer
X := 100; TIntUtils.CheckInteger(X, 123, 110, 200) |
AW: Problem mit Prozedur (Integerprüfung) + Überladungen
Zitat:
Ich würde die Unit
Delphi-Quellcode:
für
System.Math
Delphi-Quellcode:
bzw.
InRange(..)
Delphi-Quellcode:
verwenden :P
EnsureRange(..)
PS: Deine Fassung kompiliert nicht da du einen hart gecasteten Wert anscheinend nicht als var-Parameter übergeben kannst? Richtig sähe es so aus
Delphi-Quellcode:
class procedure TIntUtils.CheckInteger(var IntToCheck: Integer; iDefaultValue: Int64; iMinValue: Int64; iMaxValue: Int64);
var asInt64: Int64; begin asInt64 := Int64(IntToCheck); CheckInteger(asInt64, iDefaultValue, iMinValue, iMaxValue); end; PPS: Was macht es für einen Sinn einen Integer als Wert und einen Int64 als Default-Wert zu übergeben? |
AW: Problem mit Prozedur (Integerprüfung) + Überladungen
Weiß ich nicht. Auch deswegen bin ich hier und frage, wie es besser geht.
Delphi-Quellcode:
Da fehlt glaube ich noch
begin
asInt64 := Int64(IntToCheck); CheckInteger(asInt64, iDefaultValue, iMinValue, iMaxValue); end;
Delphi-Quellcode:
IntToCheck := asInt64;
|
AW: Problem mit Prozedur (Integerprüfung) + Überladungen
vielleicht so?
Delphi-Quellcode:
edit
type
TIntUtils = record public class procedure CheckInteger(var IntToCheck: Integer; const iDefaultValue, iMinValue, iMaxValue: Int64); overload; static; class procedure CheckInteger(var IntToCheck: Int64; const iDefaultValue, iMinValue, iMaxValue: Int64); overload; static; end; implementation uses System.Variants; {$R *.dfm} class procedure TIntUtils.CheckInteger(var IntToCheck: Int64; const iDefaultValue, iMinValue, iMaxValue: Int64); begin if ((VarCompareValue(IntToCheck, iMinValue) = vrLessThan) or (VarCompareValue(IntToCheck, iMaxValue) = vrGreaterThan)) then // if (IntToCheck < iMinValue) or (IntToCheck > iMaxValue) then IntToCheck := iDefaultValue; end; class procedure TIntUtils.CheckInteger(var IntToCheck: Integer; const iDefaultValue, iMinValue, iMaxValue: Int64); var asInt64: Int64; begin asInt64 := Int64(IntToCheck); CheckInteger(asInt64, iDefaultValue, iMinValue, iMaxValue); IntToCheck := Integer(asInt64); end; procedure TForm1.FormCreate(Sender: TObject); var X: Integer; Y: Int64; begin X := 1000; Y := 1000; Memo1.Lines.Clear; TIntUtils.CheckInteger(X, 123, 110, 200); TIntUtils.CheckInteger(Y, 123, 110, 200); Memo1.Lines.Add('X: '+IntToStr(X)); Memo1.Lines.Add('Y: '+IntToStr(Y)); end; Hatte Variant Code vergessen zu kopieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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 by Thomas Breitkreuz