Autor |
Beitrag |
JustusJonas
      
Beiträge: 222
|
Verfasst: Di 03.02.09 19:37
Hallo Leute,
ich hoffe die Frage wurde nicht schon so häufig gestellt, ich habe zumindest in der Boardsuche nichts gefunden.
Ich habe folgenden Code:
Delphi-Quelltext 1: 2:
| if ((DayOfNow(Date) < 3) and (Datum >= LastDayOfMonth2(Datum) -3)) or (Datum > (Date -3)) then begin |
Leider wird die Abfrage nach dem "OR" nicht ausgeführt, da die Abfrage vor dem "OR" wohl true ist.
Ich möchte also eine Abfrage, die beide Bedingungen abprüft und nur wenn beide wahr sind, soll er weitermachen. So wie es mir scheint überprüft er jedoch nur alles vor dem OR und lässt die zweite Abfrage außer Acht.
Habt ihr eine Idee, was ich hier falsch mache? Ich komme einfach nicht dahiner.
Wenn ich die Anweisung in
Delphi-Quelltext 1: 2:
| if (Datum > (Date -3)) then begin |
ändere passiert übrigens genau das, was ich möchte!
Greetz
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Di 03.02.09 19:44
Delphi kürzt ab, sofern der erste Teil der If-Abfrage zutrifft. Ändern kannst du das mit der Compile-Direktive {$B+}. Du kannst das entweder allgemein auf die ganze Unit, oder nur für bestimmte Bereiche anwenden:
Delphi-Quelltext 1: 2: 3: 4:
| {$B+} if ABC then {$B-} |
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Di 03.02.09 20:18
JustusJonas hat folgendes geschrieben : | Leider wird die Abfrage nach dem "OR" nicht ausgeführt, da die Abfrage vor dem "OR" wohl true ist.
Ich möchte also eine Abfrage, die beide Bedingungen abprüft und nur wenn beide wahr sind, soll er weitermachen. So wie es mir scheint überprüft er jedoch nur alles vor dem OR und lässt die zweite Abfrage außer Acht. |
Äh, das ist doch genau der Sinn von or!? Wenn beide Ausdrücke wahr sein müssen, brauchst du and.
GTA-Place: Ich denke mal nicht, dass JustusJonas Delphi noch einen Vergleich zweier Variablen ausführen lassen will, der dann aber verworfen wird
Ich hoffe mal, ich habe nichts falsch verstanden.
Grüße,
Yogu
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 03.02.09 20:19
JustusJonas hat folgendes geschrieben : | Ich möchte also eine Abfrage, die beide Bedingungen abprüft und nur wenn beide wahr sind, soll er weitermachen. |
Dann wäre AND aber angebrachter, oder?
|
|
Maweki
      
Beiträge: 197
Ubuntu Linux
Lazarus
|
Verfasst: Di 03.02.09 20:19
Das passiert uebrigens auch bei AND, wenn der erste Teil der direktive False ist.
Der "Fachbegriff" ist "full boolean evaluation".
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Di 03.02.09 20:34
Ich denke nicht, dass JustusJonas auf der Suche nach {$B+} ist  Ich glaube er hat den Unterschied zwischen OR und AND noch nicht ganz verstanden.
|
|
JustusJonas 
      
Beiträge: 222
|
Verfasst: Mi 04.02.09 16:59
delfiphan hat folgendes geschrieben : | Ich denke nicht, dass JustusJonas auf der Suche nach {$B+} ist Ich glaube er hat den Unterschied zwischen OR und AND noch nicht ganz verstanden. |
Sorry, dass ich mich jetzt länger nicht gemeldet habe.
Ich hatte mich wohl leider wirklich falsch ausgedrückt. Die Anweisung soll natürlich nicht nur weitermachen, wenn beide Bedingungen erfüllt sind, sondern eine der beiden.
Im Grunde sind es ja quasi drei Bedingungen. Er soll also weitermachen, wenn die erste UND die zweite ODER die dritte wahr sind.
Ich hoffe ihr versteht, wie ich das meine!?
Greetz
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 04.02.09 17:04
Dann musst Du nur die OR-Bedingungen zusätzlich klammern.
Delphi-Quelltext 1:
| if ((DayOfNow(Date) < 3) and ((Datum >= LastDayOfMonth2(Datum) -3)) or (Datum > (Date -3))) then |
|
|
JustusJonas 
      
