Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi TDBEdit Datum abprüfen bei exit (https://www.delphipraxis.net/212038-tdbedit-datum-abpruefen-bei-exit.html)

stalkingwolf 6. Dez 2022 16:31

TDBEdit Datum abprüfen bei exit
 
Hallo,

evtl hat jemand einen Ansatz.

Auf einem TDBedit welches ein Datumsfeld ist gibt es eine Fehlermeldung wenn man z.b heute "06" eingibt und das Feld verlässt.
Wo muss man eingreifen damit man dies abfangen und das Datum erweitern kann?!

Gruß Sven

mmw 6. Dez 2022 17:06

AW: TDBEdit Datum abprüfen bei exit
 
Hallo,
evtl. mit

Data.DB.TField.EditMask

editMast:='00/00/0000'

https://docwiki.embarcadero.com/Libr...Field.EditMask

Gruß

himitsu 6. Dez 2022 20:13

AW: TDBEdit Datum abprüfen bei exit
 
Eine datensensitive Datumskomponente wäre die Lösung.
Leider hat Delphi sowas nicht und man müsste sich selbst z.B. den TDateTimePicker umbiegen.

passende Femdkomponenten gäbe es aber von vielen Herstellern.


Auch ein Maskedit hilft hier nicht, denn es weiß garnicht wie es das vervollständigen soll.


TDBEdit besitzt auch kein OnValidate-Event (so wie die DB-Komponenten anderer Hersteller), aber eventuell findest du ja in deinem Field oder DataSet/Query ein dafür nutzbares Event.

Papaschlumpf73 7. Dez 2022 07:08

AW: TDBEdit Datum abprüfen bei exit
 
Die DBEdit-Komponente selbst kann das nicht. Du kannst die Eingabe aber über das Datenfeld prüfen.

Erstelle einfach eine OnSetText-Ereignisprozedur für das entsprechende Datenfeld. Hier bekommst du die Eingabe als String, bevor der Wert in das Datenfeld eingetragen wird. Hier kannst du es prüfen, manipulieren, löschen oder was auch immer. Am Ende der Prozedur kannst du dann den richtigen TDateTime-Wert über Sender.Value:=.... zuweisen.

stalkingwolf 7. Dez 2022 07:58

AW: TDBEdit Datum abprüfen bei exit
 
Danke an alle Antworten.

In unserem Delphi 6 Programm hat dies funktioniert und ich habe nachgeschaut warum.
Wir haben damals die sysutils.pas um diverse Dinge erweitert. Darunter auch das strtodate automatisch das Datum aufbereitet.
Die sysutils haben wir dann aus den D6 Installationen gelöscht und in einen eigenen Suchpfad gelegt.
Scheinbar hat das TDBedit auf strtodate zugegriffen und es hat damit funktioniert.

Glaub das geht in Delphi 11 nicht, weil die Delphi Versionen nach D6 wohl das Datum?! von den anderen Units gegenprüfen und somit keine Modifikation zulassen.

Das ist bad, weil unsere Anwender das gewohnt sind nicht das gesamte Datum einzugeben. Werden wohl nicht drumherum kommen das wir für die Datumsfelder kein DBedit mehr nutzen. Machen wir in neueren Programmen eh nicht mehr, es gibt noch paar alte welche primär auf TDBEdit aufsetzen.

Edit : Ich habe dies einmal mit OnSetText probiert.
2 Probleme dabei.
1.) Die Felder müssen dem Datset hinzugefügt worden sein. Das machen wir nicht immer. Eigentlich auch nicht notwendig. Aber das kann man lösen.
2.) Problem. Ich kann danach nicht mehr Leer eingeben. sobald ich leer durchreiche mit sender.value := text; gibt es eine Fehlermeldung. sender.asdatetime := 0 habe ich 1899 drin :-)

Papaschlumpf73 7. Dez 2022 08:44

AW: TDBEdit Datum abprüfen bei exit
 
Problem 2 löst du mit

Delphi-Quellcode:
Sender.Clear;

BerndS 7. Dez 2022 08:48

AW: TDBEdit Datum abprüfen bei exit
 
