![]() |
Delphi-Version: 5
Operator in If Then Anweisung als Variable möglich ?
Guten Abend.
Ohne lang zu erklären wofür ich das brauche : Ist es generell möglich das größer > bzw kleiner < Zeichen als Variable in eine "If Then Anweisung" einzusetzen? z.B.: IF a < b then ... das kleiner Zeichen will ich nun als Variable haben die < oder > sein kann. If a <x> b then... wobei x das kleiner Zeichen oder das größer Zeichen sein kann (nicht als string ). |
AW: Operator in If Then Anweisung als Variable möglich ?
So direkt geht das nicht. Du könntest aber eine Compare-Funktion schreiben, die nicht nur a und b als Parameter hat, sondern auch den Vergleichsoperator. Letzteren dargestellt als Char, Integer oder (vermutlich am sinnvollsten) Aufzählungstyp.
Delphi-Quellcode:
function MyCompare(a,b: Integer; operator: TMyOperatorEnum): boolean;
begin case operator of op_lesser: result := a < b; op_bigger: result := a > b; op_lesser_eq: result := a <= b; // ... end; end; |
AW: Operator in If Then Anweisung als Variable möglich ?
So wie du es dir vorstellst geht es nicht. Allerdings könntest du eine anonyme Funktion verwenden und die dann zum Vergleich aufrufen:
Delphi-Quellcode:
type
TMyComparer = reference to function(const AValue1, AValue2: Integer): Boolean; var Comparer: TMyComparer; begin Comparer := function(const AValue1, AValue2: Integer): Boolean; begin Result := AValue1 < AValue2; end; // Verwendung: if Comparer(a, b) then ... |
AW: Operator in If Then Anweisung als Variable möglich ?
Ah ich glaub ich habe eine Lösung gerade auf dem Klo erdacht.
Ich baue mir eine Funktion EIngangswerte: var a,b : integer; var c: boolean; a:= 20; b:= 30; c:= bool(random(1));
Delphi-Quellcode:
function ifThen(val1, val2: integer; val3: boolean): boolean;
begin case val3: true: if val1 > val2 then result := true else result := false; false: if val1 < val2 then result := false else result := true; end; end; |
AW: Operator in If Then Anweisung als Variable möglich ?
Ah super
Das las ich mir gleich mal durch den Kopf gehen. Danke !!!:-D |
AW: Operator in If Then Anweisung als Variable möglich ?
Delphi-Quellcode:
const
LessThanValue = Low(TValueRelationship); EqualsValue = 0; GreaterThanValue = High(TValueRelationship); so lange es kein <= und >= gibt, also nur <, > oder =
Delphi-Quellcode:
uses System.Math;
var EineVariable: TValueRelationship; EineVariable := LessThanValue; // -1, 0 oder +1, bzw. die Konstanten if CompareValue(A, B) = EineVariable then ... Oder man könnte es auch als SET machen,
Delphi-Quellcode:
aber weil Enum und Negativ sich nicht mag
var EineVariable: set of TValueRelationship; // set of -1..1;
EineVariable := [0, 1]; // -1, 0 und/oder +1 if CompareValue(A, B) in EineVariable then ...
Delphi-Quellcode:
var EineVariable: set of 0..2;
EineVariable := [1, 2]; // 0, 1 und/oder 2 if (CompareValue(A, B) + 1) in EineVariable then ... |
AW: Operator in If Then Anweisung als Variable möglich ?
Warum TValueRelationship mit Gewalt auf eine Zahl mappen? Einfach ein enum TValueRelationship = (less, equal, greater) und bei Bedarf noch ein TValueRelationshipSet = set of TValueRelationship.
Magic values sind unclean. |
AW: Operator in If Then Anweisung als Variable möglich ?
Mit Gewalt war da nichts. Das ist weil es eine schon immer Zahl ist/war,
bzw. früher war es nur die Zahl und die Namen/Konstanten wurden dann da draufgelegt, aber da negative Zahlen in Delphi nicht in einen Enum passen, konnte es nicht einfach durch einen Enum überlagert werden, ohne die binären Werte zu ändern. Für eine ähnliche Vergleichfunktion gab es mal im Delphi einen Enum, aber der verschwand schnell wieder und nun sind dort die Werte gleich. Es gibt/gab aber noch irgendwo ein paar CompareFunktionen, die haben Integer als Rückgabewert haben/hatten ... da könnte man zumindestens den selben Typ verwenden, damit man auch dort besser sieht was zurück kommt. |
AW: Operator in If Then Anweisung als Variable möglich ?
Servus,
habe das nun so zum laufen bekommen. Dürfte Korrekt sein oder :
Delphi-Quellcode:
type
TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; type TValueRelationship = (less, equal, greater); var Form1: TForm1; tvaluerset : set of TValueRelationship; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var a,b : currency; var c: integer; begin tvaluerset:= [greater]; a:= 30; b:= 20.508494094; if TValueRelationship((CompareValue(a, b) +1)) in tvaluerset then showmessage('test'); end; end. Aber beim experimentieren ist mir aufgefallen : Man könnte doch einfach auch so schreiben :
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var a,b : currency; var c: integer; begin c :=1; // 0 1 oder 2 a:= 30; b:= 20.508494094; if (CompareValue(a, b) +1) = c then showmessage('test'); end; Danke für eure Antworten, woher kennt man eigentlich Typen wie TValueRelationship ? Es gibt doch soviele hunderte Typen... |
AW: Operator in If Then Anweisung als Variable möglich ?
Ich würde den "unterschiedlichen" Typ vielleicht nicht gleich/identisch benennen, wie den Typen der RTL (Rückgabewert von CompareValue).
Aber joar, sie passend aus. PS: Ohne Umrechnung (+1) könnte es so aussehn, aber über die RTTI hier diesen Enum/Set in einen String umwandeln lassen zu wollen geht dann nicht mehr.
Delphi-Quellcode:
{$MINENUMSIZE 1} // -1..1 sollte nur ein Byte groß sein (hatte grad keine Luste das mal nachzusehn, aber sollte so sein)
type TValueRelationshipEnum = (equal, greater, less=Byte(-128));
Delphi-Quellcode:
{$MINENUMSIZE 4} // Integergröße (so groß, wie derartige Verleichtstypen der WindowsAPI)
type TValueRelationshipEnum = (equal, greater, less=Cardinal(-2147483648)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 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