Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   IF-Abfrage genererieren (https://www.delphipraxis.net/60572-if-abfrage-genererieren.html)

wurz3l 9. Jan 2006 14:20


IF-Abfrage genererieren
 
HiHo,

ich habe da mal ein kleines Problem in meinem Programm welches ich gerade schreibe.
Ich habe auch schon die Suche bemüht, da ich jedoch nicht genau weiss worunter ich suchen muss, und/oder soetwas noch nicht gefragt wurde, schreibe ich einen neuen Beitrag.

Ich würde gerne eine IF-Abfrage genererieren, oder wie man das auch beschreiben mag ;)

Ich habe eine 'Tabelle' in der folgenden Art:
Tabelle - Qualitätsstufe | Bedingung | Wert
1. A | größer gleich | 80
2. B | größer gleich | 60
3. C | kleiner | 60

Diese Tabelle kann innerhalb des Programmes editiert werden.
Es soll dann z.B. die Zahl 71 eingestuft werden.
1. 71 größer gleich 80 = FALSCH
2. 71 größer gleich 60 = RICHTIG : Ausgabe C

Wie kann ich dieses 'Aufbereiten'.

Ich habe eine 'Lösung', finde diese jedoch tierisch umständlich.

Delphi-Quellcode:
if Operator = 'größer gleich' then
begin
   if Wert >= Abfrage then
      Ergebnis := Quali;
end else if Operator = 'größer' then
begin
   if Wert > Abfrage then
      Ergebnis := Quali;
end else if Operator = 'kleiner' then
begin
   if Wert > Abfrage then
      Ergebnis := Quali;
end;
Und nun meine frage ^^
Gibt es eine Einfacherer Möglichkeit die if-Abfrage einfacher zu generieren.

wurz3l 11. Jan 2006 14:15

Re: IF-Abfrage genererieren
 
Hmmm, kann mir keiner helfen? :cry:

3_of_8 11. Jan 2006 14:22

Re: IF-Abfrage genererieren
 
Ich glaube, einfacher geht es nicht. Aber in der letzten Abfrage ist ein Fehler: Statt < steht da >.

himitsu 11. Jan 2006 14:24

Re: IF-Abfrage genererieren
 
Da ja überall das Selbe ausgeführt wird, ginge es auch so:
Delphi-Quellcode:
if ((Operator = 'größer gleich') and (Wert >= Abfrage))
  or ((Operator = 'größer') and (Wert > Abfrage))
  or ((Operator = 'kleiner') and (Wert < Abfrage)) then
  Ergebnis := Quali;

Und wenn du statt dem Text sowas wie 'nen Index verwende würdest, dann könnte man auch noch die "unpraktischen" Textvergleiche einsparen.
(z.B. 0=größergleich 1=größer 2=kleiner ...)

PS: ich glaub da wolltest du ein "kleiner als" haben?
Code:
end else if Operator = 'kleiner' then
begin
   if Wert [color=#ff0000][b]<[/b][/color] Abfrage then
      Ergebnis := Quali;
[add]
Zitat:

Zitat von 3_of_8
Aber in der letzten Abfrage ist ein Fehler: Statt < steht da >.

gut erkannt
Zitat:

Zitat von 3_of_8
Ich glaube, einfacher geht es nicht. Aber in der letzten Abfrage ist ein Fehler: Statt < steht da >.

aber es geht doch :zwinker:

Khabarakh 11. Jan 2006 14:25

Re: IF-Abfrage genererieren
 
Du könntest auch Funktionszeiger benutzen, aber ob das bei so wenigen Operatoren wirklich einfacher ist...
Delphi-Quellcode:
type
  TCompareFunction = function(a, b: Integer): Boolean;
 
  TOperator = record
    Name: string;
    Function: TCompareFunction;
  end;

[...]

  myOperators: Array of TOperator = ((Name: 'kleiner', Function: IsLesser), [...]
[add]Recordfeldernamen etwas dumm gewählt :duck: . [/add]

wurz3l 11. Jan 2006 15:29

Re: IF-Abfrage genererieren
 
Das mit dem Funktionszeiger ist mir dann doch ein bischen zu 'hoch' :-D
Habt ihr aber beide gut beobachtet, habe oben ein Fehler in den Abfragen

himitsu hatte das schon ganz richtig gesehen, das vereinfachen der Abfrage bringt doch schon einiges...
Habe mal ein StringGrid mit meinen Qualitätsstufen gefüllt und dann per Button frage ich es ab.
Nicht gerade die eleganteste Möglichkeit, aber es reicht mir :-D

Delphi-Quellcode:
procedure TfrmConfig.Button1Click(Sender: TObject);
var
   i: Integer;
begin
   LabelQGrade.Caption := '';
   for i := StringGrid1.RowCount-1 downto 1 do
   begin
      if ((StringGrid1.Cells[2,i] = '>=') and (StrToFloat(EditValue1.Text) >= StrToFloat(StringGrid1.Cells[3,i]))) or
            ((StringGrid1.Cells[2,i] = '>') and (StrToFloat(EditValue1.Text) > StrToFloat(StringGrid1.Cells[3,i]))) or
            ((StringGrid1.Cells[2,i] = '<=') and (StrToFloat(EditValue1.Text) <= StrToFloat(StringGrid1.Cells[3,i]))) or
            ((StringGrid1.Cells[2,i] = '<') and (StrToFloat(EditValue1.Text) < StrToFloat(StringGrid1.Cells[3,i]))) then
         LabelQGrade.Caption := StringGrid1.Cells[1,i]
   end;
end;
Vielen Dank an euch, dann mache ich mich mal an das abspeichern des Grids ^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:49 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