![]() |
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:
Gruß The_Tremendous
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; |
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... |
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 :?: |
Re: Problem mit Abfangen von ner Datumseingabe
da ist dein beispiel:
Delphi-Quellcode:
Die funktion klappt nur, wenn man das datum genau so eingibt, wie du es beschrieben hast...
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; |
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. |
Re: Problem mit Abfangen von ner Datumseingabe
welche if abfrage meinst du denn?
|
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.
|
Re: Problem mit Abfangen von ner Datumseingabe
|
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 ![]() |
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:
Bei dir wird Datum gar nicht geschrieben und nicht die if abfrage übersprungen. Versuche mal das hier:
// wenns nicht zu except springt, ist alles in ordnung
CheckString(EditDatumEingabe.Text); lbltest.Caption := DateToStr(Datum);
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 11:20 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