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

user profile icondelphistart 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:
// Wertänderungen im SpinEdit auf Korrektheit prüfen und ggfs. korrigieren
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
  try // versuchen den Wert zu lesen
    if (SpinEdit1.Value < SpinEdit1.MinValue) then // Vorgabe unterschritten?
      SpinEdit1.Value := SpinEdit1.MinValue // nicht weniger als .MinValue
    else if (SpinEdit1.Value > SpinEdit1.MaxValue) then // Vorgabe überschritten?
      SpinEdit1.Value := SpinEdit1.MaxValue // nicht mehr als .MaxValue
  except // wenn das nicht klappt -> Standard-Vorgabe nehmen
    SpinEdit1.Value := SpinEdit1.MinValue; // fehlerhafte Eingabe -> ersetzen
  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

user profile iconNarses 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:
// Wertänderungen im SpinEdit auf Korrektheit prüfen und ggfs. korrigieren
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
  try // versuchen den Wert zu lesen
    if (SpinEdit1.Value < SpinEdit1.MinValue) then // Vorgabe unterschritten?
      SpinEdit1.Value := SpinEdit1.MinValue // nicht weniger als .MinValue
    else if (SpinEdit1.Value > SpinEdit1.MaxValue) then // Vorgabe überschritten?
      SpinEdit1.Value := SpinEdit1.MaxValue // nicht mehr als .MaxValue
  except // wenn das nicht klappt -> Standard-Vorgabe nehmen
    SpinEdit1.Value := SpinEdit1.MinValue; // fehlerhafte Eingabe -> ersetzen
  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
    // Den Code, den du schon im onChange hast
  except
  end;
end;

Dürfte gehen.


Narses - Fr 29.12.06 17:33

Moin!

user profile iconChryzler 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:
// Wertänderungen im SpinEdit auf Korrektheit prüfen und ggfs. korrigieren  
procedure TForm1.SpinEdit1Change(Sender: TObject);  
begin  
  try // versuchen den Wert zu lesen  
    if (SpinEdit1.Value < SpinEdit1.MinValue) then // Vorgabe unterschritten?  
      SpinEdit1.Value := SpinEdit1.MinValue // nicht weniger als .MinValue  
    else if (SpinEdit1.Value > SpinEdit1.MaxValue) then // Vorgabe überschritten?  
      SpinEdit1.Value := SpinEdit1.MaxValue // nicht mehr als .MaxValue  
  except // wenn das nicht klappt -> Standard-Vorgabe nehmen  
    SpinEdit1.Value := SpinEdit1.MinValue; // fehlerhafte Eingabe -> ersetzen  
  end;  
  // ab hier Code, der schon im OnChange drin war, wenn denn welcher drin war... ;)
  //...
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
    //Hier deine Verarbeitung
  end;
end;


Narses - Fr 29.12.06 18:10

Moin!

user profile iconChryzler 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)

user profile iconChryzler 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

user profile iconNarses hat folgendes geschrieben:
Moin!

user profile iconChryzler 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)

user profile iconChryzler 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;    
  // ab hier Code, der schon im OnChange drin war, wenn denn welcher drin war... ;)  
  // aber statt SpinEdit1.Value jetzt Value nehmen  
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!

user profile iconGTA-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;
    //Hier deine Verarbeitung
  end;
end;


Chryzler - Sa 30.12.06 13:01

user profile iconHeiko 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;
    //Hier deine Verarbeitung
  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 ;).