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/)
-   -   dbgrid im Bearbeitungsmodus (https://www.delphipraxis.net/185903-dbgrid-im-bearbeitungsmodus.html)

khh 16. Jul 2015 14:36

dbgrid im Bearbeitungsmodus
 
Hallo zusammen,
ich habe ein DBGrid mit einer TColumn die ein Timestamp-Feld aus der DB anzeigt.
das Feld ist per DisplayFormat HH:mm formatiert.
Funktioniert fabelhaft ;-)

Per Doppelklick ins Feld wird in den Bearbeitungsmodus umgeschaltet und der Feldinhalt im Format "19.07.2015 19:00:00" angezeigt und editierbar.
Per Eingabe lässt sich aber auch die Uhrzeit editieren, ohne dass das komplette Format angezeigt wird.
Hier nun allerdings wir der Tag automatisch auf Tag 0 (z.B. 30.12.1899 17:00:00) zurückgesetzt.

Wie kann ich das verhindern ?
Ich möchte den ursprünglich gespeicherten Tag erhalten.

Ich danke euch

BadenPower 16. Jul 2015 15:31

AW: dbgrid im Bearbeitungsmodus
 
Zitat:

Zitat von khh (Beitrag 1308895)
Per Eingabe lässt sich aber auch die Uhrzeit editieren, ohne dass das komplette Format angezeigt wird.

Wie?

khh 17. Jul 2015 12:08

AW: dbgrid im Bearbeitungsmodus
 
indem man ohne Doppelklick den enthaltenen Wert einfach z.B. mit 14:30 überschreibt.
Damit setzt man den Tag auf 0 resp. 30.12.1899

BadenPower 17. Jul 2015 12:21

AW: dbgrid im Bearbeitungsmodus
 
Zitat:

Zitat von khh (Beitrag 1309018)
indem man ohne Doppelklick den enthaltenen Wert einfach z.B. mit 14:30 überschreibt.
Damit setzt man den Tag auf 0 resp. 30.12.1899

Ich wollte wissen, wie Du im Grid dafür sorgst, dass Du nur die Uhrzeit anzeigen lässt, welche Du dann bearbeiten kannst.
Das ist entscheident dafür, ob der Tag auf den 30.12.1899 gesetzt wird.

khh 17. Jul 2015 12:49

AW: dbgrid im Bearbeitungsmodus
 
mit :
DisplayFormat HH:mm

khh 18. Jul 2015 14:08

AW: dbgrid im Bearbeitungsmodus
 
jemand ne Idee, ob das per DisplayFormat zu handeln ist ?

Oder gibt es einen anderen Weg?

Ich danke euch

BadenPower 18. Jul 2015 17:20

AW: dbgrid im Bearbeitungsmodus
 
Zitat:

Zitat von khh (Beitrag 1309122)
jemand ne Idee, ob das per DisplayFormat zu handeln ist ?

Da ist ein Problem mit dem Grid selbst.

Wenn Du nachdem die Zelle selektiert ist ohne darauf zu klicken eine Taste bedienst, dann kannst Du den Wert zwar editieren, aber das Grid befindet sich eigentlich nicht im Editiermodus.


Aber auch wenn Du Dich im Editiermodus befindest und das Datum löschst und nur einen Zeitwert angibst, dann wird das Datum auf 0 gesetzt, da dieser Wert dann eigeneben ist, weil er nicht vorhanden ist.

Gib, so wie Du es jetzt mit der Zeit gemacht hast einmal ein Datum ein z.B. 20.01.2015 dann wirst Du sehen, dass die Uhrzeit automatisch auf 00:00:00 gesetzt wird und den Wert, welche voher dastand ignoriert wird.

Ich schaue mir das nochmals genauer an, wenn ich etwas mehr Zeit habe. Schau mal nach EditMask in der TField-Klasse.

khh 19. Jul 2015 08:40

AW: dbgrid im Bearbeitungsmodus
 
ich danke dir

khh 19. Jul 2015 09:46

AW: dbgrid im Bearbeitungsmodus
 
