Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Prüfung ob Wochentag in der Zeit vorhanden (https://www.delphipraxis.net/162860-pruefung-ob-wochentag-der-zeit-vorhanden.html)

loirad 7. Sep 2011 19:20

Prüfung ob Wochentag in der Zeit vorhanden
 
Hallo liebe Delphi-PRAXIS'ler,

ich habe ein Problem wo ich einfach nicht hintersteige:

Code:
repeat
 incDay(Tag);
 if DayOfWeek(Tag)=6 then Tage.Items.Add(Datetostr(Tag));
until Tag=Now;
Das Problem ist, dass sich das Programm aufhängt und nichts tut :!:
Zur Erklärung:
Tag:TDateTime;
Tage: TCheckListBox;

Liebe Grüße
loirad

r2c2 7. Sep 2011 19:35

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Die Wahrscheinlichkeit, dass Tag=Now zutrifft, ist sehr gering. Dafür müsstest du exakt die richtige Millisekunde erwischen. ==> http://docwiki.embarcadero.com/VCL/d...tils.IsSameDay

mfg

Christian

stahli 7. Sep 2011 19:35

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Das Programm tut schon etwas. Es läuft immer weiter in der Schleife ;-)

Abgesehen davon, dass man nicht sieht, was Du "Tag" zuvor zugewiesen hast, solltest Du auf Tag >= Now prüfen.
TDateTime ist außerdem ein Realwert. Im ganzzahligen Teil ist der Tag und in den Nachkommastellen die Uhrzeit gespeichert.

Vielleicht ist es grundsätzlich sinnvoller, direkt mit TDate zu arbeiten.

loirad 7. Sep 2011 19:49

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Vielen Dank für die Tipps!!!
Leider funktioniert es immernoch nicht. Anbei der gesamte Quelltext:
Code:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Tage: TCheckListBox;
    Einlesen: TMemo;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TageClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Tage.Items.SaveToFile('Tage.txt');
Einlesen.Clear;
Einlesen.Lines.Add(Datetostr(Now));
Einlesen.Lines.SaveToFile('Tag.txt');
end;

procedure TForm1.TageClick(Sender: TObject);
begin
Tage.Items.Delete(Tage.ItemIndex);
end;



procedure TForm1.FormCreate(Sender: TObject);
var i:integer;Tag:TDate;
begin
Einlesen.Lines.LoadFromFile('Tag.txt');
Tage.Items.LoadFromFile('Tage.txt');
for i:=0 to Tage.Items.Count-1 do
 if Tage.Items.Strings[i]='' then Tage.Items.Delete(i);
Tag:=strtoDate(Einlesen.Lines[0]);
repeat
 incDay(Tag);
 if DayOfWeek(Tag)=6 then Tage.Items.Add(Datetostr(Tag));
until Tag>=Now;
end;


end.
Das einlesen ist eleganter zu lösen - ich weiß, aber es tut hier seinen Zweck :!:

stahli 7. Sep 2011 20:00

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Delphi-Quellcode:
for i:=0 to Tage.Items.Count-1 do
  if Tage.Items.Strings[i]='' then Tage.Items.Delete(i);
Die Schleife solltest Du rückwärts laufen lassen, da Du sonst 2 aufeinander folgende Leerzeilen nicht erkennst.

Ansonsten:
Was funktioniert denn nicht?
Setze mal einen Haltepunkt, debugge schrittweise und untersuche Deine Variablen. Das sollte helfen...

loirad 7. Sep 2011 20:05

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Hinweis gleich eingearbeitet!
Für Now bekomme ich beim debuggen nur:"Nicht verfügbarer Wert" und für Tag nur so eine komische Zahl (vermutlich integer Wert für das Datum)!
Sonst fällt mir nichts auf :pale:

stahli 7. Sep 2011 20:10

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Welches Delphi hast Du?
Kannst Du bei den Überwachten Ausdrücken "Funktionen zulassen"? Dann wird die Funktion ausgeführt und das Ergebnis im Debuger angetzeigt.
Ansonsten nutze eine lokale Variable, der Du "Now" zuweist. Die Variable lässt sich dann auf jeden Fall auslesen.

Bjoerk 7. Sep 2011 20:51

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Tag:= IncDay(Tag);

Darlo 8. Sep 2011 00:35

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Hi,

