Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Datum-Countdown (https://www.delphipraxis.net/175044-datum-countdown.html)

Beginner2013 27. Mai 2013 10:36

Datum-Countdown
 
Hallo Leute,

ich habe vor mir einen Countdown zu programmieren. Leider komme ich damit nicht ganz zurecht.
Ich möchte ein Datum (dd.mm.yy) aus einem Edit einlesen und dann in einem Label anzeigen wieviele Tage es bis dahin noch sind anzeigen.

Kann mir bitte jemand helfen? Das untenstehende klappt leider nicht.

Delphi-Quellcode:
var
Test : TDate;

begin
Test := strtodate(Edit10.Text) -  date();
Form13.Label5.Caption := DatetoStr(Test);
end;
...

baumina 27. Mai 2013 10:39

AW: Datum-Countdown
 
Die Variable Test nicht als TDate sondern als Integer deklarieren, müsste schon reichen.

DeddyH 27. Mai 2013 10:47

AW: Datum-Countdown
 
DaysBetween

baumina 27. Mai 2013 10:56

AW: Datum-Countdown
 
Zitat:

Zitat von DeddyH (Beitrag 1216523)

Da keine Uhrzeit mit im Datum ist, eher unnötig?

Beginner2013 27. Mai 2013 10:58

AW: Datum-Countdown
 
Vielen Dank, in welchem Format müssen die Parameter an die Funktion "DaysBeteen" übergeben werden? Also wie muss ich hierbei das datum in Edit10 schreiben?

Der Versuch mit der Änderung des Datentypes zu Int klappt leider nicht.

baumina 27. Mai 2013 11:00

AW: Datum-Countdown
 
Hast das auch abgeändert?
Delphi-Quellcode:
Form13.Label5.Caption := IntToStr(Test);

Beginner2013 27. Mai 2013 11:04

AW: Datum-Countdown
 
Delphi-Quellcode:
procedure TForm1.Termincountdown1Click(Sender: TObject);
var
Test : Integer;
begin
Form13.Show;
Form13.Caption := 'Termincountdown';
Test :=   (Edit10.Text) -  date();
Form13.Label5.Caption := InttoStr(Test);
end;
geht leider nicht.

DeddyH 27. Mai 2013 11:07

AW: Datum-Countdown
 
Versuch es mit trunc().
Delphi-Quellcode:
Test := trunc(StrToDate(Edit10.Text) - date);

Beginner2013 27. Mai 2013 11:09

AW: Datum-Countdown
 
Das wird akzeptiert.
was macht trunc()?
Wenn ich nun aber "09.04.1982" in Edit10 eingebe, kommt die Meldung "09.04.1982 is not a valid date". Und Label5 blieibt unverändert.

DeddyH 27. Mai 2013 11:12

AW: Datum-Countdown
 
Trunc() schneidet die Nachkommastellen einfach ab. Und den Fehler kann ich nicht nachvollziehen, bei mir wird das Datum akzeptiert. Vielleicht solltest Du auf ein MaskEdit oder einen DateTimePicker ausweichen, um Schreibfehler bestmöglich auszuschließen?

Beginner2013 27. Mai 2013 11:21

AW: Datum-Countdown
 
Delphi-Quellcode:
procedure TForm1.Termincountdown1Click(Sender: TObject);
var
Test : Integer;
begin
Form13.Show;
Form13.Caption := 'Termincountdown';
Test := trunc(StrToDate(Edit10.Text) - date);
Form13.Label5.Caption := InttoStr(Test);
end;
So habe ich es jetzt. Fehler werden keine angezeigt. Wenn Ich aber das Programm ausführe, Kommt immernoch die Fehlermeldung, dass es kein gültiges Datum sei. Habe schon verschiedene Eingabeformate versucht. Leider immer das gleiche :(

hhcm 27. Mai 2013 11:32

AW: Datum-Countdown
 
Bist du dir sicher das du dein Datum in Edit10 schreibst?
Die Procedure funktioniert so wie sie da steht.

Perlsau 27. Mai 2013 11:33

AW: Datum-Countdown
 
Kommt drauf an, was du eingibst. Kommt der Fehler auch, wenn du z.B. '31.05.2013' eingibst?
Wieso nimmst du nicht einfach einen TDateTimePicker? In dessen OnChance-Ereignis schreibst du dann deinen Code für die Änderung des Label-Captions.
Noch etwas: Mit der Zeit, wenn deine Programme komplexer werden, blickst du nicht mehr durch, wenn du nicht aussagekräftige Variablenbezeichner verwendest: Nicht Edit10, sondern z.B. Edit_DatumEingabe ...

Beginner2013 27. Mai 2013 11:43

AW: Datum-Countdown
 
Auch dann kommt die Fehlermeldung...hmm....
Danke für die Tipps. Ich arbeite noch nicht lange mit Delphi und bin gerade dabei mir alles selbst beizubringen.
Habe mit einem "TDateTimePicker" noch nie gearbeitet. Gibt es hierbei was besonderes zu beachten?

Beginner2013 27. Mai 2013 11:45

AW: Datum-Countdown
 
Hat es evtl. damit zu tun, dass Edit10 auf einer anderen Form ist als Label5?

hhcm 27. Mai 2013 11:46

AW: Datum-Countdown
 
Ich habe immer noch die Befürchtung das du in das falsche Feld schreibst ;)
Schreib doch hinter dein begin mal
Delphi-Quellcode:
showmessage(Edit10.Text);
Oder setz dir einen Breakpoint.

Perlsau 27. Mai 2013 11:48

AW: Datum-Countdown
 
Zitat:

Zitat von Beginner2013 (Beitrag 1216541)
Habe mit einem "TDateTimePicker" noch nie gearbeitet. Gibt es hierbei was besonderes zu beachten?

Einfach ausprobieren: TDateTimePicker

Beginner2013 27. Mai 2013 11:55

AW: Datum-Countdown
 
Also Edit10 passt :).
Die Fehlermeldung bezieht sich ja auch immer auf das Datum welches ich in Edit10 eingegeben hab.

