[erledigt] SpinEditEx und FloatSpinEditEx
- juelin
- Beiträge: 290
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
[erledigt] SpinEditEx und FloatSpinEditEx
Hallo,
in den Komponeneten TSpinEditEx und TFloatSpinEditEx kann man ja
ein MinValue und MaxValue in den Eigenschaften angeben.
Aber egal was ich da eingebe
kann ich im Eingabefeld jeden Wert eingeben (auch kleiner MinValue oder größer MaxValue).
Gibt es da eine Möglichkeit, dass das System die Eingabe prüft?
Danke und Gruß
Jürgen
in den Komponeneten TSpinEditEx und TFloatSpinEditEx kann man ja
ein MinValue und MaxValue in den Eigenschaften angeben.
Aber egal was ich da eingebe
kann ich im Eingabefeld jeden Wert eingeben (auch kleiner MinValue oder größer MaxValue).
Gibt es da eine Möglichkeit, dass das System die Eingabe prüft?
Danke und Gruß
Jürgen
Zuletzt geändert von juelin am So 16. Feb 2025, 17:31, insgesamt 1-mal geändert.
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2822
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: SpinEditEx und FloatSpinEditEx
Kann ich nicht bestätigen. MinValue = 5, MaxValue = 10, keine weiteren Einstellungen.
Ich gebe 22 ein und drücke ENTER => es steht 10 im Feld.
Ich gebe 22 ein und verlasse das Feld mit Tab => es steht 10 im Feld.
Ich gebe 22 ein und klicke auf ein anders Control => es steht 10 im Feld.
Wenn das bei dir nicht funktioniert, gibt es irgendein Problem.
Ich gebe 22 ein und drücke ENTER => es steht 10 im Feld.
Ich gebe 22 ein und verlasse das Feld mit Tab => es steht 10 im Feld.
Ich gebe 22 ein und klicke auf ein anders Control => es steht 10 im Feld.
Wenn das bei dir nicht funktioniert, gibt es irgendein Problem.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 385
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: SpinEditEx und FloatSpinEditEx
Hallo!
TSpinEditEx hat das gleiche Problem wie TSpinEdit, nämlich dass die Korrektur im Eingabefeld erst dann stattfindet, wenn das Control den Fokus verliert.
Im OnChange-Ereignis liefert die .Text-Eigenschaft die beliebige, nicht korrigiert Benutzer-Eingabe. Aber die .Value-Eigenschaft liefert den validierten Integer-Wert zwischen MinValue und MaxValue!
Das Problem, was ich meine, tritt z.B. in folgender Situation auf:
Angenommen es gibt ein modales Fenster, in dem der Benutzer ein Formular ausfüllen soll, darin auch ein SpinEdit. Der Benutzer beendet die Eingabe durch Klick auf einen Ok-Button.
Nun kann es sein, dass der Benutzer z.B. den Wert 42 in das SpinEdit eintippt, obwohl nur 5 bis 10 erlaubt ist. Als nächstes klickt der User auf den Ok-Button, ohne den SpinEdit zuvor mit Tab verlassen zu haben.
Beim Klick auf Ok fragt das Programm den .Value ab und erhält den korrigierten Wert 10, mit dem das Programm zufrieden ist und deshalb keine Fehlermeldung ausgibt. Das Fenster wird geschlossen.
Der Benutzer hatte aber als letztes seine Eingabe 42 gesehen, bevor sich das Fenster schloss. Eine Fehlermeldung hat er nicht erhalten, weil das Programm den Wert 10 zurückgemeldet bekam.
Der Benutzer geht also davon aus, dass seine Eingabe 42 gespeichert wurde und verwendet wird. Ist aber nicht.
TSpinEditEx hat das gleiche Problem wie TSpinEdit, nämlich dass die Korrektur im Eingabefeld erst dann stattfindet, wenn das Control den Fokus verliert.
Im OnChange-Ereignis liefert die .Text-Eigenschaft die beliebige, nicht korrigiert Benutzer-Eingabe. Aber die .Value-Eigenschaft liefert den validierten Integer-Wert zwischen MinValue und MaxValue!
Das Problem, was ich meine, tritt z.B. in folgender Situation auf:
Angenommen es gibt ein modales Fenster, in dem der Benutzer ein Formular ausfüllen soll, darin auch ein SpinEdit. Der Benutzer beendet die Eingabe durch Klick auf einen Ok-Button.
Nun kann es sein, dass der Benutzer z.B. den Wert 42 in das SpinEdit eintippt, obwohl nur 5 bis 10 erlaubt ist. Als nächstes klickt der User auf den Ok-Button, ohne den SpinEdit zuvor mit Tab verlassen zu haben.
Beim Klick auf Ok fragt das Programm den .Value ab und erhält den korrigierten Wert 10, mit dem das Programm zufrieden ist und deshalb keine Fehlermeldung ausgibt. Das Fenster wird geschlossen.
Der Benutzer hatte aber als letztes seine Eingabe 42 gesehen, bevor sich das Fenster schloss. Eine Fehlermeldung hat er nicht erhalten, weil das Programm den Wert 10 zurückgemeldet bekam.
Der Benutzer geht also davon aus, dass seine Eingabe 42 gespeichert wurde und verwendet wird. Ist aber nicht.
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2822
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: SpinEditEx und FloatSpinEditEx
(* oder der User ENTER drückt)Jorg3000 hat geschrieben: Sa 15. Feb 2025, 14:42 TSpinEditEx hat das gleiche Problem wie TSpinEdit, nämlich dass die Korrektur im Eingabefeld erst dann stattfindet, wenn das Control den Fokus verliert*.
Das stimmt, aber ich hätte auch keine Idee wie man es anders machen sollte. Direkt bei der Eingabe geht es ja nicht. Wenn die Werte 5..50 erlaubt sind, muss der User ja auch 3 eingeben können um anschließend mit einer zweiten 3 den erlaubten Wert 33 zu übergeben.
Ja, das kann man da nur durch Veränderung der Benutzerführung umgehen.Jorg3000 hat geschrieben: Sa 15. Feb 2025, 14:42 Angenommen es gibt ein modales Fenster, in dem der Benutzer ein Formular ausfüllen soll, darin auch ein SpinEdit. Der Benutzer beendet die Eingabe durch Klick auf einen Ok-Button.
Nun kann es sein, dass der Benutzer z.B. den Wert 42 in das SpinEdit eintippt, obwohl nur 5 bis 10 erlaubt ist. Als nächstes klickt der User auf den Ok-Button, ohne den SpinEdit zuvor mit Tab verlassen zu haben. Beim Klick auf Ok fragt das Programm den .Value ab und erhält den korrigierten Wert 10, mit dem das Programm zufrieden ist und deshalb keine Fehlermeldung ausgibt. Das Fenster wird geschlossen. Der Benutzer hatte aber als letztes seine Eingabe 42 gesehen, bevor sich das Fenster schloss. Eine Fehlermeldung hat er nicht erhalten, weil das Programm den Wert 10 zurückgemeldet bekam. Der Benutzer geht also davon aus, dass seine Eingabe 42 gespeichert wurde und verwendet wird. Ist aber nicht.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1650
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: SpinEditEx und FloatSpinEditEx
Das hatte Martin in der MSE gut gelöst. Wenn man in einem Edit Enter drückt, wird OnDataEntered aufgerufen. Beim nächsten Enter dann das Modalresult entsprechend gesetzt.
Re: SpinEditEx und FloatSpinEditEx
Das Einfachste ist, DirectInput auf false zu stellen.
Sonst kann man vllt. bei KeyUp etwas machen. Nur so ne Idee:
Auch nicht das Gelbe vom Ei.

