[erledigt] SpinEditEx und FloatSpinEditEx

Rund um die LCL und andere Komponenten
Benutzeravatar
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

Beitrag von juelin »

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
Zuletzt geändert von juelin am So 16. Feb 2025, 17:31, insgesamt 1-mal geändert.

Benutzeravatar
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

Beitrag von m.fuchs »

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.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 385
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: SpinEditEx und FloatSpinEditEx

Beitrag von Jorg3000 »

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.

Benutzeravatar
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

Beitrag von m.fuchs »

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*.
(* oder der User ENTER drückt)

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.
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.
Ja, das kann man da nur durch Veränderung der Benutzerführung umgehen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
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

Beitrag von fliegermichl »

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.

Benutzeravatar
theo
Beiträge: 10916
Registriert: Mo 11. Sep 2006, 19:01

Re: SpinEditEx und FloatSpinEditEx

Beitrag von theo »

Das Einfachste ist, DirectInput auf false zu stellen. :wink:
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;   
Auch nicht das Gelbe vom Ei.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 385
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: SpinEditEx und FloatSpinEditEx

Beitrag von Jorg3000 »

Noch einfacher ist es, bei einer Abfrage zu vergleichen:

Code: Alles auswählen

 
   if SpinEdit1.Value.ToString <> Trim(SpinEdit1.Text) then Alarm();
 
Das funktioniert aber nicht mit Fließkommazahlen im TFloatSpinEditEx.

Benutzeravatar
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

Beitrag von m.fuchs »

juelin hat mich per PN gefragt:
juelin hat geschrieben: Kannst Du mir mal deine Eigenschaften von FloatSpinEditEx schicken?
Wie gesagt, hab außer den beiden Werten von MinValue und MaxValue nichts angepasst.
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

wp_xyz
Beiträge: 5185
Registriert: Fr 8. Apr 2011, 09:01

Re: SpinEditEx und FloatSpinEditEx

Beitrag von wp_xyz »

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.
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.

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; 
Daher kann man sich hier reinhängen und den Text-Wert abfragen, bevor die Min/Max-Begrenzung erfolgt. Und im Fehlerfall Abort aufrufen, damit der nachfolgende Code von der Komponente nicht ausgeführt werden kann:

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; 

Benutzeravatar
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

Beitrag von juelin »

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

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;    
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

Benutzeravatar
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

Beitrag von juelin »

Anbei noch meine Eigenschaften von FloatSpinEWditEx1 (bild1 bis bild3)
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;
Gruß
Jürgen
Dateianhänge
bild3.jpg
bild3.jpg (64.12 KiB) 3026 mal betrachtet
bild2.jpg
bild2.jpg (64.29 KiB) 3026 mal betrachtet
bild1.jpg
bild1.jpg (68.32 KiB) 3026 mal betrachtet

Benutzeravatar
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

Beitrag von m.fuchs »

juelin hat geschrieben: Sa 15. Feb 2025, 17:26 Übrigens theo:
Wenn Man den Directinput auf FALSE setzt geht auch keine Eingabe mehr.
Genau, das ist ja was man will. Keine Eingabe mehr, nur noch per Hoch/Runter einstellbare Werte. Dann gibt es keine Fehleingaben mehr.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 5185
Registriert: Fr 8. Apr 2011, 09:01

Re: SpinEditEx und FloatSpinEditEx

Beitrag von wp_xyz »

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.

Benutzeravatar
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

Beitrag von juelin »

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

wp_xyz
Beiträge: 5185
Registriert: Fr 8. Apr 2011, 09:01

Re: SpinEditEx und FloatSpinEditEx

Beitrag von wp_xyz »

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.

Antworten