Beiträge: 222
|
Verfasst: Mi 04.02.09 17:08
DeddyH hat folgendes geschrieben : | Dann musst Du nur die OR-Bedingungen zusätzlich klammern.
Delphi-Quelltext 1:
| if ((DayOfNow(Date) < 3) and ((Datum >= LastDayOfMonth2(Datum) -3)) or (Datum > (Date -3))) then | |
Aber das würde ja bedeuten, dass erweitermacht, wenn die erste Bedignung UND die zweite ODER dritte wahr sind.
Ich möchte aber, dass er nur weitermacht, wenn die ersten beiden ODER die dritte wahr sind.
Greetz
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 04.02.09 17:10
Machen denn die einzelnen Datums-Routinen wirklich das, was du von ihnen erwartest? Lass dir mal die Ergebnisse der einzelnen Tests ausgeben - vielleicht läuft da ja schonwas verkehrt.
_________________ We are, we were and will not be.
|
|
Jakob_Ullmann
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: Mi 04.02.09 17:10
Mit ODER sollte man auch vorsichtig sein. Bist du sicher, dass du ODER (= und/oder) meinst? Oder vielleicht eher ENTWEDER ODER (--> xor)
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 04.02.09 17:10
Dann setz die Klammern um die AND-Bedingungen.
[edit] Wobei das eigentlich überflüssig sein sollte, da AND eine stärkere Bindung als OR hat. Evtl. stimmt einfach Deine Logik nicht? [/edit]
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 04.02.09 17:12
Hab ich also doch alles richtig verstanden  Haste mal {B+} probiert?
@DeddyH: Hat er doch schon von Anfang an.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 04.02.09 17:21
|
|
JustusJonas 
      
Beiträge: 222
|
Verfasst: Mi 04.02.09 17:27
Auch mit dem komme ich irgendwie nicht weiter.
Es kann natürlich wirklich sein, dass ich einen Logikfehler drin habe und es gar nicht unbedingt daran liegt...
Ich erklär euch jetzt einfach mal, was ich genau machen möchte und hoffe dies gelingt mir (ansatzweise).
Ich habe ein Edit-Feld, in dem ein Datum steht. Je nach Datum wird eine bestimmte Datei eingelesen. Man darf jedoch nicht mehr als zwei Tage zurückblättern. Die ganze Zeit funktionierte das auch und es funktioniert auch jetzt wieder, aber am 02. Februar gab es damit Probleme.
Ich habe meine Systemzeit jetzt gerade auf den zweiten Februar umgestellt, damit ich testen kann. Ich lass meine Variablen jetzt einfach vor der IF-Anweisung mal in ein Memo laufen, evtl. kann mir jemand von euch dann weiterhelfen. Ich komme nämlich einfach nicht drauf, was da schief läuft...
Delphi-Quelltext 1: 2: 3: 4: 5:
| Memo1.Lines.Add('DayOfNow(Date): ' + IntToStr(DayOfNow(Date))); Memo1.Lines.Add('Datum: ' + DateToStr(Datum)); Memo1.Lines.Add('LastDayOfMonth2(Datum) -3): ' + DateToStr(LastDayOfMonth2(Datum) -3)); Memo1.Lines.Add('Date: ' + DateToStr(Date -3)); Memo1.Lines.Add('----------------'); |
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| DayOfNow(Date): 2 Datum: 01.02.2009 LastDayOfMonth2(Datum) -3): 25.02.2009 Date: 30.01.2009 ---------------- DayOfNow(Date): 2 Datum: 31.01.2009 LastDayOfMonth2(Datum) -3): 28.01.2009 Date: 30.01.2009 ---------------- DayOfNow(Date): 2 Datum: 30.01.2009 LastDayOfMonth2(Datum) -3): 28.01.2009 Date: 30.01.2009 ---------------- DayOfNow(Date): 2 Datum: 29.01.2009 LastDayOfMonth2(Datum) -3): 28.01.2009 Date: 30.01.2009 ---------------- DayOfNow(Date): 2 Datum: 28.01.2009 LastDayOfMonth2(Datum) -3): 28.01.2009 Date: 30.01.2009 ---------------- DayOfNow(Date): 2 Datum: 27.01.2009 LastDayOfMonth2(Datum) -3): 28.01.2009 Date: 30.01.2009 ---------------- |
Wenn ich auf den 27. zurückblättern möchte, bekomme ich dann endlich die Meldung, dass ich nicht weiter zurückblättern darf.
Ihr könnt euch gar nicht vorstellen, wie dankbar ich euch für eure Hilfe bin!!!
Greetz
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 04.02.09 17:41
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 04.02.09 17:44
Deine Vorgehensweise erscheint mir ein bisschen kompliziert.
Delphi-Quelltext 1: 2: 3: 4: 5:
| var Datum, heute: TDate; begin Datum := trunc(StrToDate(Edit.Text)); heute := trunc(date); if (Datum > heute) or (heute - Datum > 2) then |
Getippt und nicht getestet.
[edit] Andere Möglichkeit: if not ((heute - Datum) in [0..2]) then[/edit]
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 04.02.09 17:51
Oder, wie gerade gesagt und noch einfacher (getestet):
Delphi-Quelltext 1:
| if (Datum >= Date - 2) then |
Das hat JustusJonas schon im 1. Post hier erwähnt gehabt, ich weiß nur nicht, warum er es nicht nimmt  .
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 04.02.09 17:53
Vielleicht, weil das nicht ausreicht? Was ist, wenn das Datum in der Zukunft liegt? 
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 04.02.09 17:55
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|