Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi datetimepicker wochentag? (https://www.delphipraxis.net/83303-datetimepicker-wochentag.html)

tom_po 30. Dez 2006 19:43


datetimepicker wochentag?
 
Ist beim Datetimepicker der Wochentag hinterlegt? Ich habe eine SQL-Abftrage, die ueber einen Timer gesteuert ist und moechte den Datetimepicker automatisch immer auf den naechsten Montag weiterschalten, wenn die Form aufgerufen wird.
Also z.B. bei Samstag, 30.12.06 auf Montag, 01.01.07 weiterschalten, so was wie datetimepicker1.date+2 als Ergebnis, aber wie komme ich auf die 2 automatisch?

TwoFace 30. Dez 2006 20:31

Re: datetimepicker wochentag?
 
Servus

So etwa?

Delphi-Quellcode:
var
tage : array [1..7] of String = ('Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag');

begin
  edit1.text := tage[dayofweek(DateTimePicker1.datetime)];
end;

Greetz

raiguen 31. Dez 2006 01:11

Re: datetimepicker wochentag?
 
Moin :-)
Vielleicht eher so?:
Delphi-Quellcode:
...
case DayOfWeek(DateTimePicker1.Date) of
  1: DateTimePicker1.Date := DateTimePicker1.Date +1; //Sonntag
  7: DateTimePicker1.Date := DateTimePicker1.Date +2; //Samstag
end;
...

TwoFace 31. Dez 2006 08:31

Re: datetimepicker wochentag?
 
Grüß Gott

dann eher so:

Delphi-Quellcode:
..
while dayofweek(Datetimepicker1.Date) <> 2 do
  Datetimepicker1.Date := datetimepicker1.Date + 1;
..
Greetz

tom_po 31. Dez 2006 11:36

Re: datetimepicker wochentag?
 
zunächst mal vielen Dank für Eure Vorschläge, aber welcher ist nun der Beste?
hatte noch vergessen, dass es vor allem für Windows in englisch (Sprach-und Ländereinstellungen) gehen muss, d.h. bei Vorschlag 1 müssten die Variablen dann Sunday, monday usw. sein? Wäre dann aber auf Windows-englisch beschränkt oder?

Was bedeutet beim 2. Vorschlag (case of) die Zahl 1: und dann 7: ?
Wieso 7: in der 2. Zeile, wieso nicht 2: ?
wäre der Code für die komplette Woche so?

Delphi-Quellcode:
case DayOfWeek(DateTimePicker1.Date) of
  1: DateTimePicker1.Date := DateTimePicker1.Date +1; //Sonntag
  2: DateTimePicker1.Date := DateTimePicker1.Date +2; //Samstag
  3: DateTimePicker1.Date := DateTimePicker1.Date +3; //Freitag
  4: DateTimePicker1.Date := DateTimePicker1.Date +4; //Donnerstag
  5: DateTimePicker1.Date := DateTimePicker1.Date +5; //Mittwoch
  6: DateTimePicker1.Date := DateTimePicker1.Date +6; //Dienstag
end;
Bei der while-Version, wieso <> 2?
wie wäre der Code für die ganze Woche?

tom_po 31. Dez 2006 11:51

Re: datetimepicker wochentag?
 
Ich habe den case-Vorschlag mal probiert, es hat funktioniert mit dem heutigen Tag (Sonntag), habe dann aber das Datum meines PC's auf morgen gestellt, dann zeigte mit der Datetimepicker den 3.1. an, warum?

der Code sieht jetzt so aus:

Delphi-Quellcode:
datetimepicker1.Date := now;
case DayOfWeek(DateTimePicker1.Date) of
  1: DateTimePicker1.Date := DateTimePicker1.Date +1; //Sonntag
  2: DateTimePicker1.Date := DateTimePicker1.Date +2; //Samstag
  3: DateTimePicker1.Date := DateTimePicker1.Date +3; //Freitag
  4: DateTimePicker1.Date := DateTimePicker1.Date +4; //Donnerstag
  5: DateTimePicker1.Date := DateTimePicker1.Date +5; //Mittwoch
  6: DateTimePicker1.Date := DateTimePicker1.Date +6; //Dienstag
  7: DateTimePicker1.Date := DateTimePicker1.Date; //Montag
end;

tom_po 31. Dez 2006 11:59

Re: datetimepicker wochentag?
 
mein Gott, ich bin jetzt wirklich buff...
Greetz, dein einfacher Code (while dayofweek...) geht immer, habe alle Tage getestet, wunderbar, danke.

Weiss aber ehrlich nicht gesagt, warum dieser so einfach Code das macht....

Greets, noch ne weitere Frage:
ich habe ja mein Windows auf Deutsch konfiguriert, geht dies auch, wenn es auf chinesisch eingestellt ist? ich mache die Software für eine chindesische Firma...

TwoFace 31. Dez 2006 12:03

Re: datetimepicker wochentag?
 
Servus

die Wochtage sind meines Wissens nach nicht irgendwo gespeichert, d.h. du mußt sie irgendwie vorgeben. (siehe Beispiel im #2 Beitrag, dementsprechend Monday, Tuesday, usw...)

Zu
Delphi-Quellcode:
case ... of
, funktioniert genauso, ruhig dem Prozessor das rechnen überlassen :-)