hhcm 27. Mai 2013 12:00

AW: Datum-Countdown
 
Also wenn ein Showmessage(Edit10.Text) z.B 26.05.2013 ausgibt, dann funktioniert auch die Procedure. Bei mir kommt dann -1 in einem Label.

baumina 27. Mai 2013 12:00

AW: Datum-Countdown
 
Zitat:

Zitat von hhcm (Beitrag 1216544)
Ich habe immer noch die Befürchtung das du in das falsche Feld schreibst ;)
Schreib doch hinter dein begin mal
Delphi-Quellcode:
showmessage(Edit10.Text);
Oder setz dir einen Breakpoint.

Ja, mach mal das showmessage und zudem noch eins mit
Delphi-Quellcode:
showmessage(datoToStr(date));
damit du sehen kannst was für ein Datumsformat auf deinem Rechner erwartet wird.

Beginner2013 27. Mai 2013 12:03

AW: Datum-Countdown
 
Delphi-Quellcode:
showmessage(dateToStr(date));
showmessage(Form1.edit10.Text);
Werden richtig angezeigt

baumina 27. Mai 2013 12:06

AW: Datum-Countdown
 
Irgendwie hängen wir nun fest. Kannst du mal den vollständigen Code von beiden Formularen posten? Du schreibst beim showmessage Form1.Edit10.Text, bei der Typumwandlung aber nur Edit10.Text ... hast du Edit10 auf verschiedenen Formularen?

Beginner2013 27. Mai 2013 12:19

AW: Datum-Countdown
 
Aktuell habe ich das hier in Form1:

Delphi-Quellcode:
procedure TForm1.Termincountdown1Click(Sender: TObject);
var
Test : Integer;
begin
Form13.Show;
Form13.Caption := 'Termincountdown';
showmessage(dateToStr(date));
showmessage(edit10.Text);
Test := trunc(StrToDate(Edit10.Text) - date);
Form13.Label5.Caption := InttoStr(Test);
end;
Auf Form1 habe ich ein Edit (Edit10) hier möchte ich ein Datum eintragen.
Auf Form13 habe ich ein Label (Label5) mit diesem möchte ich anzeigen wie viele Tage es noch bis zu dem Datum sind welches in Form1 in Edit10 eingegeben wurde.

Delphi-Quellcode:
showmessage(dateToStr(date));
showmessage(edit10.Text);
...zeigen beide das richtige an. Die Erste Message: 27/May/13 und die zweite 28/May/13 (wenn eingeben.

Form13:
Delphi-Quellcode:

unit Unit13;

interface

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

type
  TForm13 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form13: TForm13;

implementation

{$R *.dfm}

end.

Beginner2013 27. Mai 2013 12:42

AW: Datum-Countdown
 
Kann man evtl. das Datumformat anpassen? Vllt. gibt es Probleme wegen den "/" bei 27/May/13?

baumina 27. Mai 2013 12:47

AW: Datum-Countdown
 
Ja also dieses Datumsformat hatte ich jetzt auch noch nicht in den Fingern :?
Dein Windows ist wohl auf dieses Format gestellt. Mit FormatSettings.ShortDateFormat kannst Du es ändern.

Perlsau 27. Mai 2013 13:12

AW: Datum-Countdown
 
Zitat:

Zitat von baumina (Beitrag 1216552)
Irgendwie hängen wir nun fest. Kannst du mal den vollständigen Code von beiden Formularen posten? Du schreibst beim showmessage Form1.Edit10.Text, bei der Typumwandlung aber nur Edit10.Text ... hast du Edit10 auf verschiedenen Formularen?

Ich riet ihm ja bereits, aussagekräftige Variablenbezeichner zu verwenden, aber das will er nicht wissen ... :dancer:

Beginner2013 28. Mai 2013 06:23

AW: Datum-Countdown
 
Die Benennungen werde ich noch ändern :), möchte erstmal, dass es überhaupt läuft.