Sonst kann man vllt. bei KeyUp etwas machen. Nur so ne Idee:
Code: Alles auswählen
procedure TForm1.SpinEditEx1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
(Sender as TSpinEditEx).Text:=(Sender as TSpinEditEx).Value.ToString;
end;
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 385
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: SpinEditEx und FloatSpinEditEx
Noch einfacher ist es, bei einer Abfrage zu vergleichen:
Das funktioniert aber nicht mit Fließkommazahlen im TFloatSpinEditEx.
Code: Alles auswählen
if SpinEdit1.Value.ToString <> Trim(SpinEdit1.Text) then Alarm();
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2822
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: SpinEditEx und FloatSpinEditEx
juelin hat mich per PN gefragt:
Kopiert aus der .lfm:
Wie gesagt, hab außer den beiden Werten von MinValue und MaxValue nichts angepasst.juelin hat geschrieben: Kannst Du mir mal deine Eigenschaften von FloatSpinEditEx schicken?
Kopiert aus der .lfm:
Code: Alles auswählen
object FloatSpinEditEx1: TFloatSpinEditEx
Left = 8
Height = 26
Top = 8
Width = 103
TabOrder = 0
MaxValue = 10
MinValue = 5
Value = 5
end
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: SpinEditEx und FloatSpinEditEx
Wenn der Programmierer nur die Werte zwischen 5 und 10 erlaubt hat, so wird das seinen Grund haben. Und es muss verhindert werden, dass eine Fehleingabe 42 weiterprozessiert wird. T(Float)SpinEditEx legt darauf den Fokus, eine Fehlermeldung wird nicht angezeigt, denn es würde ganz schön nerven, wenn die Eingabe ständig durch Meldungen unterbrochen wird. Wenn dagegen die Fehlermeldung wichtiger ist, würde ich den erlaubten Wertebereich freigeben und erst beim Klick auf den OK-Button eine Fehlerprüfung durchführen und eine entsprechende Meldung anzeigen.Jorg3000 hat geschrieben: Sa 15. Feb 2025, 14:42 Das Problem, was ich meine, tritt z.B. in folgender Situation auf:
Angenommen es gibt ein modales Fenster, in dem der Benutzer ein Formular ausfüllen soll, darin auch ein SpinEdit. Der Benutzer beendet die Eingabe durch Klick auf einen Ok-Button.
Nun kann es sein, dass der Benutzer z.B. den Wert 42 in das SpinEdit eintippt, obwohl nur 5 bis 10 erlaubt ist. Als nächstes klickt der User auf den Ok-Button, ohne den SpinEdit zuvor mit Tab verlassen zu haben.
Schaut man sich den Code dieser Controls an, gibt es jedoch noch eine dritte Möglichkeit: Das OnEditingDone-Ereignis kommt vor der Umwandlung des Texts in eine Zahl:
Code: Alles auswählen
procedure TSpinEditExBase.EditEditingDone;
begin
inherited EditEditingDone;
GetValue;
UpdateControl;
end;
Code: Alles auswählen
procedure TForm1.FloatSpinEditEx1EditingDone(Sender: TObject);
var
x: Double;
begin
if TryStrToFloat(FloatSpinEditEx1.Text, x) and ((x < FloatSpinEditEx1.Minvalue) or (x > FloatSpinEditEx1.MaxValue)) then
begin
ShowMessage('Out of range.');
FloatSpinEditEx1.SetFocus;
Abort;
end;
end;
- juelin
- Beiträge: 290
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
Re: SpinEditEx und FloatSpinEditEx
Hallo Gemeinde,
Jorg3000 hat vollkommen recht.
Habe es mal getestet.
Wenn man TAB betätigt wir der Wert in FloatSinEditEx1 auf dem Bildschirm geändert.
Allerdiengs wird dan das Ereignis FloatSpinEditEx1KeyUp nicht aufgerufen und man muß nochmal
den Cursor in das Feld setzen und ENTER drücken.
Ist irgendwie alles blöd.
Habe es deshalb anders gelöst.
Habe in dem Ereignis FloatSpinEditEx1KeyUp den Befehl
eingefügt.
So klappt es noch besser als wenn das System den Wert ändert.
Übrigens theo:
Wenn Man den Directinput auf FALSE setzt geht auch keine Eingabe mehr.
Gruß
Jürgen
Jorg3000 hat vollkommen recht.
Habe es mal getestet.
Wenn man TAB betätigt wir der Wert in FloatSinEditEx1 auf dem Bildschirm geändert.
Allerdiengs wird dan das Ereignis FloatSpinEditEx1KeyUp nicht aufgerufen und man muß nochmal
den Cursor in das Feld setzen und ENTER drücken.
Ist irgendwie alles blöd.
Habe es deshalb anders gelöst.
Habe in dem Ereignis FloatSpinEditEx1KeyUp den Befehl
Code: Alles auswählen
if ((FloatSpinEditEx1.Value >= FloatSpinEditEx1.MinValue) and (FloatSpinEditEx1.Value <= FloatSpinEditEx1.MaxValue)) then
begin
// alles OK
end else begin
// Fehlermeldung und Neueingabe
end;
So klappt es noch besser als wenn das System den Wert ändert.
Übrigens theo:
Wenn Man den Directinput auf FALSE setzt geht auch keine Eingabe mehr.
Gruß
Jürgen
- juelin
- Beiträge: 290
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
Re: SpinEditEx und FloatSpinEditEx
Anbei noch meine Eigenschaften von FloatSpinEWditEx1 (bild1 bis bild3)
Im Programm ändere ich dann noch:
Gruß
Jürgen
Im Programm ändere ich dann noch:
Code: Alles auswählen
// Am Programmstart
FloatSpinEditEx1.Value:=0;
FloatSpinEditEx1.ReadOnly:=True;
FloatSpinEditEx1.Color:=clSilver;
FloatSpinEditEx1.NumbersOnly:=False; // True=nur Zahlen, False=mit Vorzeichen und/oder Komma
FloatSpinEditEx1.DecimalSeparator:=',';
FloatSpinEditEx1.DecimalPlaces:=3;
FloatSpinEditEx1.MaxLength:=10;
FloatSpinEditEx1.MaxValue:=99999.999;
FloatSpinEditEx1.MinValue:=-99999.999;
FloatSpinEditEx1.CharCase:=ecNormal;
FloatSpinEditEx1.EchoMode:=emNormal;
FloatSpinEditEx1.TabStop:=True;
// und vor Start Eingabe
FloatSpinEditEx1.ReadOnly:=False;
FloatSpinEditEx1.Color:=clWhite;
FloatSpinEditEx1.Value:=0;
if mart = 2 then
begin
FloatSpinEditEx1.Value:=ein6;
end;
Form1.ActiveControl:=FloatSpinEditEx1;
FloatSpinEditEx1.AutoSelect:=True;
Jürgen
- Dateianhänge
-
- bild3.jpg (64.12 KiB) 3026 mal betrachtet
-
- bild2.jpg (64.29 KiB) 3026 mal betrachtet
-
- bild1.jpg (68.32 KiB) 3026 mal betrachtet
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2822
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: SpinEditEx und FloatSpinEditEx
Genau, das ist ja was man will. Keine Eingabe mehr, nur noch per Hoch/Runter einstellbare Werte. Dann gibt es keine Fehleingaben mehr.juelin hat geschrieben: Sa 15. Feb 2025, 17:26 Übrigens theo:
Wenn Man den Directinput auf FALSE setzt geht auch keine Eingabe mehr.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: SpinEditEx und FloatSpinEditEx
MinValue und MaxValue haben, vom Vorzeichen abgesehen, denselben Wert. Kann es sein, dass irgendwo im Verlauf des Programms dieses Vorzeichen verschwunden ist? Wenn die beiden nämlich gleich groß sind, hat man das von dir beschriebene Verhalten (das ist so gewollt). Setze einen Breakpoint zu Beginn der Eingabe und schaue dir diese beiden Properties an.
- juelin
- Beiträge: 290
- Registriert: Sa 24. Jul 2021, 18:03
- OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
- CPU-Target: 64Bit
- Wohnort: Mannheim
Re: SpinEditEx und FloatSpinEditEx
Hallo wp_xyz,
der Wert ist zwar gleich, aber für mich ist es ein großer Unterschied zwischen -99999.999 und +99999.999.
Gruß
Jürgen
der Wert ist zwar gleich, aber für mich ist es ein großer Unterschied zwischen -99999.999 und +99999.999.
Gruß
Jürgen
Re: SpinEditEx und FloatSpinEditEx
Ich denke du verstehst mich nicht: Prüfe, ob bei der Eingabe MinValue und MaxValue denselben Wert haben (also kein unterschiedliches Vorzeichen). Das wäre die Erklärung für das beobachtete Verhalten. Natrülich muss dann unterwegs bis zu dieser Stelle irgendwo das Vorzeichen verloren gegangen sein.