Dein Fehler im case Beispiel:
Zitat:

...habe dann aber das Datum meines PC's auf morgen gestellt, dann zeigte mit der Datetimepicker den 3.1. an, warum?
Morgen (01.01.2007) ist Montag, also Dayofweek 2. Wenn Dayofweek 2 ist, zählt deine case Anweisung noch zwei Tage dazu, also der 03.01.2007.

Die richtige case-Anweisung müßte so lauten:
Delphi-Quellcode:
 datetimepicker1.Date := now;
case DayOfWeek(DateTimePicker1.Date) of
  1: DateTimePicker1.Date := DateTimePicker1.Date +1; //Sonntag
  2: DateTimePicker1.Date := DateTimePicker1.Date ; //Montag
  3: DateTimePicker1.Date := DateTimePicker1.Date +6; //Dienstag
  4: DateTimePicker1.Date := DateTimePicker1.Date +5; //Mittwoch
  5: DateTimePicker1.Date := DateTimePicker1.Date +4; //Donnerstag
  6: DateTimePicker1.Date := DateTimePicker1.Date +3; //Freitag
  7: DateTimePicker1.Date := DateTimePicker1.Date +2; //Samstag
end;
Zitat:

Bei der while-Version, wieso <> 2? wie wäre der Code für die ganze Woche?
heißt: Solange der Wochentag im Datetimepicker nicht Montag (dayofweek=2) ist, zähle einen Tag dazu. Der Code für die ganze Woche ist:
Delphi-Quellcode:
while dayofweek(Datetimepicker1.Date) <> 2 do
  Datetimepicker1.Date := datetimepicker1.Date + 1;
Guten Rutsch

[Edit] Mein Gott bin ich langsam, 2 Antworten, während ich eine geschrieben hab. Naja egal, die Erklärung warum die while Schleife immer funktioniert steht ja da ;-) Und die richtige case Anweisung auch :-)[/Edit]

tom_po 31. Dez 2006 12:10

Re: datetimepicker wochentag?
 
danke, TwoFace, eigentlich einleuchtend dein Erklärung.
ich denke, der while Code ist der Richtige für mich, ist doch unabhängig von der eingestellten Sprache in der Windows-Konfig, oder?

aber ganz klar ist mir es doch nicht, du sagst (bei while..)
"Solange der Wochentag im Datetimepicker nicht Montag (dayofweek=2) ist, zähle einen Tag dazu."
wenn es Dienstag (z.B. 2.1.07) ist, wie weiss das System dann, dass es 6 Tage hinzuzählen muss und nicht nur 1 Tag, wie du sagst???

auch dir guten Rutsch...danke!

Ratte 31. Dez 2006 12:14

Re: datetimepicker wochentag?
 
Es ist doch eine Schleife, d.h. der Code heißt:"Solange Wochentag <> Montag addiere 1" D.h. er addiert sooft 1 bis er den Montag erreicht hat.

marabu 31. Dez 2006 12:26

Re: datetimepicker wochentag?
 
Hallo Tom,

lege dir eine Unit DateUtilsEx an und packe deine Kalenderfunktionen dort rein:

Delphi-Quellcode:
function IsNationalHoliday(dt: TDateTime): Boolean;
begin
  Result := DayOfTheYear(dt) = 1;
end;

function IsWorkDay(dt: TDateTime): Boolean;
begin
  Result := (DayOfWeek(dt) in [2..6])
      and not IsNationalHoliday(dt);
end;

function NextWorkDay(dt: TDateTime): TDateTime;
begin
  Result := Trunc(dt);
  repeat
    Result := Result + 1;
  until IsWorkDay(Result);
end;

function NextWeekDay(dt: TDateTime): TDateTime;
var
  wd: Integer;
begin
  wd := DayOfWeek(dt);
  Result := Trunc(dt) + Succ(Ord(wd > 5) + Ord(wd = 6));
end;

function NextMonday(dt: TDateTime): TDateTime;
begin
  Result := dt + (7 - Pred(DayOfTheWeek(dt))) mod 7;
end;
Wenn du IsNationalHoliday() geschickt erweiterst, dann hast du eine lokalisierbare Allgemeinlösung. Die lokalisierten Wochentagsnamen findest du in der Unit SysUtils (ShortDayNames bzw. LongDayNames).

Guten Rutsch

tom_po 31. Dez 2006 13:20

Re: datetimepicker wochentag?
 
danke marabu, das ist natürlich das Ideale. Muss dies aber in Ruhe angehen, dann habe ich natürlich ein flexbiles System wo man die Wochenende und Urlaubstage miteinbeziehen kann.

Momentan genügt die einfach Schlaufenversion mit while, die Chinesen arbeiten ja jeden Tag (einschl. Sonntag), haben auch kaum Feren, so dass jeder Tag ein Arbeitstag ist.
Ich benutze ja den Datetimepicker für ein tägliches Update mit Timer und will halt ein Query immer für den nächsten Montag beginnend machen, und so mit der while-Schleife funktioniert es fürs Erste prima.
Werde aber in Ruhe deinen Vorschlag mit der Kalenderfunktion angehen.

auch dir guten Rutsch von Portugal aus...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 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 by Thomas Breitkreuz