Mein aktueller Stand ist der, dass das Daten in showMessage(...) richtig angezeigt werden (Bsp. 30.05.13). Eine Ausgabe findet statt, nach Drücken des "OK"-Button der zweiten Message erscheint dann die Fehlermeldung "30.05.13 is not a valid date".
Daher muss es doch iwie an der Zeile liegen in der ich die Differenz berechne (Bildung von "Test"), oder?

Delphi-Quellcode:
procedure TForm1.Termincountdown1Click(Sender: TObject);
var
Test : Integer;
FormatSettings: TFormatSettings;
begin
Form13.Show;
Form13.Caption := 'Termincountdown';
//FormatSettings.ShortDateFormat := 'dd.mm.yy';
showmessage(FormatDateTime('dd.mm.yy', date));
showmessage(edit10.Text);
Test := trunc(StrToDate(Edit10.Text) - strtodate(FormatDateTime('dd.mm.yy', date)));
showmessage(inttostr(Test));
Form13.Label5.Caption := InttoStr(Test);
end;

Furtbichler 28. Mai 2013 06:37

AW: Datum-Countdown
 
Wenn Du Edit10.Text in ein Datum umwandeln willst, das im Format 'dd.mm.yy' eingegeben ist, aber dein Windows -aus welchen Gründen auch immer- das Format 'dd/MMM/yy' verwendet, dann würde ich 'Edit10.Text' auch mit dem entsprechenden Formatbezeichner umwandeln und nicht ohne, wie Du das gemacht hast.

Weiterhin würde ich dir empfehlen, bei Problemen wie diesem, keine Mehrfachoperationen in einer Zeile auszuführen. Dann verstehst Du den Code besser und siehst sofort, wo der Fehler ist.
Delphi-Quellcode:
procedure TForm1.Termincountdown1Click(Sender: TObject);
var
  Eingabedatum : TDateTime;
  AnzahlDerTage : Integer;
 
begin
  Form13.Show;
  Form13.Caption := 'Termincountdown'; // Das könntest Du im Designer einstellen.
  Eingabedatum := StrToDate(Edit10.Text); // Welches Datumsformat wird hier für die Umwandlung verwendet?
  AnzahlDerTage := trunc(Eingabedatum - Date);
  Form13.Label5.Caption := InttoStr(AnzahlDerTage);
end;
Aber bisher: :thumb: Gut gemacht. Programmieren lernen tut weh und man rennt am Anfang ständig gegen die Wand, aber es lohnt sich.

baumina 28. Mai 2013 06:41

AW: Datum-Countdown
 
Zitat:

Zitat von Beginner2013 (Beitrag 1216560)
...zeigen beide das richtige an. Die Erste Message: 27/May/13 und die zweite 28/May/13 (wenn eingeben.

Also das Windows-Datumsformat (entspricht auch dem FormatSettings.ShortDateFormat) entspricht dem o.g. Format.

Da du FormatSettings.ShortDateFormat auskommentiert hast, ist das Datumsformat immer noch das o.g.

Ein FormatDateTime gibt dir das Datum ein einem gewünschten Format als String aus, ändert aber kein ShortDateFormat.

Ein StrToDate erwartet immer einen String mit dem Format FormatSettings.ShortDateTimeFormat.

Deswegen müsste es eher so gehen:

Delphi-Quellcode:
uses SysUtils;

procedure TForm1.Termincountdown1Click(Sender: TObject);
var
  Test : Integer;

begin
  Form13.Show;
  Form13.Caption := 'Termincountdown';
  FormatSettings.ShortDateFormat := 'dd.mm.yy';
  showmessage(DateToStr(date));
  showmessage(edit10.Text);
  Test := trunc(StrToDate(Edit10.Text) - date);
  Form13.Label5.Caption := InttoStr(Test);
end;

Beginner2013 28. Mai 2013 06:45

AW: Datum-Countdown
 
Es funktioniert:) Vielen Dank an Alle


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