Autor |
Beitrag |
karatekid234
      
Beiträge: 18
|
Verfasst: Fr 22.12.06 21:12
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
      
Beiträge: 119
|
Verfasst: Fr 22.12.06 21:38
Was willst du denn mit dem Neustart erreichen?
|
|
karatekid234 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 119
|
Verfasst: 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
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: 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.  [/OT]
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Fr 29.12.06 17:26
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: 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
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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!  (probier´s aus  )
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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: 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! (probier´s aus )
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
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: 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 
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Sa 30.12.06 00:23
Moin!
GTA-Place hat folgendes geschrieben: | Sieht hübscher aus  |
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.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Sa 30.12.06 13:01
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Heiko
      
Beiträge: 3169
Erhaltene Danke: 11
|
Verfasst: 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  .
|
|