![]() |
AW: Funktion/Prozedur abbrechen?
Zitat:
Dennoch denke ich, daß ich Benachrichtigungen an den Anwender nicht mit Exceptions durchführen sollte. |
AW: Funktion/Prozedur abbrechen?
Sowas ist nicht nötig:
Delphi-Quellcode:
Dafür braucht man keinen Begin End Block. Das reicht:
begin
if Edit2.Text > Edit1.Text then ShowMessage('Invalide Eingabe'); end;
Delphi-Quellcode:
Auch hier ist es unnötig:
if Edit2.Text > Edit1.Text then ShowMessage('Invalide Eingabe');
//
Delphi-Quellcode:
Geht man davon aus, dass die Einrückung nach
begin
if Edit2.Text <= Edit1.Text then maxpunktzahl:=StrToInt(Edit1.Text); schülerpunkte:=StrToInt(Edit2.Text); Minpunkte[1]:=(maxpunktzahl/100)*96; Minpunkte[2]:=(maxpunktzahl/100)*80; Minpunkte[3]:=(maxpunktzahl/100)*60; Minpunkte[4]:=(maxpunktzahl/100)*40; Minpunkte[5]:=(maxpunktzahl/100)*20; Minpunkte[6]:=(maxpunktzahl/100)*0; StringGrid1.Cells[1,1]:=FloatToStr(Ceil(Minpunkte[1])); StringGrid1.Cells[1,2]:=FloatToStr(Ceil(Minpunkte[2])); StringGrid1.Cells[1,3]:=FloatToStr(Ceil(Minpunkte[3])); StringGrid1.Cells[1,4]:=FloatToStr(Ceil(Minpunkte[4])); StringGrid1.Cells[1,5]:=FloatToStr(Ceil(Minpunkte[5])); StringGrid1.Cells[1,6]:=FloatToStr(Ceil(Minpunkte[6])); begin
Delphi-Quellcode:
nicht zufällig ist, sondern die anderen Zeilen mit bei der Abfrage einbezogen werden sollen, dann sollte das so aussehen:
maxpunktzahl:=StrToInt(Edit1.Text);
Delphi-Quellcode:
Und was die Abfragen angeht, aus dem:
if Edit2.Text <= Edit1.Text then
begin maxpunktzahl:=StrToInt(Edit1.Text); schülerpunkte:=StrToInt(Edit2.Text); Minpunkte[1]:=(maxpunktzahl/100)*96; Minpunkte[2]:=(maxpunktzahl/100)*80; Minpunkte[3]:=(maxpunktzahl/100)*60; Minpunkte[4]:=(maxpunktzahl/100)*40; Minpunkte[5]:=(maxpunktzahl/100)*20; Minpunkte[6]:=(maxpunktzahl/100)*0; StringGrid1.Cells[1,1]:=FloatToStr(Ceil(Minpunkte[1])); StringGrid1.Cells[1,2]:=FloatToStr(Ceil(Minpunkte[2])); StringGrid1.Cells[1,3]:=FloatToStr(Ceil(Minpunkte[3])); StringGrid1.Cells[1,4]:=FloatToStr(Ceil(Minpunkte[4])); StringGrid1.Cells[1,5]:=FloatToStr(Ceil(Minpunkte[5])); StringGrid1.Cells[1,6]:=FloatToStr(Ceil(Minpunkte[6])); end;
Delphi-Quellcode:
mach das:
if (schülerpunkte >= Minpunkte[1]) then Edit3.Text:='1' else
begin if (schülerpunkte >= Minpunkte[2]) then Edit3.Text:='2' else begin if (schülerpunkte >= Minpunkte[3]) then Edit3.Text:='3' else begin if (schülerpunkte >= Minpunkte[4]) then Edit3.Text:='4' else begin if (schülerpunkte >= Minpunkte[5]) then Edit3.Text:='5' else begin if (schülerpunkte >= Minpunkte[6]) then Edit3.Text:='6' else end; end; end; end; end;
Delphi-Quellcode:
if (schülerpunkte >= Minpunkte[1]) then Edit3.Text:='1'
else if (schülerpunkte >= Minpunkte[2]) then Edit3.Text:='2' else if (schülerpunkte >= Minpunkte[3]) then Edit3.Text:='3' else if (schülerpunkte >= Minpunkte[4]) then Edit3.Text:='4' else if (schülerpunkte >= Minpunkte[5]) then Edit3.Text:='5' else if (schülerpunkte >= Minpunkte[6]) then Edit3.Text:='6' else begin end; |
AW: Funktion/Prozedur abbrechen?
Oder um es kurz und knapp zu schreiben:
Delphi-Quellcode:
unit Form.Main;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; const NotenSchlüssel: array [1 .. 5] of Single = ( 96.0, 80.0, 60.0, 40.0, 20.0 ); type TForm1 = class( TForm ) Edit1: TEdit; Edit2: TEdit; Button1: TButton; Label1: TLabel; procedure Button1Click( Sender: TObject ); private {Private-Deklarationen} public {Public-Deklarationen} end; var Form1: TForm1; implementation {$R *.dfm} function GetSchulnoteFromPercent( APercent: Single ): Integer; begin // Guard if ( APercent < 0 ) or ( APercent > 100 ) then raise EArgumentOutOfRangeException.Create( 'Der Wert muss zwischen 0% und 100% liegen!' ); Result := Low( NotenSchlüssel ); repeat if APercent >= NotenSchlüssel[Result] then Exit; Inc( Result ); until Result > High( NotenSchlüssel ); end; function GetSchulnoteFromPunkte( AErreicht, AMax : Integer ) : Integer; begin // Guard if AErreicht < 0 then raise EArgumentOutOfRangeException.Create( 'Die erreichte Punktzahl darf nicht kleiner 0 sein!' ); if AMax <= 0 then raise EArgumentOutOfRangeException.Create( 'Die maximale Punktzahl darf nicht kleiner oder gleich 0 sein!' ); if AErreicht > AMax then raise EArgumentOutOfRangeException.CreateFmt( 'Die erreichte Punktzahl (%d) kann nicht größer als die maximale Punktzahl (%d) sein!', [AErreicht, AMax] ); Result := GetSchulnoteFromPercent( AErreicht / AMax * 100 ); end; procedure TForm1.Button1Click( Sender: TObject ); var LErreichtePunktZahl, LMaxPunktZahl: Integer; begin LErreichtePunktZahl := StrToInt( Edit1.Text ); LMaxPunktZahl := StrToInt( Edit2.Text ); Label1.Caption := IntToStr( GetSchulnoteFromPunkte( LErreichtePunktZahl, LMaxPunktZahl ) ); end; end. |
AW: Funktion/Prozedur abbrechen?
Zitat:
Du hast die Eingabe von negativen Werten vergessen. |
AW: Funktion/Prozedur abbrechen?
Zitat:
|
AW: Funktion/Prozedur abbrechen?
Und extrem große Zahlen?
2 Milliarden Punkte ist schon ein bissl übertrieben. Oder vielleicht war jemand soooo schlecht, daß es mehr Punktabzüge gab, als Punkte. :stupid: Also Grundsätzlich kann man das alles als eine "Prüfung auf gültige Eingabewerte (Wertebereich)" ansehn. |
AW: Funktion/Prozedur abbrechen?
Zitat:
Sind die Eingaben laut Eingabeprüfung fehlerhaft, dann sollte/muss man den Benutzer darauf aufmerksam machen. Dazu gibt man eine normale Meldung aus. Die Benutzung von Exceptions hierfür kann auch ungewollt dazu führen, dass der Benutzer dies gar nicht mitbekommt, oder eine Fehlermeldung erhält, welche nicht dem Ursprünglichen Fehler entspricht. Man stelle sich vor, dass in einer Eingabeprüfungs-Prozedur Exceptions geworfen werden, wie in Sir Rufo's Beispiel, und diese von einer anderen Prozedur aufgerufen wird in der irgendwo ein Try-Except-Block verwendet wird. |
AW: Funktion/Prozedur abbrechen?
Zitat:
Wenn man GUI und Code trennt (MVVM oder Dregleichen), dann darf/sollte man im Code schon eine Exception werfen, wenn die Eingaben "ungültig" sind. Was die GUI damit dann macht, ist ihr überlassen. * durchreichen und als Fehlermeldung anzeigen * oder abfangen und irgendwie anders auf das Problem hinweisen |
AW: Funktion/Prozedur abbrechen?
Zitat:
Denn sowas hier
Delphi-Quellcode:
ist voll daneben ... und das hier
try
foo; except end;
Delphi-Quellcode:
in einer GUI-Anwendung zeigt die Unfähigkeit/Unwissenheit des Programmierers
try
foo; except on E: Exception do ShowMessage( E.ClassName + ': ' + E.Message ); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr. |
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 by Thomas Breitkreuz