![]() |
Delphi-Version: 2005
CompareDate gibt immer 1 aus...
Merkwürdiges Verhalten bei CompareDate
Egal ob der erste Datumwert kleiner, größer, oder gleich dem Zweiten ist: Der Wert ist immer 1 Hat jemand sowas schon erlebt?
Delphi-Quellcode:
var
a, b:TDate; begin a:= now; if Key = VK_Return then begin b:= strtodate(Edit1.Text); Label1.Caption:= inttostr(compareDate(a,b)); end; end; |
AW: CompareDate gibt immer 1 aus...
Bedenke bitte, dass es im Grunde egal ist ob du TDateTime oder TDate oder TTime nimmst. Im Hintergrund ist alles TDateTime. Das ist irreführend, aber TDate speichert nicht Datum, sondern auch Uhrzeit ab.
Wenn du also eine TDate Variable definierst und ihr Now zuweist, dann hast du ihr Datum und Uhrzeit zugewiesen. Die Variable enthält also den TDateTime Wert. Und Now jetzt, selbst wenn es eine TDate Variable ist, und Now eine Millisekunde später, sind nicht gleich. Lösung: - Statt Now Funktion Date Funktion nehmen. Die gibt nur das Datum zurück. - oder Trunc(Now) eingeben. Damit wird die Uhrzeit angeschnitten. |
AW: CompareDate gibt immer 1 aus...
@Popov: Ich nahm an, weil du Delphi 7 hast, kannst du nachschauen, was CompareDate macht. CompareDate vergleicht nur den Datumsteil, oder anders ausgedrückt: beide Parameter werden einem
Delphi-Quellcode:
unterzogen (zumindest für den Vergleich auf Gleichheit).
Trunc
Die Frage ist also: Was steht in den beiden Variablen a und b drin? Das bekommt man ja leicht raus mit DateToStr. MfG Dalai |
AW: CompareDate gibt immer 1 aus...
Ich hab vorher den Code nicht ausprobiert, aber CompareDate gibt richtige Ergebnisse raus. Vorausgesetzt die Eingabe ist richtig, z. B. "15.05.2015".
|
AW: CompareDate gibt immer 1 aus...
Nimm mal die 'If Key=' Abfrage raus. Wäre ja denkbar, das es sich nur um ein Wahrnehmungsproblem handelt. Ansonsten stelle das Problem mit einem kleinen Testprogramm dar.
Delphi-Quellcode:
Trage jeweils deine Testdaten ein, mit denen bei Dir angeblich '1' rauskommt.
Program Tester;
{$APPTYPE CONSOLE} Procedure TestCompareDate (a : TDate; bStr : String); var b : TDate; Begin b := StrToDate(bStr); Writeln ('CompareDate('DateToStr(a),',',DateToStr(b),')=',CompareDate(a,b)); End; begin TestCompareDate(Now,'1.1.2015'); TestCompareDate(Now,'1.1.2016'); end. |
AW: CompareDate gibt immer 1 aus...
Zitat:
Aber hier:
Delphi-Quellcode:
Das Ergebnis bleibt immer 1.
function TForm1.Tagedazwischen(vor, nach:TDate):Integer;
begin if compareDate(vor,nach) >= 0 then Result:= daysbetween(vor,nach) Else if compareDate(vor,nach) < 0 then Result := -1; end; Und eine Meldung lautet: [Warnung] Unit1.pas(94): W1035 Rückgabewert der Funktion 'TForm1.Tagedazwischen' könnte undefiniert sein Warum? Aufgerufewn wird die Funktion hier:
Delphi-Quellcode:
Dabei spielt es keine Rolle ob ich Zeitraum(Now) oder Zeitraum(Date) schreibe.
procedure TForm1.Zeitraum(dt:TDate);
var vorTag:TDate; begin Gauge1.Progress:=0; Gauge2.Progress:=0;Gauge3.Progress:=0; vorTag:= strtoDate('17.04.2015'); if wievieltePackung(Tagedazwischen(dt, vorTag)) >= 1 then Gauge1.Progress:= round(100 / 28 * Tagedazwischen(dt, vorTag)); |
AW: CompareDate gibt immer 1 aus...
Zitat:
[edit]
Delphi-Quellcode:
:roll:
function TForm1.TageDazwischen(vor, nach: TDate): Integer;
begin if CompareDate(vor, nach) >= 0 then Result := DaysBetween(vor, nach) else if CompareDate(vor, nach) < 0 then Result := -1 {else Result := ???}; end;
Delphi-Quellcode:
:stupid:
function TForm1.TageDazwischen(vor, nach: TDate): Integer;
begin if CompareDate(vor, nach) >= 0 then Result := DaysBetween(vor, nach) else //if CompareDate(vor, nach) < 0 then // Oder das weglassen, da eh sinnlos, aber das weiß der Compiler ja nicht. Result := -1; end; |
AW: CompareDate gibt immer 1 aus...
Zitat:
Zitat:
Zitat:
MfG Dalai |
AW: CompareDate gibt immer 1 aus...
Zitat:
Aber vielleicht noch paar Hinweise und Fragen:
Delphi-Quellcode:
Wenn
function TForm1.Tagedazwischen(vor, nach:TDate):Integer;
begin if compareDate(vor,nach) >= 0 then Result:= daysbetween(vor,nach) Else if compareDate(vor,nach) < 0 then Result := -1; end;
Delphi-Quellcode:
größer, gleich Null sind, warum fragst du dann später nochmal mit
compareDate(vor,nach) >= 0
Delphi-Quellcode:
ob es kleiner Null ist?
compareDate(vor,nach) < 0
Im Code
Delphi-Quellcode:
steht vor vor nach. In der Funktion
compareDate(vor,nach)
Delphi-Quellcode:
ist in der Zeile
Zeitraum
Delphi-Quellcode:
der vorTag an zweiter Stelle. Ich weiß nicht welche Tage in dt stehen, aber ich gehe davon aus, dass es nachTage sind. Vielleicht solltest du für den Fall in der Funktion Tagedazwischen zuerst vor und nach sortieren, also prüfen ob vor auch wirklich das frühere Datum ist. Ansonsten prüfst du drauf ob das spätere Datum vor dem älteren Datum steht. Das Ergebnis wäre in dem Fall -1.
wievieltePackung(Tagedazwischen(dt, vorTag))
|
AW: CompareDate gibt immer 1 aus...
Zitat:
Delphi-Quellcode:
Es bleibt 1, auch wenn das erste Datum größer als das 2. ist.
function TForm1.Tagedazwischen(vor, nach:TDate):Integer;
begin if compareDate(vor,nach) >= 0 then Result:= daysbetween(vor,nach) Else //if compareDate(vor,nach) < 0 then Result := -1; Result := -1; end; Result := -1 wird nicht ausgegeben. Die Fehlermeldung ist allerdings weg. Normalerweise wird die Procedure Zeitraum(date), in der die Function liegt im OnCreate der Form aufgerufen:
Delphi-Quellcode:
Hier die Procedure:
procedure TForm1.FormCreate(Sender: TObject);
begin BorderIcons := [biSystemmenu]; Statusbar1.panels[0].text:='Datum: '+ DatetoStr(Date); Statusbar1.panels[1].text:='Woche: '+ InttoStr(WeekOf(Date)); Zeitraum(Date); //<- Enthält die Function Tagedazwischen fuelleLabels; end;
Delphi-Quellcode:
procedure TForm1.Zeitraum(dt:TDate);
var vorTag:TDate; //<- 1 Tag vor der 1. Tablette begin Gauge1.Progress:=0; Gauge2.Progress:=0;Gauge3.Progress:=0; vorTag:= strtoDate('17.04.2015'); if wievieltePackung(Tagedazwischen(dt, vorTag)) >= 1 then Gauge1.Progress:= round(100 / 28 * Tagedazwischen(dt, vorTag)); if wievieltePackung(daysbetween(dt, vorTag)) >= 2 then Gauge2.Progress:= round(100 / 28 * Tagedazwischen(dt, vorTag+incday(27))); if wievieltePackung(daysbetween(dt, vorTag)) > 2 then Gauge3.Progress:= round(100 / 28 * Tagedazwischen(dt, vorTag+incDay(55))); Gauge4.Progress:= round(100 / 84 * Tagedazwischen(dt, vorTag)); if Tagedazwischen(dt, vortag) <= 84 then Label14.caption:= ' Tabletten genommen: ' + inttostr(Tagedazwischen(dt, vortag))+ '/84' else Label14.caption:= ' Tabletten genommen: 84/84'; Label15.Caption:= inttostr(compareDate(dt, vortag)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 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