Autor Beitrag
JustusJonas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 222



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
if ((DayOfNow(Date) < 3and (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
ausblenden Delphi-Quelltext
1:
2:
if (Datum > (Date -3)) then 
begin


ändere passiert übrigens genau das, was ich möchte!

Greetz
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
{$B+}   // komplette Auswertung an
if ABC then
  // ...
{$B-}   // komplette Auswertung aus

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Di 03.02.09 20:18 
user profile iconJustusJonas hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconGTA-Place: Ich denke mal nicht, dass user profile iconJustusJonas 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



BeitragVerfasst: Di 03.02.09 20:19 
user profile iconJustusJonas hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 197

Ubuntu Linux
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Di 03.02.09 20:34 
Ich denke nicht, dass user profile iconJustusJonas auf der Suche nach {$B+} ist ;) Ich glaube er hat den Unterschied zwischen OR und AND noch nicht ganz verstanden.
JustusJonas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 222



BeitragVerfasst: Mi 04.02.09 16:59 
user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
Ich denke nicht, dass user profile iconJustusJonas 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



BeitragVerfasst: Mi 04.02.09 17:04 
Dann musst Du nur die OR-Bedingungen zusätzlich klammern.
ausblenden Delphi-Quelltext
1:
if ((DayOfNow(Date) < 3and ((Datum >= LastDayOfMonth2(Datum) -3)) or (Datum > (Date -3))) then					
JustusJonas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 222



BeitragVerfasst: Mi 04.02.09 17:08 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Dann musst Du nur die OR-Bedingungen zusätzlich klammern.
ausblenden Delphi-Quelltext
1:
if ((DayOfNow(Date) < 3and ((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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 04.02.09 17:12 
Hab ich also doch alles richtig verstanden :cool: 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



BeitragVerfasst: Mi 04.02.09 17:21 
Siehe mein Edit.
JustusJonas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 222



BeitragVerfasst: Mi 04.02.09 17:27 
Auch mit dem {B+} 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...

ausblenden 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('----------------');



ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 04.02.09 17:41 
Da ist ein Denkfehler drin: Du ziehst vom letzten Tag des Monats immer 3 Tage ab, egal welcher Tag heute ist. Reicht denn nicht folgendes?

ausblenden Delphi-Quelltext
1:
if (Datum >= Date - 2then					

In deiner komplizierten Fassung müsste das so stimmen:

ausblenden Delphi-Quelltext
1:
if ((DayOfNow(Date) < 3and (Datum >= LastDayOfMonth2(Datum) - (2 - DayOfNow(Date)))) or (Datum > (Date -3)) then					

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.02.09 17:44 
Deine Vorgehensweise erscheint mir ein bisschen kompliziert.
ausblenden 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 > 2then

Getippt und nicht getestet.

[edit] Andere Möglichkeit:if not ((heute - Datum) in [0..2]) then[/edit]
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 04.02.09 17:51 
Oder, wie gerade gesagt und noch einfacher (getestet):

ausblenden Delphi-Quelltext
1:
if (Datum >= Date - 2then					

Das hat JustusJonas schon im 1. Post hier erwähnt gehabt, ich weiß nur nicht, warum er es nicht nimmt :gruebel:.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 04.02.09 17:53 
Vielleicht, weil das nicht ausreicht? Was ist, wenn das Datum in der Zukunft liegt? :zwinker:
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Mi 04.02.09 17:55 
Nagut, überzeugt:

ausblenden Delphi-Quelltext
1:
if Abs(Date - Datum) <= 2 then					

oder:

ausblenden Delphi-Quelltext
1:
if DaysBetween(Datum, Date) <= 2 then					

8)

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)