Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi procedures zusammenfassen/vereinfachen (Totale Anfängerfrae) (https://www.delphipraxis.net/103181-procedures-zusammenfassen-vereinfachen-totale-anfaengerfrae.html)

Tobicaster 11. Nov 2007 23:52


procedures zusammenfassen/vereinfachen (Totale Anfängerfrae)
 
Hallo!

Ich bin absoluter Neuling in Delphi und hab shcon gleich ne Frage, die mir fast schon peinlich ist^^



Delphi-Quellcode:
procedure TForm1.B0Click(Sender: TObject);
begin
Display.Caption := Display.Caption + (sender as TButton).Caption;
end;

procedure TForm1.B1Click(Sender: TObject);
begin
Display.Caption := Display.Caption + (sender as TButton).Caption;
end;

procedure TForm1.B2Click(Sender: TObject);
begin
Display.Caption := Display.Caption + (sender as TButton).Caption;
end;

procedure TForm1.B3Click(Sender: TObject);
begin
Display.Caption := Display.Caption + (sender as TButton).Caption;
end;

procedure TForm1.B4Click(Sender: TObject);
begin
Display.Caption := Display.Caption + (sender as TButton).Caption;
end;

procedure TForm1.B5Click(Sender: TObject);
begin
Display.Caption := Display.Caption + (sender as TButton).Caption;
end;

procedure TForm1.B6Click(Sender: TObject);
begin
Display.Caption := Display.Caption + (sender as TButton).Caption;
end;

procedure TForm1.B7Click(Sender: TObject);
begin
Display.Caption := Display.Caption + (sender as TButton).Caption;
end;

procedure TForm1.B8Click(Sender: TObject);
begin
Display.Caption := Display.Caption + (sender as TButton).Caption;
end;

procedure TForm1.B9Click(Sender: TObject);
begin
Display.Caption := Display.Caption + (sender as TButton).Caption;
end;
Wie kann ich obiges einfach und unkompliziert zusammenfassen? Danke schonmal!

Dax 11. Nov 2007 23:58

Re: procedures zusammenfassen/vereinfachen
 
Einfach allen Buttons den selben Eventhandler zuweisen.. Das mit dem Sender hast du ja schon richtig, fehlt nur noch der letzte Schritt ;)

Tobicaster 12. Nov 2007 00:16

