![]() |
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 |
Re: IF Abfrage
Es gibt ein so genanntes Kurzschlussverfahren. Ich verweise hier einfach mal auf
![]() Wird falsch ausgewertet? Inwiefern? |
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?? |
Re: IF Abfrage
Du hast noch nicht gesagt, was dein eigentliches Problem ist :). Anscheinend wird falsch ausgewertet. Was?
|
Re: IF Abfrage
Zitat:
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 |
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! |
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 ;) |
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. |
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! |
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? |
Re: IF Abfrage
Du hast in Deiner Abfrage 8 Bedingungen, zusammengefasst in 4*2 welche mit OR verknüpft sind.
Sprich, wenn eine Deiner 4 Bedingungen zutrifft, dann wird der Rest ausgeführt. Und dabei ist es ganz egal, ob das die erste, zweite, dritte oder vierte Bedingung ist. So, wie der Code dort steht, werden auf jeden Fall alle Bedingungen geprüft, bis eine True ergibt. Edit: zu prüfenden Ausdruck markieren und mit STRG+F7 auswerten. |
Re: IF Abfrage
genau: nenn uns doch mal bitte die variablenwerte für
Merkmal, ID, Temp1.ID, Temp2.ID, Temp1.Name, Temp2.Name, Temp1.Typ, Temp2.Typ, Temp1.Kategorie, Temp2.Kategorie |
Re: IF Abfrage
Ich werde es nochmal Probieren zu erklären!
Ich will mit dieser Abfrage erreichen
Delphi-Quellcode:
das je nach dem was Merkmal für einen Wert beeinhaltet, ein BubbleSort realisiert wird!
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 Das wirkliche Tauschen der position in der Datei wird erst in dem then Teil ausgeführt, da es ja bei allen(also egal welchen Wert Merkmal hatt) das selbe ist! Nur die Abfragen nach den Abfragen welchen Wert Merkmal beeinhaltet ist für die unterschiedlichen Fälle anders! Aber der Code oben, funktioniert bei mir nicht und ich verstehe nicht warum(habe das so schon öffters gemacht)?? Welche sagen es liegt am Delphi Compiler andere sagen es muss so laufen. Tut es aber nicht, das Problem liegt ganz klar da, das als erstes geprüft wird ob Merkmal = N ist (ist es aber nicht) und dann testet er den ersten or Teil überhaupt nicht mehr.....TELL MI WHY (bin schon min. 10 mal mit dem debugger durch--> keine Idee!!) :wall: :wall: :wall: :wall: :wall: :wall: :wall: @computer-glossar.de ID := 1,2,3,4.... Name:= String[50] Typ:=(CD,DVD) Kategorie:= (Film,Musik,Software,SonstigeDaten) Da liegt aber auch nicht der Fehler, er müsste ja zumindest mal den Ausdruck auswerten tut er aber net! |
Re: IF Abfrage
Moin!
Wenn Du das machst:
Delphi-Quellcode:
Welche Meldungen bekommst Du?
If ((Merkmal = ID) and (Temp1.ID < Temp2.ID)) then
ShowMessage('1'); If ((Merkmal = N) and (Temp1.Name < Temp2.Name)) then ShowMessage('2'); If ((Merkmal = T) and (Temp1.Typ < Temp2.Typ)) then ShowMessage('3'); If ((Merkmal = K) and (Temp1.Kategorie < Temp2.Kategorie)) then ShowMessage('4'); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 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