Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Programm neu starten
karatekid234 - Fr 22.12.06 21:12
Titel: Programm neu starten
Ist es möglich ein Programm irgendwie auf verkürzte weise neu zu starten?
Also ohne Variablen alle wieder auf null zu setzen und buttons neu zu aktivieren/deaktivieren etc.
delphistart - Fr 22.12.06 21:38
Was willst du denn mit dem Neustart erreichen?
karatekid234 - Fr 22.12.06 21:45
ich habe das Problem, dass ich beispielsweise n rechtecke konstruhieren kann. wenn ich aber n+1/-1 konstruhieren will und dabei auf den oben/unten-pfeil im spinedit klicke, geht noch alles. Wenn ich aber den Wert eintippe, gibts einen Absturz mit der Meldung "kein gultiger Integerwert"
delphistart - Fr 22.12.06 21:55
Warum willst du dann das Programm neu starten? Ich würde versuchen den Fehler zu verhindern. Alles andere Macht doch keinen Sinn oder? Ich würde eine Abfrage machen, ob es sich um einen gültigen integerwert handelt. Wenn nicht würde ich eine Fehlermeldung ausgeben. Dann hättest du zumindest den Absturz schonmal verhindert.
Chryzler - Fr 22.12.06 22:53
delphistart hat folgendes geschrieben: |
Warum willst du dann das Programm neu starten? |
[OT]Wäre ja das selbe, wie wenn man um das Hintergrundbild zu ändern gleich Windows neuinstalliert. :mrgreen: [/OT]
Narses - Fr 29.12.06 17:00
Moin!
Probier das mal als OnChange-Ereignishandler, damit solltest du weiter kommen: ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.SpinEdit1Change(Sender: TObject); begin try if (SpinEdit1.Value < SpinEdit1.MinValue) then SpinEdit1.Value := SpinEdit1.MinValue else if (SpinEdit1.Value > SpinEdit1.MaxValue) then SpinEdit1.Value := SpinEdit1.MaxValue except SpinEdit1.Value := SpinEdit1.MinValue; end; end; |
Und noch was zum Thread-Titel: meinst du nicht, ein Titel wie "Probleme mit man. Eingabe im Spinedit" wäre besser geeignet? ;)
cu
Narses
Chryzler - Fr 29.12.06 17:26
Narses hat folgendes geschrieben: |
Moin!
Probier das mal als OnChange-Ereignishandler, damit solltest du weiter kommen: ;)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.SpinEdit1Change(Sender: TObject); begin try if (SpinEdit1.Value < SpinEdit1.MinValue) then SpinEdit1.Value := SpinEdit1.MinValue else if (SpinEdit1.Value > SpinEdit1.MaxValue) then SpinEdit1.Value := SpinEdit1.MaxValue except SpinEdit1.Value := SpinEdit1.MinValue; end; end; |
Und noch was zum Thread-Titel: meinst du nicht, ein Titel wie "Probleme mit man. Eingabe im Spinedit" wäre besser geeignet? ;)
cu
Narses |
Dürfte nicht gehen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.SpinEdit1Change(Sender: TObject); begin try except end; end; |
Dürfte gehen.
Narses - Fr 29.12.06 17:33
Moin!
Chryzler hat folgendes geschrieben: |
Dürfte nicht gehen. |
Aber sicher geht das, wenn denn im OnChange bereits Aktionen laufen sollen, müssen diese natürlich weiterhin drin bleiben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.SpinEdit1Change(Sender: TObject); begin try if (SpinEdit1.Value < SpinEdit1.MinValue) then SpinEdit1.Value := SpinEdit1.MinValue else if (SpinEdit1.Value > SpinEdit1.MaxValue) then SpinEdit1.Value := SpinEdit1.MaxValue except SpinEdit1.Value := SpinEdit1.MinValue; end; end; |
Mein Code sorgt dann nämlich auch bei einer manuellen fehlerhaften/leeren Eingabe bzw. bei Unter-/Überschreitungen für korrektes Verhalten. ;)
cu
Narses
Chryzler - Fr 29.12.06 18:03
Du brauchst dich nicht um MinValue und MaxValue zu kümmern, das macht schon TSpinEdit selbst. Der Code soll doch verhindern, dass wenn man die Zahl im SpinEdit zum Beispiel entfernt, dass dann nicht versucht wird '' in eine Zahl umwzuwandeln.
Heiko - Fr 29.12.06 18:09
Ich würde es so machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.SpinEdit1Change(Sender: TObject); var Value: Integer; begin if TryStrToInt(SpinEdit1.Text, Value) then begin end; end; |
Narses - Fr 29.12.06 18:10
Moin!
Chryzler hat folgendes geschrieben: |
Du brauchst dich nicht um MinValue und MaxValue zu kümmern, das macht schon TSpinEdit selbst. |
Leider ist das nicht korrekt, nur dann, wenn du die Buttons verwendest. ;) Du kannst problemlos Zahlen ausserhalb des Min/Max-Wertebereichs
manuell eingeben! :zwinker: (probier´s aus :D)
Chryzler hat folgendes geschrieben: |
Der Code soll doch verhindern, dass wenn man die Zahl im SpinEdit zum Beispiel entfernt, dass dann nicht versucht wird '' in eine Zahl umwzuwandeln. |
Genau das tut mein Code ja (unter anderem) auch; aber es wird eben
mindestens der MinValue-Wert verwendet. ;) Das bewirkt, dass auch bei einer "ungültigen" Eingabe immer ein verwendbarer Wert vorhanden ist. Dein Code tut an dieser Stelle leider - gar nichts. :| ;)
cu
Narses
Chryzler - Fr 29.12.06 21:36
Narses hat folgendes geschrieben: |
Moin!
Chryzler hat folgendes geschrieben: | Du brauchst dich nicht um MinValue und MaxValue zu kümmern, das macht schon TSpinEdit selbst. |
Leider ist das nicht korrekt, nur dann, wenn du die Buttons verwendest. ;) Du kannst problemlos Zahlen ausserhalb des Min/Max-Wertebereichs manuell eingeben! :zwinker: (probier´s aus :D)
Chryzler hat folgendes geschrieben: | Der Code soll doch verhindern, dass wenn man die Zahl im SpinEdit zum Beispiel entfernt, dass dann nicht versucht wird '' in eine Zahl umwzuwandeln. |
Genau das tut mein Code ja (unter anderem) auch; aber es wird eben mindestens der MinValue-Wert verwendet. ;) Das bewirkt, dass auch bei einer "ungültigen" Eingabe immer ein verwendbarer Wert vorhanden ist. Dein Code tut an dieser Stelle leider - gar nichts. :| ;)
cu
Narses |
Aha, du bist gar nicht so... Aber dann wird es dem User nie gelingen, das SpinEdit zu "leeren", da ja immer gleich wieder mit MinValue überschrieben wird. Könnte wir uns dann auf diesen Code einigen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.SpinEdit1Change(Sender: TObject); var Value: Integer; begin try if SpinEdit1.Value < SpinEdit1.MinValue then SpinEdit1.Value := SpinEdit1.MinValue else if SpinEdit1.Value > SpinEdit1.MaxValue then SpinEdit1.Value := SpinEdit1.MaxValue Value := SpinEdit1.Value; except Value := SpinEdit1.MinValue; end; end; |
Macht genau das gleiche wie dein Code, aber besteht nicht darauf, dass IMMER eine Zahl im SpinEdit drinsteht, sodass der User die Zahl selbst schön eingeben kann.
GTA-Place - Fr 29.12.06 22:02
Können wir uns noch drauf einigen die if-Abfragen folgendermaßen zu ersetzen (
uses Math):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| try SpinEdit.Value := max(SpinEdit.Value, SpinEdit.MinValue); SpinEdit.Value := min(SpinEdit.Value, SpinEdit.MaxValue); except end; |
Sieht hübscher aus :mrgreen:
Narses - Sa 30.12.06 00:23
Moin!
GTA-Place hat folgendes geschrieben: |
Sieht hübscher aus :mrgreen: |
Wenn schon, dann machen wir es doch auch gleich hübsch
und effizient: ;)
Delphi-Quelltext
1:
| SpinEdit.Value := Min(Max(SpinEdit.Value, SpinEdit.MinValue), SpinEdit.MaxValue); |
Macht aber leider das Programm ordentlich größer, wenn die Unit für sonst nix verwendet wird... :|
Deshalb würde ich hier aus Optimierungsgründen auf die Unit Math verzichten und lieber die if-Anweisungen verwenden. ;)
Notfalls - wenn es denn wirklich unbedingt besser aussehen muss - würde ich mir Max()/Min() eben selbst nachbauen, statt (nur dafür!) die Unit einzubinden. :D
cu
Narses
Heiko - Sa 30.12.06 11:07
Mhm, aber Try-Except ist trotzdem überflüssig, dass kann man vernünftig abfangen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.SpinEdit1Change(Sender: TObject); var Value: Integer; begin if TryStrToInt(SpinEdit1.Text, Value) then begin Value := max(Value, SpinEdit.MinValue); Value := min(Value, SpinEdit.MaxValue); SpinEdit.Value:=Value; end; end; |
Chryzler - Sa 30.12.06 13:01
Heiko hat folgendes geschrieben: |
Mhm, aber Try-Except ist trotzdem überflüssig, dass kann man vernünftig abfangen
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.SpinEdit1Change(Sender: TObject); var Value: Integer; begin if TryStrToInt(SpinEdit1.Text, Value) then begin Value := max(Value, SpinEdit.MinValue); Value := min(Value, SpinEdit.MaxValue); SpinEdit.Value:=Value; end; end; | |
TryStrToInt kannte ich noch gar nicht :o
Lannes - Sa 30.12.06 13:09
Hallo,
ich nutze das SpinEdit nicht mehr, denn man kann, auch wenn man diese Workarounds einbaut,
noch mit Strg+V oder über das Kontextmenü noch einen String in das Spinedit einfügen.
Durch das Einfügen eines Strings wird SpinEdit.Value auf 0 gesetzt aber der String angezeigt.
Mein Favorit ist die UpDown-Komponente in Verbindung mit einem Edit.
Im OnChange des Edit erfolgen dann entsprechende Problembehandlungen.
Heiko - Sa 30.12.06 13:17
Hi Lannes,
da hast du leider Recht, der SpinEdit von Borland ist nicht zu gebrauchen bzw. nur mit kräftiger Nachhilfe ;). Aber auch bei einfachen Eigenlösungen wirst du das Problem immer haben, außer du verhinderst, dass der User etwas in das Edit eingeben kann (kann man beim SpinEdit aber auch einstellen). Von daher ist der Weg, den ich dir vorgeschlagen hatte, normalerweise der beste, denn er überprüft davor, ob eine gültige Zahl drin steht und erst nach der bestandenen Überprüfung führt er deinen Code aus ;).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!