Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Datum auf Fehler prüfen - Deutsches Datumsformat (https://www.delphipraxis.net/140628-datum-auf-fehler-pruefen-deutsches-datumsformat.html)

Wolfgang Mix 22. Sep 2009 14:14


Datum auf Fehler prüfen - Deutsches Datumsformat
 
Hallo Profis

Überlege gerade, wie ich mit 'ner kurzen Funktion ein Datum auf Plausibilität prüfen kann.
Vorab mein Brainstorming:
Soll bei deutschem Datum funktionieren.

Delphi-Quellcode:
function IsDateOk(d,m,y:integer):boolean;
begin
  result:=true;
  //try
  EncodeDate(y,m,d);
  //OnError.. result:=false
  //except ...
  //finally
end;

procedure TForm1.Button1Click(Sender: TObject);
var test:boolean;
begin
  test:=IsDateOk(30,2,-1);
  Edit1.Text:=BoolToStr(test);
end;

end.
Wird das ungefähr so hinhauen oder muß ich das Datum selber zerpflücken?
EncodeDtate bringt ja schöne Abstürze bei inkorrekten Übergabewerten.

Gruß

Wolfgang

BackOrifice 22. Sep 2009 14:23

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Ich weiß, dass ist keine direkte Antwort auf deine Frage, aber:

.. was hälst du von TDateTimePicker? Mit der Eigenschaft "nur Datum" ziemlich nützlich, denn der Benutzer kann keine falschen Daten eintragen.

//Edit: Du kannst natürlich auch alles manuell grundlegend prüfen: Tag >= 1 und <= 31, Monat >= 1 und <= 12 usw. Danach in EncodeDate reinhalten. Keine Ahnung, obs funktioniert :mrgreen:

mkinzler 22. Sep 2009 14:29

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Delphi-Quellcode:
If StrToDateDef( <string>, <default>, Format) = <Default> then // Datum im Strig nicht korrekt

Wolfgang Mix 22. Sep 2009 14:31

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
@BackOrifice

BackOrifice hat geschrieben:

Zitat:

.. was hälst du von TDateTimePicker? Mit der Eigenschaft "nur Datum" ziemlich nützlich, denn der Benutzer kann keine falschen Daten eintragen.
Garnix, andere Datumroutinen sollen erst gestartet werden, wenn das Datum okay ist.

Trotzdem danke

Wolfgang

mirage228 22. Sep 2009 14:41

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Gibts nicht auch Delphi-Referenz durchsuchenTryStrToDateTime ?

Nersgatt 22. Sep 2009 14:54

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Ja, es gibt tryStrToDate.

Kleines Beispiel für Wolfgang:
Delphi-Quellcode:
var str : string;
    d : TDateTime;
begin

  str := InputBox('Datum', 'Bitte geben sie ein Datum ein', '');
  if tryStrToDate(str, d) then
  begin
    showMessage('Sie haben ' + FormatDateTime('ddd, dd. MMMM yyyy', d) + ' eingegeben')
  end;

end;

Wolfgang Mix 22. Sep 2009 18:36

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
@Nersgatt

Danke, da bringt mich schon weiter nach vorn.
Der Code scheint sogar absturzfest zu sein ;-)
Hast Du noch die Variante mit dem internationalen Format?
Jetzt muß ich mir nur noch den Datumsstring basteln. :-)

Gruß

Wolfgang

Nersgatt 22. Sep 2009 19:15

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Der Code arbeitet sowohl auf einem Deutschen Windows, als auch auf einem Englischen Windows korrekt. Halt je nach Einstellung des Systems.
Geh mal in die Systemsteuerung -> "Regions- und Sprachoptionen" und stell Deinen PC z.B. auf Englisch um. Und dann probiere den Codeschipsel noch mal aus.

Jens

Wolfgang Mix 22. Sep 2009 19:16

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Mein vorlaüfiges Zwischenergebnis sieht jatzt so aus:
Wie ich Euch kenne, ist der Code noch optimierbar ;-)
Zumindest funktioniert es so erst einmal.

Delphi-Quellcode:
//Wolfgang Mix - Delphi-PRAXiS
//Gültigkeitsbereich 1.1.0001 ... 31.12.9999
function IsDateOk(d,m,y:integer):boolean;
var ds,ms,ys,dates:string;
    d1:TDateTime;
begin
  result:=false;
  //Nullen davor, wenn <10
  str(d,ds);if d<10 then ds:='0'+ds;
  str(m,ms);if m<10 then ms:='0'+ms;
  str(y,ys);
  //Jahr immer 4-stellig
  while length(ys)<4 do ys:='0'+ys;
  dates:=ds+'.'+ms+'.'+ys;
  //Dank Nersgatt - DP
  if tryStrToDate(dates,d1) then result:=true;
