Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Abfangen von ner Datumseingabe (https://www.delphipraxis.net/46950-problem-mit-abfangen-von-ner-datumseingabe.html)

The_Tremendous 3. Jun 2005 14:09


Problem mit Abfangen von ner Datumseingabe
 
Hi habe aktuelles Problem:

Ich möchte 3 Arten Datum einlesen lassen können:
- 1.1.2005
- 2005-01-01
- 1. Januar 2005


Das Erste ist mit der Funktion StrToDate kein Problem. Aber die anderen werden von der Funktion nicht akzeptiert. Wie kann ich das Problem lösen??


Delphi-Quellcode:
procedure TfrmDatum.BitBtn1Click(Sender: TObject);
begin
  try
   EinleseDatum := editDatumEingabe.Text;
   Datum:=StrToDate(EinleseDatum);
   // wenns nicht zu except springt, ist alles in ordnung
   lbltest.Caption := DateToStr(Datum);
  except
   // der string war keine gültige Datumseingabe
   editDatumEingabe.Text := '';
   ShowMessage('Der Eingegebene Wert ist kein Zulässiges Datum! Bitte geben Sie ein gültiges Datum ein');
  end;          
end;
Gruß The_Tremendous

XHelp 3. Jun 2005 14:35

Re: Problem mit Abfangen von ner Datumseingabe
 
Ich weiss nicht, ob man das wie bei php mit 1. Januar 2005 machen kann...
vielleicht hilft dir ein parser:
Du guckst, was in EinleseDatum ist:
wenn in EinleseDatum zwei punkte sind, dann ist es 1.1.2005 und du kannst ganz normal StrToDate machen,
wenn zwei '-' da sind, dann ist es 2005-01-01, du kannst dann einzelne zahlen rauslesen und in 1.1.2005 umwandeln,
wenn in EinleseDatum leerzeichen (oder 1 punkt und buchstaben) ist, dann kannst du es auch manuel in 1.1.2005 umwandeln...

The_Tremendous 3. Jun 2005 14:50

Re: Problem mit Abfangen von ner Datumseingabe
 
Das wäre auch eine Idee. Ich habe leider nur keine Ahnung, wie ich nen String nach 2 Minuszeichen durchsuchen kann. Bin halt noch ein Anfänger!!

Wäre gut wenn ich da noch Hilfe bekommen könnte.

Gruß. The Tremendous :?:

XHelp 3. Jun 2005 15:15

Re: Problem mit Abfangen von ner Datumseingabe
 
da ist dein beispiel:

Delphi-Quellcode:
function TForm1.pars(s:string):TDate;
var
  i,i2:integer;
  s1,s2:string;
begin
if (pos('.',s)>0) and (pos(' ',s)<=0) then begin
  //wenn es 01.01.2005 ist
  result:=StrToDate(s);
end;
if (pos('-',s)>0) then begin
  //wenn es 2005-01-01 ist
  i:=pos('-',s);
  s1:=copy(s,1,i-1);
  Delete(s,1,i);
  i:=pos('-',s);
  s2:=copy(s,1,i-1);
  Delete(s,1,i);
  result:=StrToDate(s + '.' + s2 + '.' + s1);
end;
if (pos('.',s)>0) and (pos(' ',s)>0) then begin
  //wenn es 1. Januar 2005 ist
  i:=pos(' ',s);
  s1:=Copy(s,1,i-2);
  Delete(s,1,i);
  i:=pos(' ',s);
  s2:=Copy(s,1,i-1);
  Delete(s,1,i);
  if LowerCase(s2)='januar' then s2:='1';
  if LowerCase(s2)='ferbuar' then s2:='2';
  //...
  if LowerCase(s2)='dezember' then s2:='12';
  result:=StrToDate(s1 + '.' + s2 + '.' + s);
end;

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:=DateToStr(pars(Edit1.Text));
end;
Die funktion klappt nur, wenn man das datum genau so eingibt, wie du es beschrieben hast...

The_Tremendous 3. Jun 2005 16:04

Re: Problem mit Abfangen von ner Datumseingabe
 
Also das System ist Klar, allerdings ist da wohl irgendwo noch ein kleiner Fehler drinne. Beim Ablauf wird die funktion zwar aufgerufen, aber die if-anweisungen gekonnt übersprungen.

Ich weis net ob es jetzt ein Fehler von mir ist, oder ob er in deinem Quelltext liegt.?


Delphi-Quellcode:
unit UDatumsberechnung;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;

type
  TfrmDatum = class(TForm)
    editDatumEingabe: TEdit;
    comboDatumAuswahl: TComboBox;
    RadioGroup1: TRadioGroup;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    lbltest: TLabel;
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
    function CheckString(EinleseDatum:string):TDate;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  frmDatum: TfrmDatum;

implementation

{$R *.dfm}

var EinleseDatum, test: string;
    Datum : TDateTime;

procedure TfrmDatum.BitBtn1Click(Sender: TObject);
begin
  try
   // wenns nicht zu except springt, ist alles in ordnung
   CheckString(EditDatumEingabe.Text);

   lbltest.Caption := DateToStr(Datum);
  except
   // der string war keine gültige Datumseingabe
   editDatumEingabe.Text := '';
   ShowMessage('Der Eingegebene Wert ist kein Zulässiges Datum! Bitte geben Sie ein gültiges Datum ein');
  end;
   
end;

function TFrmDatum.CheckString(EinleseDatum:string):TDate;
var
  i,i2:integer;
  s1,s2:string;
begin
if (pos('.',EinleseDatum)>0) and (pos(' ',EinleseDatum)<=0) then begin
  //wenn es 01.01.2005 ist
  result:=StrToDate(EinleseDatum);
end;
if (pos('-',EinleseDatum)>0) and (pos('-',EinleseDatum)<=2) then begin
  //wenn es 2005-01-01 ist
  i:=pos('-',EinleseDatum);
  s1:=copy(EinleseDatum,1,i-1);
  Delete(EinleseDatum,1,i);
  i:=pos('-',EinleseDatum);
  s2:=copy(EinleseDatum,1,i-1);
  Delete(EinleseDatum,1,i);
  result:=StrToDate(EinleseDatum + '.' + s2 + '.' + s1);
end;
if (pos('.',EinleseDatum)>0) and (pos(' ',EinleseDatum)>0) then begin
  //wenn es 1. Januar 2005 ist
  i:=pos(' ',EinleseDatum);
  s1:=Copy(EinleseDatum,1,i-2);
  Delete(EinleseDatum,1,i);
  i:=pos(' ',EinleseDatum);
  s2:=Copy(EinleseDatum,1,i-1);
  Delete(EinleseDatum,1,i);
  if LowerCase(s2)='januar' then s2:='1';
  if LowerCase(s2)='februar' then s2:='2';
  //...
  if LowerCase(s2)='dezember' then s2:='12';
  result:=StrToDate(s1 + '.' + s2 + '.' + EinleseDatum);
end;

end;

end.

XHelp 3. Jun 2005 16:20

Re: Problem mit Abfangen von ner Datumseingabe
 
welche if abfrage meinst du denn?

The_Tremendous 4. Jun 2005 04:53

Re: Problem mit Abfangen von ner Datumseingabe
 
Jede der If-Abfrage die sich jeweils auf die Datumabfrage (also die drei If-Anweisungen) in der Funktion CheckString wird zwar gelesen, dann aber übersprungen. Also er liest jeweils die Bedingung und springt beim nächsten Schritt gleich zur Bedingung der nächsten If-Abfrage.

Khabarakh 4. Jun 2005 08:48

Re: Problem mit Abfangen von ner Datumseingabe
 
Das kommt mir bekannt vor :roll: :
http://www.delphipraxis.net/internal...ct.php?t=55241

Urmel 4. Jun 2005 08:54

Re: Problem mit Abfangen von ner Datumseingabe
 
Hallo,

ich würde auf keinen Fall versuchen das Datum mit StrToDate zu konvertieren. In den Beispielen oben wird immer davon ausgegangen das das Datumsformat des OS auf "dd.mm.yyyy" eingestellt ist.
Bei mir ist dies z.B. yyyy-mm-dd und damit würde die Funktion nicht gehen. Zerlege lieber wie gezeigt den String und erzeuge dann mit Delphi-Referenz durchsuchenEncodeDate() ein TDatetime.

XHelp 4. Jun 2005 09:47

Re: Problem mit Abfangen von ner Datumseingabe
 
Ich habe die Function getestet, bei mir war alles OK... ich habe gerade etwas gesehen:
CheckString ist ja ne function:

Delphi-Quellcode:
   // wenns nicht zu except springt, ist alles in ordnung
   CheckString(EditDatumEingabe.Text);

   lbltest.Caption := DateToStr(Datum);
Bei dir wird Datum gar nicht geschrieben und nicht die if abfrage übersprungen. Versuche mal das hier:

Delphi-Quellcode:
   // wenns nicht zu except springt, ist alles in ordnung
   Datum:=CheckString(EditDatumEingabe.Text);

   lbltest.Caption := DateToStr(Datum);


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz