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 TDateTimePicker: selektierten Bereich ermitteln/setzen (https://www.delphipraxis.net/200855-tdatetimepicker-selektierten-bereich-ermitteln-setzen.html)

Daniel L. 1. Jun 2019 11:30

TDateTimePicker: selektierten Bereich ermitteln/setzen
 
Hallo Forum!

Im TDateTimePicker können Bereiche des Datums bzw. der Zeit einzeln selektiert werden.

Beispiel:
Delphi-Quellcode:
dateTimePicker1.format := 'dd.mm.yyyy';
Es kann nun der Tag, der Monat oder das Jahr einzeln selektiert werden.


Für eine geplante erweiterte Nutzung des TDateTimePickers stellen sich mir folgende Fragen:
  1. Wie könnte man per Code den selektierten Bereich ermittlen?
  2. Wie könnte man per Code einen Bereich selektieren?

Daniel

peterbelow 1. Jun 2019 13:38

AW: TDateTimePicker: selektierten Bereich ermitteln/setzen
 
Zitat:

Zitat von Daniel L. (Beitrag 1433630)
Hallo Forum!

Im TDateTimePicker können Bereiche des Datums bzw. der Zeit einzeln selektiert werden.

Beispiel:
Delphi-Quellcode:
dateTimePicker1.format := 'dd.mm.yyyy';
Es kann nun der Tag, der Monat oder das Jahr einzeln selektiert werden.


Für eine geplante erweiterte Nutzung des TDateTimePickers stellen sich mir folgende Fragen:
  1. Wie könnte man per Code den selektierten Bereich ermittlen?
  2. Wie könnte man per Code einen Bereich selektieren?

Daniel

Wenn MultiSelect = true ist und ein Bereich selektiert ist solle Date den Anfang und EndDate das Ende des Bereichs liefern. Beides kann man auch in Code setzen.

Uwe Raabe 1. Jun 2019 13:57

AW: TDateTimePicker: selektierten Bereich ermitteln/setzen
 
Zitat:

Zitat von peterbelow (Beitrag 1433632)
Wenn MultiSelect = true ist und ein Bereich selektiert ist solle Date den Anfang und EndDate das Ende des Bereichs liefern. Beides kann man auch in Code setzen.

Oh, ich hatte das so verstanden, daß er innerhalb des Datum-Strings den Tages-, Monats- oder Jahresanteil selektieren möchte bzw. feststellen welcher davon gerade selektiert ist.

Daniel L. 1. Jun 2019 15:31

AW: TDateTimePicker: selektierten Bereich ermitteln/setzen
 
Zitat:

Oh, ich hatte das so verstanden, daß er innerhalb des Datum-Strings den Tages-, Monats- oder Jahresanteil selektieren möchte bzw. feststellen welcher davon gerade selektiert ist.
Ja genau!

Das ganze soll ein DateTimePicker werden, wo man sowohl ein Datum als auch eine Zeit eingeben können soll.(in einem Editfeld)

Als Format kann man das jetzt schon machen:

Delphi-Quellcode:
dateTimePicker1.format := 'dd.MM.yyyy  HH:mm';
Man kann jetzt zwar Tag, Monat, Jahr, Stunde und Minute als User je einzeln selektieren
und auch ändern, aber es wird immer abhängig von kind (dtkDate oder dtkTime)
nur das Datum nach date, bzw. nur die Zeit nach time übernommen.:(

Ich will das jetzt automatisieren, in dem je nach dem selektiertem Bereich entweder auf dtkDate oder auf dtkTime geschaltet wird.

Daniel

Uwe Raabe 1. Jun 2019 16:23

AW: TDateTimePicker: selektierten Bereich ermitteln/setzen
 
Zitat:

Zitat von Daniel L. (Beitrag 1433634)
Ich will das jetzt automatisieren, in dem je nach dem selektiertem Bereich entweder auf dtkDate oder auf dtkTime geschaltet wird.

Das wird vermutlich nicht funktionieren. Das Ändern von Kind erzeugt das Window-Handle neu und wird dadurch den Editiervorgang stören.

Daniel L. 1. Jun 2019 18:42

AW: TDateTimePicker: selektierten Bereich ermitteln/setzen
 
Das Ändern von kind hab ich mal mit einem Timer getestet (um den Fokus auf den Picker nicht zu verlieren):
Die Date - und Time Werte bleiben erhalten, aber nach der Änderung wird immer der erste Bereich im Edit selektiert, man müsste dann eben den vorherigen Bereich per Code wieder erneut selektieren.

Also mit entsprechenden OnChange/Click/Keydown...Reaktionen sollte das zu machen sein -
wenn ich an die Selektierungen rankäme...

Ich gebe zu, daß TDateTimePicker dafür nicht wirklich konzipiert ist und es ein ziemliches Gefrickel wäre - aber mich nervt es immer wieder, dass man für die Aufnahme eines vollständigen TDateTime Wertes immer 2 Picker brauch, deren Werte man dann addiern muss.

Und eine brauchbare Fremdkomponente (am besten dann auch als datensenitive Variante) hab ich noch nicht gefunden.

Daniel

Uwe Raabe 1. Jun 2019 19:00

AW: TDateTimePicker: selektierten Bereich ermitteln/setzen
 
Du könntest es vielleicht mit einer Interceptor Class erreichen, die das CN_NOTIFY abfängt:
Delphi-Quellcode:
type
  TDateTimePicker = class(Vcl.ComCtrls.TDateTimePicker)
  private
    procedure CNNotify(var Message: TWMNotifyDT); message CN_NOTIFY;
  end;

procedure TDateTimePicker.CNNotify(var Message: TWMNotifyDT);
var
  DT: TDateTime;
begin
  DT := DateTime;
  if (Message.NMHdr^.code = DTN_DATETIMECHANGE) and (Message.NMDateTimeChange^.dwFlags = GDT_VALID) then begin
    DT := SystemTimeToDateTime(Message.NMDateTimeChange^.st);
  end;
  inherited;
  DateTime := DT;
end;

Daniel L. 1. Jun 2019 20:28

AW: TDateTimePicker: selektierten Bereich ermitteln/setzen
 
Ok, da ist einiges Neues für mich dabei, in das ich mich erst einarbeiten muß.

Wenn ich nicht weiterkomme, werd ich hier nochmal weiterposten.

Erstmal vielen Dank!

Daniel

Uwe Raabe 1. Jun 2019 22:24

AW: TDateTimePicker: selektierten Bereich ermitteln/setzen
 
Zum Thema Interceptor Class hier ein guter Artikel von Žarko Gajić: Delphi Interceptor (/Interposer) Classes -> TButton = class(TButton)

Sicher hilft auch ein Blick in die originale TDateTimePicker.CNNotify in Vcl.ComCtrls um zu verstehen, wie der Code funktioniert.


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