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/)
-   -   Sekunden im Text von TDBEdit (Uhrzeit) werden bei Fokus auf 00 gesetzt (https://www.delphipraxis.net/201724-sekunden-im-text-von-tdbedit-uhrzeit-werden-bei-fokus-auf-00-gesetzt.html)

Getox 20. Aug 2019 13:49

Sekunden im Text von TDBEdit (Uhrzeit) werden bei Fokus auf 00 gesetzt
 
Hallo,

ich habe mal wieder ein Problem, wo ich echt wie ein Ochse vorm Berg stehe.

Ich habe ein Dataset in dem ich unter anderem ein Feld Abfrage, welches zwar ein DateTime ist, aber wo nur die Uhrzeit wichtig ist. Als Datum steht in so einem Fall immer der 30.12.1899. Die Uhrzeit ist zum Beispiel 12:35:00.

Als Displayformat für das TDateTimeField habe ich 'hh:nn' gesetzt. Als EditMask '!99:99;1;_'.

Das Dataset hängt an einer Datasource und diese ist mit einem tDBEdit verbunden. Wenn ich die Maske nun öffne, wird dort im Edit korrekt '12:35' angezeigt. Wenn ich in das Edit klicke steht da aber plötzlich '12:00'. Wenn ich wieder ein anderes Element anklicke, steht in dem Edit wieder korrekt "12:35".

Wenn ich die Minuten abändere und speichere, wird auch der korrekte Wert gespeichert.

Wenn ich die EditMask entferne steht im Edit wenn es fokussiert ist das komplette Datum '30.12.1899 12:35:00. Daher vermute ich den Fehlwer bei meiner Editmask. Nur wo ist dieser Fehler? Warum setzt das Edit beim Erhalt vom Focus die Minuten auf 00?

liebe Grüße

stahli 20. Aug 2019 13:52

AW: Sekunden im Text von TDBEdit (Uhrzeit) werden bei Fokus auf 00 gesetzt
 
Gab es da nicht zwei verschiedene Masken für die Darstellung und Bearbeitung?
(Bin aber nicht sicher, ist schon so lange her für mich.)

Getox 20. Aug 2019 13:54

AW: Sekunden im Text von TDBEdit (Uhrzeit) werden bei Fokus auf 00 gesetzt
 
Eigentlich DisplayFormat und EditMask und die habe ich ja beide befüllt :(

stahli 20. Aug 2019 13:57

AW: Sekunden im Text von TDBEdit (Uhrzeit) werden bei Fokus auf 00 gesetzt
 
Ich dachte, vielleicht eines versehentlich falsch befüllt...!?

Getox 20. Aug 2019 14:04

AW: Sekunden im Text von TDBEdit (Uhrzeit) werden bei Fokus auf 00 gesetzt
 
Zitat:

TField.DisplayFormat = "HH:MM" used to display existing values, but EditMask
will not work to control data entered by user. EditMask processing uses the
text property, not the displaytext, hence gets a datetime string like
"12/03/2005 10:57:03" and can not remove both leading (date) and trailing
(seconds) extraneous characters. You can not get hours and minutes from a
full datetime string using a mask.

Quelle: https://groups.google.com/forum/#!to...32/ZuDseFAGWaU
Da muss ich mir wohl was anderes einfallen lassen...

Getox 20. Aug 2019 14:20

AW: Sekunden im Text von TDBEdit (Uhrzeit) werden bei Fokus auf 00 gesetzt
 
Meine Lösung:
Bevor ich den Thread eröffnet habe, habe ich bereits vom TField onSetText implementiert um den Wert auf den Ursprungswert zurückzusetzen, wenn die Eingabe ungültig ist und man das Edit verlässt. Andernfalls kam es zu Fehlern, wenn man zum Beispiel direkt nach der Eingabe eines ungültigen Wertes den Tab gewechselt hat. Dann hat das Edit intern versucht sich selbst zu fokussieren, was aber nicht ging, weil der Tab nicht mehr aktiv war, wo sich das Edit drauf befindet. Also Fokusfehler. Weil ich aus diesem Grund das OnSetText Event bereits gesetzt habe, klappte das Speichern der eingegebenen Minuten zufällig.

Code:
procedure TFormSetDateTimeEdit.FieldZeitSetText(Sender: TField; const Text: string);
var
  sText: string;
begin
  sText := Text;
  if sText[1] = ' ' then
    sText[1] := '0';
  if sText[5] = ' ' then
    sText[5] := '0';
  if (sText[2] = ' ') or (sText[4] = ' ') or not IsTime(sText) then
    Sender.AsVariant := Sender.oldValue
  else
    Sender.AsDateTime := StrToDateTime('30.12.1899 ' + sText + ':00');
end;
Nun habe ich auch noch das OnGetText Event gesetzt:
Code:
procedure TFormSetDateTimeEdit.FieldZeitGetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
  Text := FormatDateTime('hh:nn', sender.AsDateTime);
end;
Das DisplayFormat und die EditMask habe ich wie eim Eingangspost beschrieben belassen. Nun klappt alles wie es soll :)


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