![]() |
AW: NumbersOnly bei TDateTimePicker
Zitat:
|
AW: NumbersOnly bei TDateTimePicker
@h.bothur
Sie waren eben nicht besonders hilfreich. Aber ich habe auch nicht gut erklärt was mein Problem ist, also ist es eher meine Schuld Ich erwarte auf jeden Fall nicht, dass das jeder hier bei sich nachstellt. Auch wenn es nicht lange dauern würde (man muss nur ein TDateTimePicker auf eine Form ziehen und ParseInput aktivieren). |
AW: NumbersOnly bei TDateTimePicker
Zitat:
Um das zu prüfen, müsstest du eben genau das machen was du beschrieben hast: Eine Form erstellen, TDateTimePicker rauf schieben, Programm starten und versuchen Buchstaben etc. einzugeben. Ergebnis zur weiteren Fehlersuche nutzen. Ein schnelleres Ergebnis kannst du nicht haben. |
AW: NumbersOnly bei TDateTimePicker
Wenn man ParseInput auf True stellt, wird das Ereignis onUserInput aufgerufen. Mir scheint in diesem Zusammenhang zwingend, dieses Ereignis auch auszuwerten und die Eingabe auf Gültigkeit zu prüfen. Man sagt durch ParseInput = True quasi: "Lieber DateTimePicker, kümmere Dich nicht um die Eingabe, das mach' ich selber."
Allerdings bekomme ich auch hier (ohne das Ereignis OnUserInput zu verarbeiten) beim Verlassen des TDateTimePickers, ohne gültige Eingabe, eine sinnvolle Fehlermeldung. Es könnte sein, dass die Attribute Format und Kind (eventuell auch noch weitere) da irgendwie mit hineinspielen. |
AW: NumbersOnly bei TDateTimePicker
ja.
|
AW: NumbersOnly bei TDateTimePicker
Zitat:
Wenn es denn so einfach ist, ein Testprogramm zu erstellen, warum schaffst du es dann nach nunmehr 15 Posts immer noch nicht? |
AW: NumbersOnly bei TDateTimePicker
Da der TE es nicht schafft (oder eher nicht will) einen Source zu liefern um das nachzustellen, hier ist es:
Delphi-Quellcode:
Folgende Vorgehensweise führt bei Delphi 10.3 zu einem
type
TMainForm = class(TForm) ApplicationEvents1: TApplicationEvents; DateTimePicker1: TDateTimePicker; ListBox1: TListBox; procedure ApplicationEvents1_Exception(Sender: TObject; E: Exception); procedure DateTimePicker1_UserInput(Sender: TObject; const UserString: string; var DateAndTime: TDateTime; var AllowChange: Boolean); private { Private-Deklarationen } public { Public-Deklarationen } constructor Create(AOwner: TComponent); override; end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.ApplicationEvents1_Exception(Sender: TObject; E: Exception); begin // TODO -cMM: TMainForm.ApplicationEvents1_Exception default body inserted ListBox1.Items.Add(E.ClassName + ': ' + E.Message); end; constructor TMainForm.Create(AOwner: TComponent); begin inherited; ApplicationEvents1.OnException := ApplicationEvents1_Exception; DateTimePicker1.AlignWithMargins := True; DateTimePicker1.Align := alTop; DateTimePicker1.ParseInput := True; DateTimePicker1.OnUserInput := DateTimePicker1_UserInput; ListBox1.AlignWithMargins := True; ListBox1.Align := alClient; end; procedure TMainForm.DateTimePicker1_UserInput(Sender: TObject; const UserString: string; var DateAndTime: TDateTime; var AllowChange: Boolean); begin // TODO -cMM: TMainForm.DateTimePicker1_UserInput default body inserted ListBox1.Items.Add('DateTimePicker1_UserInput ' + UserString); end;
Delphi-Quellcode:
:
EConvertError
Delphi-Quellcode:
Methode nicht aufgerufen wird, aber dafür gibt es den
DateTimePicker1_UserInput
Delphi-Quellcode:
EConvertError
Code:
UPDATE
EConvertError: 'morgen' ist keine gültige Datums- und Uhrzeitangabe
Und zwei Klicks weiter im Debugger hat man auch schon den Übeltäter lokalisiert: Vcl.ComCtrls - Zeile 28152
Delphi-Quellcode:
DTN_USERSTRINGA, DTN_USERSTRINGW:
begin DateTimeString := NMDateTimeString; with DateTimeString{$IFNDEF CLR}^{$ENDIF} do begin {$IFDEF CLR} UserString := Marshal.PtrToStringAuto(pszUserString); {$ELSE} UserString := pszUserString; {$ENDIF} DT := StrToDateTime(UserString); // das ist der Übeltäter if Assigned(FOnUserInput) then begin AllowChange := True; FOnUserInput(Self, UserString, DT, AllowChange); dwFlags := Ord(not AllowChange); end else dwFlags := Ord(False); DateTimeToSystemTime(DT, st); end; Bevor man die Chance bekommt den Eingabestring zu verarbeiten wird dieser schon von der Komponente geparst und es kommt zur Exception. Könnte sich um einen Bug handeln. Dazu müsste man dieses Verhalten mit der Dokumentation abgleichen, was die Komponente denn so machen sollte. |
AW: NumbersOnly bei TDateTimePicker
Zitat:
|
AW: NumbersOnly bei TDateTimePicker
Sowas würde ich aber niemals in KeyDown oder KeyPress packen, weil es nicht auf andere Messages (wie zB. Paste) reagiert. Besser wäre es, dies ins Change-Event zu packen. Noch besser wäre es aber, das UserInput-Ereignis zu nehmen (wurde ja schon erklärt).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:34 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