AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Operator in If Then Anweisung als Variable möglich ?
Thema durchsuchen
Ansicht
Themen-Optionen

Operator in If Then Anweisung als Variable möglich ?

Ein Thema von gemy · begonnen am 26. Mai 2020 · letzter Beitrag vom 28. Mai 2020
Antwort Antwort
gemy

Registriert seit: 17. Feb 2019
34 Beiträge
 
#1

Operator in If Then Anweisung als Variable möglich ?

  Alt 26. Mai 2020, 21:15
Delphi-Version: 5
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 ).
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
885 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 26. Mai 2020, 21:36
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;
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 26. Mai 2020, 21:37
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
    ...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
gemy

Registriert seit: 17. Feb 2019
34 Beiträge
 
#4

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

  Alt 26. Mai 2020, 21:37
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;
  Mit Zitat antworten Zitat
gemy

Registriert seit: 17. Feb 2019
34 Beiträge
 
#5

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

  Alt 26. Mai 2020, 21:40
Ah super

Das las ich mir gleich mal durch den Kopf gehen.

Danke !!!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 26. Mai 2020, 21:49
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 ...
$2B or not $2B

Geändert von himitsu (26. Mai 2020 um 22:28 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.456 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 27. Mai 2020, 14:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 27. Mai 2020, 17:10
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.
$2B or not $2B

Geändert von himitsu (27. Mai 2020 um 17:13 Uhr)
  Mit Zitat antworten Zitat
gemy

Registriert seit: 17. Feb 2019
34 Beiträge
 
#9

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

  Alt 27. Mai 2020, 22:51
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 28. Mai 2020, 00:33
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));
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13: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