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/)
-   -   SpinEdit MinValue (https://www.delphipraxis.net/159759-spinedit-minvalue.html)

thomas2009 11. Apr 2011 21:34

SpinEdit MinValue
 
Hi
Ich verstehe nicht, warum ich 0 in SpinEdit eintippen kann,
obwohl SpinEdit.MinValue=1
Nur wenn SpinEdit1 den Focus verliert, dann wird der Value von 0 zu 1 verändert

Ich darf in SpinEdit kein 0 eintippen. Ich habe versucht inEvent Onchange :
Delphi-Quellcode:
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
if (SpinEdit1.Value>0) and (SpinEdit1.Text<>'') then begin
SpinEdit2.Text:=IntToStr(Trunc(x / SpinEdit1.Value));

end else begin
exit; end;
end;
Trotzdem bekomme ich Fehler ! wenn ich 0 eintippe oder den Wert in SpinEdit1 lösche !

s.h.a.r.k 11. Apr 2011 22:02

AW: SpinEdit MinValue
 
Was zum Teufel programmierst du denn da? Hast du dir deinen Quellcode schon mal durchgelesen? :roll: Langsam wirds echt lustig mit dir...

Wenn ein User etwas eintippt kann nicht live geprüft werden, ob der eingegebene Wert korrekt ist. Das ist erst bei der OnExit-Methode möglich. Daher kann ein User auch eine 0 eingeben! Stell dir mal vor, du beschränkst das SpinEdit auf das Interval [3-20] und der User will 20 eingeben, dann würde schon bei der Eingabe der 2 sein Wert korrigiert werden.

Alternativ könntest du dir mal die Property EditorEnabled anschauen.

thomas2009 11. Apr 2011 23:15

AW: SpinEdit MinValue
 
OnExit-Methode funktioniert Ohne Fehler. Das ist eine Lösung, wenn es nicht möglich ist, Online (Onchange) die Werte zu berechnen
Ich möchte die Änderung Live sehen Onchange und nicht nur wenn ich ausserhalb wo anderes zu klicken !

s.h.a.r.k 11. Apr 2011 23:31

AW: SpinEdit MinValue
 
Hast du überhaupt gelesen, was ich dir geschrieben habe? Den Eindruck macht es jedenfalls keineswegs... Du wirst doch wohl nicht glauben, dass dir die Mitglieder hier auf die Dauer noch viel helfen werden, wenn du schon das ignorierst was da steht. Ein wenig darüber nachdenken, was da steht und warum ein SpinEdit so funktioniert, wie es funktioniert, würde schon nicht schaden. Ich habe dir ja auch einen Lösungsweg beschrieben, der dich sichtlich gar nicht interessiert. Passt dir daran irgendwas nicht? Oder wo liegt denn bitte das Problem?

thomas2009 11. Apr 2011 23:44

AW: SpinEdit MinValue
 
Alles was ich machen wollte ist folgendes
Delphi-Quellcode:
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
if (SpinEdit1.Text='') or (SpinEdit1.Value<1) then begin
ShowMessage('Bitte einen Wert von 1 bis 10000 eingeben'); end else begin
bla bla
Ich möchte unbedingt Live die Werte berechnen und nicht OnExit
:?

s.h.a.r.k 11. Apr 2011 23:47

AW: SpinEdit MinValue
 
Das geht nicht, wenn du dem User erlaubst via Tastatur Werte einzugeben! Nochmals schreibe ich das nicht hin. Der Grund, warum es nicht geht steht weiter oben. Ich habe dir auch eine Property genannt mit der du dem User verbieten kannst Werte direkt einzugeben. Er muss daher die Pfeiltesten (Tastatur) nutzen oder eben die Pfeil-Button mit der Maus klicken.

Oder du überlegst dir einfach, ein komplett anderes Control zu nutzen!

Wenn es sich um dein Scale-Dialog handelt sollte auch folgende Lösung funktionieren: du kannst beim OnChange prüfen, ob der eingegebene Werte korrekt ist. Wenn ja, dann lass den Ok- bzw. Übernehmen-Button aktiviert (Enabled = True), ansonsten setze Enabled bei ungültigen Werten auf False. So kann der User nie eine Aktion ausführen, die die fehlerhafte Daten vorliegen.

Aphton 12. Apr 2011 00:00

AW: SpinEdit MinValue
 
Haie sind bissig!

Probier mal folgendes
Delphi-Quellcode:
  if SpinEdit.Value < SpinEdit.MinValue then
    SpinEdit.Value := SpinEdit.MinValue
  else
  if SpinEdit.Value > SpinEdit.MaxValue then
    SpinEdit.Value := SpinEdit.MaxValue;
Edit: Doch im Grunde hat der Hai recht!

thomas2009 12. Apr 2011 00:13

AW: SpinEdit MinValue
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von s.h.a.r.k (Beitrag 1094537)
Er muss daher die Pfeiltesten (Tastatur) nutzen oder eben die Pfeil-Button mit der Maus klicken.

Was wäre, wenn der User statt 1, den Wert 200 eingeben will?
Muss er 199 mals die Pfeil-Taste drücken :|

Zitat:

Zitat von s.h.a.r.k (Beitrag 1094537)
Oder du überlegst dir einfach, ein komplett anderes Control zu nutzen!

Es gibt in Delphi keine weitere Kontrole ausser Edit und SpinEdit

Zitat:

Zitat von s.h.a.r.k (Beitrag 1094537)
Wenn es sich um dein Scale-Dialog handelt sollte auch folgende Lösung funktionieren: du kannst beim OnChange prüfen ...

Ja aber das Ergebnis muss Live gesehen werden

Hier ist zum Beispiel von einem anderen Programm, wenn ich 0 eingebe

Zitat:

Zitat von Aphton (Beitrag 1094538)
Probier mal folgendes
...

Wenn Du deinen Code in Onchange hin legst, dann bekommt Du Fehler :-D

Daniel 12. Apr 2011 06:49

AW: SpinEdit MinValue
 
Du wirst kaum verhindern können, dass der Anwender eine Null eintippt, weil Du nicht wissen kannst, ob daraus vielleicht ein "03" wird. Das Einzige, was Du tun kannst, ist, später in Deiner Verarbeitung auf die Null (nicht) zu reagieren, indem Du in diesem Fall intern mit einer "1" oder einem anderen sinnvollen Wert weiterrechnest. Spätestens im OnExit-Ereignis wird die GUI ja wider glatt gezogen.

Im OnChange-Ereignis könntest Du bei einem Wert, der nicht dem gewünschten Wertebereich entspricht, das Eingabefeld anders färben. Sobald Du aber anfängst, den eingegebenen String im OnChange-Ereignis zu verändern, wirst Du den Anwender in 9 von 10 Fällen verärgern, weil Du nicht vorhersehen kannst, was er eigentlich wollte und daher keine Korrektur in seinem Sinne vornehmen kannst.

Satty67 12. Apr 2011 07:56

AW: SpinEdit MinValue
 
Man könnte auch ein UpDown nehmen, der Wertebereich von SmallInt sollte hier reichen.

Im assoziierten Edit-OnChange prüft man mit TryStrToInt ob die Eingabe im Werte-Bereich ist und aktualisiert UpDown.Position.

Die Live-Anzeige wird nur im UpDown.OnChanching ausgelöst.

Delphi-Quellcode:
procedure TForm1.UpDown1Changing(Sender: TObject;
  var AllowChange: Boolean);
begin
  Label1.Caption := IntToStr(UpDown1.Position);
end;

procedure TForm1.Edit1Change(Sender: TObject);
var
  i : Integer;
begin
  if TryStrToInt((Sender as TEdit).Text, i) then
  begin
    if (i >= UpDown1.Min) and (i <= UpDown1.Max) then
      UpDown1.Position := i;
  end;
end;
Wichtig ist in der Combo die Unabhängigkeit der Ereignisse, wobei die Abhängigkeit der unabhängigen Komponenten abhängig von der Anwendung, unschön ist, ganz unabhängig vom Nutzen der Methode. ;)

€: Oder man leitet vom SpinEdit ab und publiziert ein OnTextChange-Ereignis bzw. bastelt sich da ein Live-Update von Value rein, dann hat man wieder alles in einer Hand.

PS: Ich glaube der TS muss die ganzen Antworten übersetzen, weshalb wohl ein Teil der Antworten einfach untergeht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:49 Uhr.
Seite 1 von 2  1 2      

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