Autor Beitrag
karatekid234
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: Fr 22.12.06 21:38 
Was willst du denn mit dem Neustart erreichen?
karatekid234 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 119



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 29.12.06 17:00 
Moin!

Probier das mal als OnChange-Ereignishandler, damit solltest du weiter kommen: ;)
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Fr 29.12.06 17:26 
user profile iconNarses hat folgendes geschrieben:
Moin!

Probier das mal als OnChange-Ereignishandler, damit solltest du weiter kommen: ;)
ausblenden 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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:
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 29.12.06 18:09 
Ich würde es so machen:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: 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?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 29.12.06 22:02 
Können wir uns noch drauf einigen die if-Abfragen folgendermaßen zu ersetzen (uses Math):
ausblenden 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:

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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: ;)
ausblenden 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Sa 30.12.06 11:07 
Mhm, aber Try-Except ist trotzdem überflüssig, dass kann man vernünftig abfangen

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: 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 ;).