Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Operator in If Then Anweisung als Variable möglich ? (https://www.delphipraxis.net/204399-operator-if-then-anweisung-als-variable-moeglich.html)

gemy 26. Mai 2020 20:15

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 ).

Gausi 26. Mai 2020 20:36

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;

jaenicke 26. Mai 2020 20:37

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
    ...

gemy 26. Mai 2020 20:37

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;

gemy 26. Mai 2020 20:40

AW: Operator in If Then Anweisung als Variable möglich ?
 
Ah super

Das las ich mir gleich mal durch den Kopf gehen.

Danke !!!:-D

himitsu 26. Mai 2020 20:49

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:
var EineVariable: set of TValueRelationship; // set of -1..1;

EineVariable := [0, 1]; // -1, 0 und/oder +1
if CompareValue(A, B) in EineVariable then ...
aber weil Enum und Negativ sich nicht mag
Delphi-Quellcode:
var EineVariable: set of 0..2;

EineVariable := [1, 2]; // 0, 1 und/oder 2
if (CompareValue(A, B) + 1) in EineVariable then ...

freimatz 27. Mai 2020 13:24

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.

himitsu 27. Mai 2020 16:10

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.

gemy 27. Mai 2020 21:51

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...

himitsu 27. Mai 2020 23:33

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 03:08 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