der Variablename "tag" ist ziemlich unglücklich da TComponent."tag" bereits vergeben ist. Ggf. löst das schon Dein Problem, ansonsten schau Dir folgendes mal an (schon auf Deinen Code modifiziert, die until-Anweisung hat hier nicht wirklich einen Sinn....):
Delphi-Quellcode:
var
  startDate, myIncDate: TDate;
  i: integer;
begin
//Finde das Datum des nächsten Sonntags
i := 1;
startDate := now;
repeat
  myIncDate := incDay(startDate,i);
  if DayOfWeek(myIncDate) = 7 then showmessage('Nächster Sonntag am: '+Datetostr(myIncDate+1));
  i := i+1;
 until (DayOfWeek(myIncDate)=DayOfWeek(Now));
Gruß Darlo

Darlo 8. Sep 2011 00:48

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Zitat:

Zitat von Bjoerk (Beitrag 1122500)
Tag:= IncDay(Tag);

Hab Deinen Post nicht richtig gelesen....
Hast ja bereits die Antwort gegeben gehabt.

loirad 8. Sep 2011 06:00

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Ich will alle Freitage ausgeben. Den Rest probiere ich heute Nachmittag aus.

loirad 8. Sep 2011 06:08

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Zitat:

Zitat von loirad (Beitrag 1122491)
incDay(Tag);

Das funktioniert nicht. Der Wert ändert sich nicht.

himitsu 8. Sep 2011 06:22

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Ein/zwei Beiträge weiter vorne steht die Lösung.

Außerdem steht sie auch in der OH > Delphi-Referenz durchsuchenIncDay

und wenn man sich die Signatur (Definition) der "Funktion" ansieht, bzw die Parameter, welche einem von der IDE/CodeInsigt aufgelistet werden, sollte einem auch sofort klar werden, daß hier
keine Prozedur mit einem Var-Parameter, sondern eine Funktion mir einem Const-Parameter + Result vorliegt.

Bjoerk 8. Sep 2011 11:00

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Gelegentlich hilft auch ein Blick in die Delphi Hilfe. :-D

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ADate: TDateTime;
  days: array [1..7] of string;
begin
  ADate:= StrToDate('1.1.2011');
  days[1]:= 'Sunday';
  days[2]:= 'Monday';
  days[3]:= 'Tuesday';
  days[4]:= 'Wednesday';
  days[5]:= 'Thursday';
  days[6]:= 'Friday';
  days[7]:= 'Saturday';
  while CompareDate (Adate, Now) <= 0  do
  // oder while not IsSameDay (Adate, IncDay(Now)) do
  // oder while not IsToday (IncDay(ADate, -1)) do
  begin
    // ListBox1.Items.Add(DateToStr(ADate) + ' is a ' + days[DayOfWeek(ADate)]);
    if DayOfWeek(ADate) = 6 then
      ListBox1.Items.Add(DateToStr(ADate) + ' ist ein Freitag');
    ADate:= IncDay(ADate);
  end;
end;

DeddyH 8. Sep 2011 11:06

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Jo:
Zitat:

Anmerkung: DayOfWeek ist nicht mit dem ISO 8601-Standard konform, in dem Montag als der erste Tag der Woche definiert wird. Die Funktion DayOfTheWeek stimmt mit dem ISO 8601-Standard überein.
:mrgreen:

mkinzler 8. Sep 2011 11:09

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Sehr interessant, Wer sich an Regeln hält, verhält sich nicht Regelkonform :stupid:

Bjoerk 8. Sep 2011 11:25

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Jo, g g geil. Scheint wohl eine falsche Verbesserung der Hilfe zu sein, wo in SysUtils und DateUtils noch unterschiedliche Zählungen waren.

r2c2 8. Sep 2011 11:44

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Das "The" habt ihr entdeckt?

mfg

Christian

Bjoerk 8. Sep 2011 12:02

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Stimmt Christian, wer lesen kann ist klar im Vorteil.:thumb:

DateUtils.DayOfTheWeek vs. SysUtils.DayOfWeek

Thanx.

DeddyH 8. Sep 2011 12:10

AW: Prüfung ob Wochentag in der Zeit vorhanden
 
Ich hätte es vielleicht entsprechend markieren sollen :roll:
Also nochmal:
DayOfWeek -> Sonntag = 1, Samstag = 7
DayOfTheWeek -> Montag = 1, Sonntag = 7

Da die letztere Variante ISO-konform ist, sollte man sie bevorzugt verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:48 Uhr.

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