end;


procedure TForm1.Button1Click(Sender: TObject);
Begin
  Edit1.Text:=BoolToStr(IsDateOk(25,13,1950));
end;
Gruß

Wolfgang

Wolfgang Mix 22. Sep 2009 19:19

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
@Nersgatt

Prima, nochmal danke :-)

Gruß

Wolfgang

Nersgatt 23. Sep 2009 06:23

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Wenn Du das Datum als String vorliegen hast, bietet sich TryStrToDate an. Dann würde ich nicht daraus einen Datumsstring zusammenbasteln und dann prüfen, sondern die Elemente einzeln prüfen. Das ist wie links blinken und rechts abbiegen :mrgreen: Mit Deiner Funktion bekommst Du bei einem Englischen Windows Probleme.

Ich würde die Elemente einzeln prüfen:

Delphi-Quellcode:
//Gültigkeitsbereich 1.1.0001 ... 31.12.9999
function IsDateOk(d,m,y:integer):boolean;
begin

  if (y < 1) or (y > 9999) then
    result := False
  else if (m < 1) or (m > 12) then
    result := false
  else if (d < 1) or (d > DaysInAMonth(y, m)) then
    result := false
  else
    result := True;

end;
(DateUtils muss für DaysInAMonth eingebunden werden)

Jens

Zoot 23. Sep 2009 07:12

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Verstehe auch nicht, was das wandeln in Strings soll.

Delphi-Quellcode:
function IsDateOk(d,m,y:Word):boolean;
begin
 Try
  EncodeDate(Y,M,D);
  Result := True;
 Except
  Result := False;
 End;
end;

alzaimar 23. Sep 2009 07:20

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Zitat:

Zitat von Zoot
Verstehe auch nicht, was das wandeln in Strings soll.

Da wird nix in Strings verwandelt, sondern in TDateTime. Und vor dem Konvertieren wird eine Gültigkeitsprüfung vorgenommen.

Ich würde eher hierzu tendieren, da spart man sich die Exceptions.
Delphi-Quellcode:
If TryEncodeDate(Year, Month, Day, TheDate) Then
  ShowMessage(Format('Das Datum %s ist korrekt',[DateToStr(TheDate)]));
Merke: Die Delphi-Utilities können ne ganze Menge. Man muss nicht mehr viel selbst basteln.

Wolfgang Mix 23. Sep 2009 08:11

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Danke für die Antworten ;-)
Das ist mit der Variante von alzaimar jetzt übrig geblieben:

Delphi-Quellcode:
function IsDateOk(d,m,y:word):boolean;
var mydate:TDateTime;
begin
    result:=false;
    mydate:=EncodeDate(y,m,d);
    If TryEncodeDate(y,m,d,myDate) Then result:=true
end;

procedure TForm4.Button1Click(Sender: TObject);
begin
  Edit1.Text:=BoolToStr(IsDateOk(32,12,1));
end;

end.
Gruß

Wolfgang

Nersgatt 23. Sep 2009 08:13

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Warum nicht einfach so:
Delphi-Quellcode:
function IsDateOk(d,m,y:word):boolean;
var mydate:TDateTime;
begin
    result := TryEncodeDate(y,m,d,myDate);
end;
:roll:

BackOrifice 23. Sep 2009 08:58

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Zitat:

Zitat von Wolfgang Mix
Danke für die Antworten ;-)
Das ist mit der Variante von alzaimar jetzt übrig geblieben:

Delphi-Quellcode:
function IsDateOk(d,m,y:word):boolean;
var mydate:TDateTime;
begin
    result:=false;
    mydate:=EncodeDate(y,m,d);
    If TryEncodeDate(y,m,d,myDate) Then result:=true
end;

procedure TForm4.Button1Click(Sender: TObject);
begin
  Edit1.Text:=BoolToStr(IsDateOk(32,12,1));
end;

end.
Gruß

Wolfgang

Öh, was macht dein "mydate:=EncodeDate(y,m,d);" an dieser Stelle? Wozu? :gruebel:

Wolfgang Mix 23. Sep 2009 11:14

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Meine OH gibt folgende Auskunft:

Zitat:

Mit TryStrToDate kann ein String mit einer Datumsangabe zerlegt werden. Enthält S kein gültiges Datum, gibt TryStrToDate false zurück.
d,m und y sind vom Typ Integer.

Gruß

Wolfgang

DeddyH 23. Sep 2009 12:21

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Aber mydate ist vom Typ TDateTime :zwinker:

Wolfgang Mix 23. Sep 2009 13:55

Re: Datum auf Fehler prüfen - Deutsches Datumsformat
 
Hast wieder 'mal Recht :-)

[OT] Opa Detlef muß immer das letzte Wort haben [/OT] ;-)

Gruß

Wolfgang


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 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