alsoo,
EditMask ist wohl der richtige Weg die Eingabe zu beeinflussen.
Jetzt muss ich nur noch die richtige Maske hinbekommen.
Die diversen Möglichkeiten sind mir noch suspekt :-(

Ich befürchte aber, das verhindert mir immer noch nicht, dass das Datum zurück gesetzt wird :-(

khh 20. Jul 2015 09:22

AW: dbgrid im Bearbeitungsmodus
 
ich habe mir überlegt, per Data.DB.TField.OnGetText und Data.DB.TField.OnSetText

das Datum zu speichern und mit der eingegebenen Zeit wieder zurück zu schreiben.

was meint ihr dazu ?

danke gruss KH

khh 20. Jul 2015 09:24

AW: dbgrid im Bearbeitungsmodus
 
doppelpost, bitte löschen

Uwe Raabe 20. Jul 2015 10:07

AW: dbgrid im Bearbeitungsmodus
 
Zitat:

Zitat von khh (Beitrag 1309226)
ich habe mir überlegt, per Data.DB.TField.OnGetText und Data.DB.TField.OnSetText

das Datum zu speichern und mit der eingegebenen Zeit wieder zurück zu schreiben.

Sowas ähnliches wollte ich auch gerade vorschlagen. Du kannst im OnGetText dem Anzeige- und Editstring den reinen Uhzeit-Text geben und beim OnSetText liest du den Feldwert aus (da steht das Datum nämlich noch drin) und änderst lediglich den Zeitanteil.

Delphi-Quellcode:
procedure TForm19.ClientDataSet1MyFieldGetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
  Text := FormatDateTime('hh:mm', Sender.AsDateTime);
end;

procedure TForm19.ClientDataSet1MyFieldSetText(Sender: TField; const Text: string);
begin
  Sender.AsDateTime := DateOf(Sender.AsDateTime) + StrToTime(Text);
end;

khh 20. Jul 2015 10:33

AW: dbgrid im Bearbeitungsmodus
 
probier ich mal so aus,

ich danke dir

bcvs 20. Jul 2015 11:24

AW: dbgrid im Bearbeitungsmodus
 
Ich habe in einem solchen Fall Datum und Uhrzeit auf zwei Columns aufgeteilt.

in SQL:
Code:
Select cast (Zeiten.DATUM as Date) as "Datum", cast (Zeiten.DATUM as Time) as "Zeit"
Vor dem Speichern muss man die beiden Werte halt wieder zusammenfügen. Es ist dann aber immer klar, was geändert wird, Datum oder Uhrzeit.

khh 20. Jul 2015 12:17

AW: dbgrid im Bearbeitungsmodus
 
Zitat:

Zitat von bcvs (Beitrag 1309254)
Ich habe in einem solchen Fall Datum und Uhrzeit auf zwei Columns aufgeteilt.

in SQL:
Code:
Select cast (Zeiten.DATUM as Date) as "Datum", cast (Zeiten.DATUM as Time) as "Zeit"
Vor dem Speichern muss man die beiden Werte halt wieder zusammenfügen. Es ist dann aber immer klar, was geändert wird, Datum oder Uhrzeit.

hab ich auch grad mal so versucht.
Leider lassen sich die Felder so nicht bearbeiten, trotz dass TColumn.readOnly false ist.:-(

BadenPower 20. Jul 2015 12:19

AW: dbgrid im Bearbeitungsmodus
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1309232)
Zitat:

Zitat von khh (Beitrag 1309226)
ich habe mir überlegt, per Data.DB.TField.OnGetText und Data.DB.TField.OnSetText

das Datum zu speichern und mit der eingegebenen Zeit wieder zurück zu schreiben.

Sowas ähnliches wollte ich auch gerade vorschlagen.

Wenn er nur die Zeit ändern möchte ist dies mit OnGetText/OnSetText natürlich eine einfache Lösung.


Allerdings sollte man noch berücksichtigen, dass eventuell ein Ändern des Datums und nicht nur der Uhrzeit erwünscht/notwendig sein könnte.

Hier müsste man dann den eingegebenen Wert in einen DateTime-Wert umwandeln und prüfen, ob ein Datum welches sich vom vorhandenen Datum unterscheidet vorhanden ist, oder ob es sich um den 30.12.1899 handelt.

khh 20. Jul 2015 12:54

AW: dbgrid im Bearbeitungsmodus
 
alsoo,

Delphi-Quellcode:
procedure TForm19.ClientDataSet1MyFieldGetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
  Text := FormatDateTime('hh:mm', Sender.AsDateTime);
end;

procedure TForm19.ClientDataSet1MyFieldSetText(Sender: TField; const Text: string);
begin
  Sender.AsDateTime := DateOf(Sender.AsDateTime) + StrToTime(Text);
end;
im Dataset verursacht mir unerklärliche Dinge :-(

Die Uhrzeit steht zu Beginn im Caption der Form und das Feld im Grid ist leer :-(

BadenPower 20. Jul 2015 13:30

AW: dbgrid im Bearbeitungsmodus
 
EDIT:
hier stand Blödsinn

khh 20. Jul 2015 14:38

AW: dbgrid im Bearbeitungsmodus
 
mh, den "Blödsinn" hab ich nicht gesehen

BadenPower 20. Jul 2015 14:56

AW: dbgrid im Bearbeitungsmodus
 
Zitat:

Zitat von khh (Beitrag 1309283)
mh, den "Blödsinn" hab ich nicht gesehen

Macht nichts, denn was da stand, war nicht richtig.


Zitat:

Zitat von khh (Beitrag 1309268)
alsoo,

Delphi-Quellcode:
procedure TForm19.ClientDataSet1MyFieldGetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
  Text := FormatDateTime('hh:mm', Sender.AsDateTime);
end;

procedure TForm19.ClientDataSet1MyFieldSetText(Sender: TField; const Text: string);
begin
  Sender.AsDateTime := DateOf(Sender.AsDateTime) + StrToTime(Text);
end;
im Dataset verursacht mir unerklärliche Dinge :-(

Die Uhrzeit steht zu Beginn im Caption der Form und das Feld im Grid ist leer :-(

Der Code von Uwe funktioniert perfekt und müßte meiner Meinung nach genau das abdecken, was Du willst.

Uwe Raabe 20. Jul 2015 15:00

AW: dbgrid im Bearbeitungsmodus
 
Zitat:

Zitat von khh (Beitrag 1309268)
Die Uhrzeit steht zu Beginn im Caption der Form und das Feld im Grid ist leer :-(

Prüf mal deinen Code. Ich vermute, du setzt nicht
Delphi-Quellcode:
Text :=
, sondern
Delphi-Quellcode:
Caption :=
. Das würde das Verhalten zumindest erklären.

khh 20. Jul 2015 15:04

AW: dbgrid im Bearbeitungsmodus
 
Hallo BadenPower,
(würdest du bitte deinen Test hier mal reinstellen? ich bekomme nur oben genannten Schrott hin) :-(
hat sich erledigt!
Delphi-Quellcode:

procedure TForm1.ZQuery1ZEITGetText(Sender: TField; var aText: string;
  DisplayText: Boolean);
begin
   Text := FormatDateTime('hh:mm', Sender.AsDateTime);
end;

procedure TForm1.ZQuery1ZEITSetText(Sender: TField; const aText: string);
begin
   Sender.AsDateTime := DateOf(Sender.AsDateTime) + StrToTime(Text);
end;
allerdings unterscheidet sich bei lazarus wohl der parametername aText.
Wenn ich diesen in Text umbenenne bekomme ich Folgendes:
unit1.pas(28,54) Hint: Identifier already defined in unit CONTROLS at line 1393


EDIT :
klar, wenn mein Parameter aText heisst, sollte ich in der procedure auch aText verwenden ;-)

mkinzler 20. Jul 2015 15:10

AW: dbgrid im Bearbeitungsmodus
 
Delphi-Quellcode:
procedure TForm1.ZQuery1ZEITGetText(Sender: TField; var aText: string;
  DisplayText: Boolean);
begin
   aText := FormatDateTime('hh:mm', Sender.AsDateTime);
end;

khh 20. Jul 2015 15:18

AW: dbgrid im Bearbeitungsmodus
 
FUNKTIONIERT!!!!!!

Ich danke euch gewaltig !


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