Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi IF Abfrage (https://www.delphipraxis.net/93498-if-abfrage.html)

Stillmatic 6. Jun 2007 20:34


IF Abfrage
 
Kann mir einer von euch sagen warum bei dieser ID Abfrage immer nur der erste Fall geprüft wird??

Delphi-Quellcode:
       if (((Merkmal = ID) and (Temp1.ID < Temp2.ID))
      or ((Merkmal = N) and (Temp1.Name < Temp2.Name))
      or ((Merkmal = T) and (Temp1.Typ < Temp2.Typ))
      or ((Merkmal = K) and (Temp1.Kategorie < Temp2.Kategorie)))then

Apollonius 6. Jun 2007 20:38

Re: IF Abfrage
 
Es gibt ein so genanntes Kurzschlussverfahren. Ich verweise hier einfach mal auf dsdt.

Wird falsch ausgewertet? Inwiefern?

Stillmatic 6. Jun 2007 20:52

Re: IF Abfrage
 
Ahhh, ich verstehe!!

Ist mir so noch nie passiert, Komisch! :gruebel:

Aber mein Problem ist das ich diese Abfrage machen muss,da er bei allen Fällen das selbe ausführen muss, aber ich will doppelten Code vermeiden!!

Wie könnte man es denn noch machen??

Apollonius 6. Jun 2007 20:58

Re: IF Abfrage
 
Du hast noch nicht gesagt, was dein eigentliches Problem ist :). Anscheinend wird falsch ausgewertet. Was?

semo 6. Jun 2007 21:05

Re: IF Abfrage
 
Zitat:

Kann mir einer von euch sagen warum bei dieser ID Abfrage immer nur der erste Fall geprüft wird??
wenn der erste fall bereits true ergibt, dann werden die weiteren fälle erst gar nicht geprüft.
für mich sieht das logisch aus. sehe da kein problem.

oder möchtest du das ALLE bedingungen erfüllt werden sollen?
dann muss das so aussehen:
Delphi-Quellcode:
if (((Merkmal = ID) and (Temp1.ID < Temp2.ID))
      and ((Merkmal = N) and (Temp1.Name < Temp2.Name))
      and ((Merkmal = T) and (Temp1.Typ < Temp2.Typ))
      and ((Merkmal = K) and (Temp1.Kategorie < Temp2.Kategorie)))then

Stillmatic 6. Jun 2007 21:12

Re: IF Abfrage
 
Nein Nein!

Mein Problem ist das Irgendetwas mit der Abfrage nicht stimmt!

Ich will das der erste Fall geprüft wird, wenn er Treu ergibt tue irgendetwas, wenn er False ergibt prüfe die nächste Bedingung!!

Also im Klartext....

if ((Merkmal = ID) and (Temp1.ID < Temp2.ID)) ---> false dann Prüfe nächste Bedingung
or ((Merkmal = N) and (Temp1.Name < Temp2.Name)) ---> false dann Prüfe nächste Bedingung
or ((Merkmal = T) and (Temp1.Typ < Temp2.Typ)) ---> true dann führe Then Teil durch!
or ((Merkmal = K) and (Temp1.Kategorie < Temp2.Kategorie))then

Das Problem besteht genau darin, das wenn ich auf einen Button drücke wird Merkmal(z.B T)!
Dann geht er in die Bedingung rein und prüft den ersten Fall, wenn der False ist werden die anderen Fälle erst garnicht geprüft,
weil Delphi mit dem Kurzschlussverfahren arbeitet!

jfheins 6. Jun 2007 21:26

Re: IF Abfrage
 
Soweit ich weis kürz dieses Verfahren nur bereits sichere Vergleiche ab ;)

Wenn das Programm also gerade da ist: if (Falso and ...) then und die ... auswerten soll (das davor wurde vorher als False ausgewertet) dann überspringt er das weil es ja nicht mehr True geben kann - es ist logisch unmöglich. Das Gleich passiert bei if aor b then - wenn a bereits True gibt wird b nicht mehr ausgewertet.

Und glaube mir, der Kompiler macht da keinen fehler, das wäre anderen schon vorher aufgefallen ;)

SirThornberry 6. Jun 2007 22:04

Re: IF Abfrage
 
wie bereits erwähnt macht der compiler da keinen fehler. Wie kommst du darauf das der Compiler nicht weiter prüft?
Ich hoffe du gehst nicht davon aus das durh deinen Zeilenumbruch für jede Zeile ein Haltepunkt möglich ist und du es daran fest machst. Pro If kannst du nur einen Haltepunkt setzen. Nutze einfach den Debugger um festzustellen wo etwas nicht klappt.

Stillmatic 6. Jun 2007 22:07

Re: IF Abfrage
 
Aber wie soll ich denn dann eine Abfrage Programmieren die 8 Bedingungen verknüpft mit and und or??

Also so gesehen 4 Bedingungen mit or verknüpft die im then-Teil alle das gleiche machen sollen!

Ja. Ich könnte jede Abfrage einzeln schreiben mit dem dazugehörigen then Teil, doch dann hätte ich ja jede Menge doppelten code!
(Nein, ich kann den then-Teil nicht in eine extra Procedure / Funktion setzen)!!

@SirThornberry
Ich behaupte ja auch nicht das der Compiler schuld ist, ich suche nur nach einer Lösung die sich meiner ähnelt und doppelten Code meidet!

SirThornberry 6. Jun 2007 22:13

Re: IF Abfrage
 
am besten den Debugger bemühen, schauen welchen Wert die Variablen haben und auch die WatchList kann dir helfen. Wenn du einen Haltepunkt setzt kannst du ja einfach mal den Teilausdruck markieren welcher deiner Meinung nach True ergibt und dann die Maus über das markierte halten und schauen was wirklich raus kommt.

Vielleicht liegt dein Denkfehler aber auch bei: Temp1.Name < Temp2.Name
Du weißt schon das '9' größer ist als '10' oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.
Seite 1 von 2  1 2      

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