Re: procedures zusammenfassen/vereinfachen (Totale Anfängerf
 
Ah natürlich! Leuchtet ein :wall: Danke für den Hinweis!

Gibt es auch noch eine Möglichkeit folgendes einfacher auszudrücken:

Delphi-Quellcode:
if op ='+' then
 begin
 Display.Caption := FloatToStr(Eingabe1 + Eingabe2);
 end;

if op ='-' then
 begin
 Display.Caption := FloatToStr(Eingabe1 - Eingabe2);
 end;

if op ='/' then
 begin
 Display.Caption := FloatToStr(Eingabe1 / Eingabe2);
 end;

if op ='*' then
 begin
 Display.Caption := FloatToStr(Eingabe1 * Eingabe2);
 end;
?

Flare 12. Nov 2007 00:20

Re: procedures zusammenfassen/vereinfachen (Totale Anfängerf
 
Hallo Tobicaster,

einfacher geht es nicht, aber kürzer! Schau dir dazu mal case ... of an.


Flare

Tobicaster 12. Nov 2007 00:42

Re: procedures zusammenfassen/vereinfachen (Totale Anfängerf
 
Ah ich hab's!

Delphi-Quellcode:
procedure TForm1.BGleichClick(Sender: TObject);
begin
Eingabe2 := StrToFloat(Display.Caption);

 case op of
  '+': begin
       Display.Caption := FloatToStr(Eingabe1 + Eingabe2);
       end;
  '-': begin
       Display.Caption := FloatToStr(Eingabe1 - Eingabe2);
       end;
  '*': begin
       Display.Caption := FloatToStr(Eingabe1 * Eingabe2);
       end;
  else
   try
   Display.Caption := FloatToStr(Eingabe1 / Eingabe2);
   except
   Display.Caption := 'Geht nicht!';;
   end;

 end;
end;
So scheint's zu funktionieren.

Danke!

Sharky 12. Nov 2007 06:32

Re: procedures zusammenfassen/vereinfachen (Totale Anfängerf
 
Hai Tobicaster,

ersteinmal: "Herzlich Willkommen in der Delphi-PRAXiS".

Bei deinem Code musst Du noch eines beachten. Wenn nach dem ersten durchlauf Display.Caption auf "Geht nicht!" gesetzt wird würdest Du bei einem erneuten klick auf einen der Buttons eine Exception in der Zeile
Code:
Eingabe2 := StrToFloat(Display.Caption);
bekommen.

Popov 12. Nov 2007 07:55

Re: procedures zusammenfassen/vereinfachen (Totale Anfängerf
 
Hallo Tobicaster, deinen Code hätte ich so nicht geschrieben. Der Divisor hat nichts in ELSE zu suchen. Im Endeffekt ändert sich da wohl nichts, da du wohl aufpassen wirst, aber trotzdem. Jedem Operator eine Zuweisung und überhaupt kein ELSE.

Zitat:

Zitat von Tobicaster
Delphi-Quellcode:
 case op of
    '+': ...
    '-': ...
    '*': ...
    '/': ...
  end;

Außerdem, persönlich bin ich kein Freund von try/except Missbrauch bei Programmierung. try/except ist nur für den unvorhersehbaren Fall. Eine Division durch Null sollte man selbst abfangen. Das könnte in etwa so aussehen:

Delphi-Quellcode:
    if Eingabe2 = 0 then
      Display.Caption := 'ERROR (Division durch Null)'
    else
      Display.Caption := FloatToStr(Eingabe1 / Eingabe2);
Warum willst du die Fehlermeldung dem Programm überlassen?

RavenIV 12. Nov 2007 08:16

Re: procedures zusammenfassen/vereinfachen (Totale Anfängerf
 
Zitat:

Zitat von Popov
Delphi-Quellcode:
    if Eingabe2 = 0 then
      Display.Caption := 'ERROR (Division durch Null)'
    else
      Display.Caption := FloatToStr(Eingabe1 / Eingabe2);
Warum willst du die Fehlermeldung dem Programm überlassen?

Also ich persönlich mach das immer anderstrum, den "guten" Fall zuerst und dann den "schlechten" Fall. Das find ich übersichtlicher.

Delphi-Quellcode:
    if Eingabe2 <> 0 then
    begin
      Display.Caption := FloatToStr(Eingabe1 / Eingabe2);
    end
    else
    begin
      Display.Caption := 'ERROR (Division durch Null)';
    end;

Tobicaster 12. Nov 2007 17:06

Re: procedures zusammenfassen/vereinfachen (Totale Anfängerf
 
Ah, wieder was dazu gelernt. Macht natürlich Sinn.
Aber wieso hat der Divisor nichts in ELSE zu suchen bzw. was ist der Grund dafür, dass einige Sachen nicht "missbraucht" werden sollten?

Apollonius 12. Nov 2007 17:09

Re: procedures zusammenfassen/vereinfachen (Totale Anfängerf
 
Die Division sollte in einen eigenen Fall, damit du einen Fehler ausgeben kannst, falls in Op irgendwelcher Quatsch steht. Und Exceptions sollte man nicht verwenden, wenn es auch genauso einfach ohne geht, denn Exception sind ziemlich langsam und tragen viel Overhead mit sich.

Popov 12. Nov 2007 22:11

Re: procedures zusammenfassen/vereinfachen (Totale Anfängerf
 
Apollonius hat es zwar schon geantwortet, aber ich sage es nochmal mit meinen Worten.

Letztendlich geht es hier nur um die saubere Programmierung. Die Frage ist nur ob man sein Programm zusammenbastelt oder programmiert. Das ELSE in CASE ist für den Rest, also alles was übrig bleibt und abgefangen werden soll. Nur ist der Divisor nicht der Rest, sondern eine der Operationen. Wahrscheinlich wird nichts passieren, denn wahrscheinlich wirst du nur die vier Operatoren nutzen. Deshalb wirst du zwar hier keinen Unterschied merken, aber es ist trotzdem nicht richtig. Soll alles was nicht zu den ersten drei Operatoren zugeordnet werden kann geteilt werden? Denn so kann man deinen Code lesen. Alles was mich +, - oder * ist, soll geteilt werden.

Nun zu dem Missbrauch. try/except ist dazu da um unvorhergesehene Fehler abzufangen. Wenn ich ein text in eine TMemo lade, dann kann ich es entweder mit try/except machen, oder ich frage vorher ab ob die Datei existiert? Warum also try/except nutzen wenn ich selbst prüfen kann ob eine Datei da ist. Ich kann trotzdem den Ladevorgang in try/except packen um die Fehler abzufangen die mir beim Programmieren nicht eingefallen sind. Aber ich weiß, daß es eine Datei auch nicht geben kann.

So ähnlich ist es mit Division durch Null. Ich weiß, daß der Fehler vorkommen kann. Wieso muß den Fehler erst das System feststellen, wenn ich auch selbst vorher reagieren kann? try/except solltest du übrigens für alle Operatoren nutzen, denn die Berechnungen können auch den zulässigen Maximalwert überschreiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04: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-2025 by Thomas Breitkreuz