Du könntest auch die Vcl.DBCtrls anpassen und den Pfad der geänderte Version im Suchpfad vor die Standardunits setzen oder in den Forms die TDBEdit anpassen.
Ich habe hier mal ein einfaches Beispiel, wie das geht, wobei ich hier TDBText direkt im Form abgeleitet habe, um keine neue Komponente erstellen zu müssen.
Noch besser wäre es, TDBEdit abzuleiten und als neuen Komponente diese in deinem Forms/Datenmodulen auszutauchen.
In meinem Beispiel wird bei einem ungültigen Datum der 1.1.2023 eingetragen. Da müsste dann deine Logik zum prüfen und anpassen des Textes rein.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls, Vcl.ExtCtrls, Data.DB, kbmMemTable;

type
  TDBEdit = class( Vcl.DBCtrls.TDBEdit)
  public
    procedure ValidateEdit; override;
  end;
  TForm1 = class(TForm)
    mt1: TkbmMemTable;
    mt1DATE: TDateField;
    mt1Name: TStringField;
    ds1: TDataSource;
    db1: TDBNavigator;
    dbe1: TDBEdit;
    dbeDATE: TDBEdit;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TDBEdit }

procedure TDBEdit.ValidateEdit;
var
  S: string;
  D: TDateTime;
  SA: TArray<string>;
begin
  inherited;
  if Field is TDateField then
  begin
    S := Text;
    if not TryStrToDate(S, D) then
    begin
      Text := '01.01.2023';
    end;
  end;

end;

end.

Papaschlumpf73 7. Dez 2022 08:50

AW: TDBEdit Datum abprüfen bei exit
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1515918)
Die DBEdit-Komponente selbst kann das nicht. Du kannst die Eingabe aber über das Datenfeld prüfen.

Erstelle einfach eine OnSetText-Ereignisprozedur für das entsprechende Datenfeld. Hier bekommst du die Eingabe als String, bevor der Wert in das Datenfeld eingetragen wird. Hier kannst du es prüfen, manipulieren, löschen oder was auch immer. Am Ende der Prozedur kannst du dann den richtigen TDateTime-Wert über Sender.Value:=.... zuweisen.

Im OnCreate des Datenmoduls habe ich eine Schleife eingebaut, die eine spezielle OnSetText-Procedure allen TDateFields / TDateTimeFields zuweist. Dann vergisst man auch keins davon.

stalkingwolf 7. Dez 2022 09:10

AW: TDBEdit Datum abprüfen bei exit
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1515928)
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1515918)
Die DBEdit-Komponente selbst kann das nicht. Du kannst die Eingabe aber über das Datenfeld prüfen.

Erstelle einfach eine OnSetText-Ereignisprozedur für das entsprechende Datenfeld. Hier bekommst du die Eingabe als String, bevor der Wert in das Datenfeld eingetragen wird. Hier kannst du es prüfen, manipulieren, löschen oder was auch immer. Am Ende der Prozedur kannst du dann den richtigen TDateTime-Wert über Sender.Value:=.... zuweisen.

Im OnCreate des Datenmoduls habe ich eine Schleife eingebaut, die eine spezielle OnSetText-Procedure allen TDateFields / TDateTimeFields zuweist. Dann vergisst man auch keins davon.

das haben wir auch und dort habe ich es auch eingefügt. haben wir schon für das Displayformat für Zahlen gemacht.
Dort habe ich auch onSetText onGetText für ftDate und ftDateTime gesetzt.

Zitat:

Zitat von Papaschlumpf73 (Beitrag 1515926)
Problem 2 löst du mit

Delphi-Quellcode:
Sender.Clear;

Perferkt. Danke.

Uwe Raabe 7. Dez 2022 09:23

AW: TDBEdit Datum abprüfen bei exit
 
Ich habe es selbst noch nicht probiert, aber in meinem Beitrag zur CodeRage 2022 beschreibe ich ein Verfahren, mit dem man einem TCustomEdit unter anderem auch einen Validator zuweisen kann. Das das TDBEdit auch von TCustomEdit abgeleitet ist, könnte das da auch funktionieren.

Die entsprechenden Sourcen sind in meiner CmonLib enthalten, zu finden auf https://github.com/UweRaabe/CmonLib im Observer Beispiel.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:11 Uhr.
Seite 1 von 2  1 2      

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