Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Taschenrechner ein Editfeld (https://www.delphipraxis.net/171899-taschenrechner-ein-editfeld.html)

Bjoerk 1. Dez 2012 16:59

AW: Taschenrechner ein Editfeld
 
no problem, jedem ist eh klar, daß du dich nur vertippt hast. Wollte nur etwas abkürzen ("Wieso kommt denn da inkompatible Typen?") :-D

Beat 1. Dez 2012 17:39

AW: Taschenrechner ein Editfeld
 
Zitat:

Zitat von DeddyH (Beitrag 1193897)
Du wirst doch wissen, was eine Variable und was ein Integer ist.
Delphi-Quellcode:
var
  Operation: integer;
...
case Operation of
  1: Addieren(Zahl1, Zahl2);
  2: Subtrahieren(Zahl1, Zahl2);
  3: Multiplizieren(Zahl1, Zahl2);
  4: Dividieren(Zahl1, Zahl2);
  else
    //ungültige Operation, entsprechend reagieren
end;
Etwas lesbarer wird das mit einem eigenen Aufzählungstypen:
Delphi-Quellcode:
type
  TOperation = (opPlus, opMinus, opMal, opDurch);

var
  Operation: TOperation;
...
case Operation of
  opPlus: Addieren(Zahl1, Zahl2);
//usw. usf.

Ich will vorerst nochmal anmerekn wir haben in der Schule erst 3 Delphi Stunden gehabt :) Ihr müsst mich also wie ein Vollpfosten behandeln, sorry :D
Gut, ich bevorzuge deinen 2. Quelltext, wobei mir da noch 2 Fragen offen sind.

1. Unter type hast du TOperation, was ist das ? ein Button ist ja ein TButtoon, aber was ist eine TOperation ? :D

2. Das Case of kommt dann in den '=' Button nicht wahr ? :D


Aber danke nochmal, dass hier so großzügig geholfen wird :)

DeddyH 1. Dez 2012 18:04

AW: Taschenrechner ein Editfeld
 
Ihr sollt nach 3 Stunden bereits einen Taschenrechner schreiben? Das könnte man großzügig "ambitioniert" nennen. Das TOperation ist ein selbst definierter Datentyp, nämlich eine Aufzählung. Genauere Infos dazu solltest Du in der Delphi-Hilfe finden oder z.B. hier. Deine 2. Frage verstehe ich ehrlich gesagt nicht :gruebel:

Beat 7. Dez 2012 12:52

AW: Taschenrechner ein Editfeld
 
So bin fertig :) hier mal mein Quelltext, Punkt vor Strich wird aber nicht beachtet!

Code:
    unit Taschenrechner;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, Buttons, ImgList;

type
  TForm1 = class(TForm)

    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    Button13: TButton;
    Button14: TButton;
    Button15: TButton;
    Button16: TButton;
    Button17: TButton;
    Ausgabe: TEdit;
    Button18: TButton;
    BitBtn1: TBitBtn;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button14Click(Sender: TObject);
    procedure Button15Click(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure Button17Click(Sender: TObject);
    procedure Button18Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  zwischen : boolean;
  rz : integer ;
  Ergebnis : real;

implementation



{$R *.DFM}



procedure einlesen ;
begin
If rz = 1 then Form1.Ausgabe.Text := FloatToStr (Ergebnis + StrToFloat (Form1.Ausgabe.Text))
else
If rz = 2 then Form1.Ausgabe.Text := FloatToStr (Ergebnis - StrToFloat (Form1.Ausgabe.Text))
else
If rz = 3 then Form1.Ausgabe.Text := FloatToStr (Ergebnis * StrToFloat (Form1.Ausgabe.Text))
else
If rz = 4 then Form1.Ausgabe.Text := FloatToStr (Ergebnis / StrToFloat (Form1.Ausgabe.Text))
else
If rz = 0 then ShowMessage ('Bitte Rechnung vollenden. Sprich Zahl 1 eingeben, dann Rechenzeichen bestimmen, dann 2. Zahl eingeben und den = Button betätigen !');



end;



procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Ausgabe.text := '' ;
zwischen := false;
rz := 0 ;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     form1.Ausgabe.Text := form1.Ausgabe.Text + '1' ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     form1.Ausgabe.Text := form1.Ausgabe.Text + '2' ;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
     form1.Ausgabe.Text := form1.Ausgabe.Text + '3' ;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
     form1.Ausgabe.Text := form1.Ausgabe.Text + '4' ;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
     form1.Ausgabe.Text := form1.Ausgabe.Text + '5' ;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
     form1.Ausgabe.Text := form1.Ausgabe.Text + '6' ;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
     form1.Ausgabe.Text := form1.Ausgabe.Text + '7' ;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
     form1.Ausgabe.Text := form1.Ausgabe.Text + '8' ;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
     form1.Ausgabe.Text := form1.Ausgabe.Text + '9' ;
end;

procedure TForm1.Button11Click(Sender: TObject);
begin
     form1.Ausgabe.Text := form1.Ausgabe.Text + '0' ;
end;

procedure TForm1.Button10Click(Sender: TObject);
begin
form1.Ausgabe.text := '' ;
zwischen := false;
rz := 0 ;

end;

procedure TForm1.Button12Click(Sender: TObject);
begin
     form1.Ausgabe.Text := '';
end;

procedure TForm1.Button13Click(Sender: TObject);
begin
try
     If zwischen = true then Ausgabe.Text := FloatToStr (Ergebnis + StrToFloat (Ausgabe.Text));
        zwischen := true ;
        Ergebnis := StrToFloat (Ausgabe.Text) ;
        rz := 1 ;
        form1.Ausgabe.Text := '' ;
except Showmessage ('Bitte 2 oder mehr Zahlen addieren !');
end;
end;

procedure TForm1.Button14Click(Sender: TObject);
begin
try
   If zwischen = true then Ausgabe.Text := FloatToStr (Ergebnis - StrToFloat (Ausgabe.Text));
      zwischen := true ;
      Ergebnis := StrToFloat (Ausgabe.Text) ;
      rz := 2 ;
      form1.Ausgabe.Text := '' ;
except Showmessage ('Bitte 2 oder mehr Zahlen subtrahieren !')
end;
end;

procedure TForm1.Button15Click(Sender: TObject);
begin
try
   If zwischen = true then Ausgabe.Text := FloatToStr (Ergebnis * StrToFloat (Ausgabe.Text));
      zwischen := true ;
      Ergebnis := StrToFloat (Ausgabe.Text) ;
      rz := 3 ;
      form1.Ausgabe.Text := '' ;
except ShowMessage (' Bitte 2 oder mehr Zahlen mutliplizieren !');
end;
end;

procedure TForm1.Button16Click(Sender: TObject);
begin
try
     If zwischen = true then Ausgabe.Text := FloatToStr (Ergebnis / StrToFloat (Ausgabe.Text));
        zwischen := true ;
        Ergebnis := StrToFloat (Ausgabe.Text) ;
        rz := 4 ;
        form1.Ausgabe.Text := '' ;
except ShowMessage (' Bitte 2 oder mehr Zahlen miteinander divideren !');
end;
end;

procedure TForm1.Button17Click(Sender: TObject);
begin
einlesen

end;

procedure TForm1.Button18Click(Sender: TObject);
begin
form1.Ausgabe.Text := form1.Ausgabe.Text + ',' ;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ShowMessage ('Vielen Dank, dass sie unseren Taschenrechner benutzt haben !');
Close

end;

end.

p80286 7. Dez 2012 13:12

AW: Taschenrechner ein Editfeld
 
Wenn ich ehrlich bin, bezweifle ich, daß der Taschenrechner richtig funktioniert, - wofür ist "zwischen" gut?
Delphi-Quellcode:
procedure TForm1.Button13Click(Sender: TObject);
begin
try
     If zwischen = true then Ausgabe.Text := FloatToStr (Ergebnis + StrToFloat (Ausgabe.Text));
        zwischen := true ;
        Ergebnis := StrToFloat (Ausgabe.Text) ;
        rz := 1 ;
        form1.Ausgabe.Text := '' ;
except Showmessage ('Bitte 2 oder mehr Zahlen addieren !');
end;
end;
Delphi-Quellcode:
procedure TForm1.Button13Click(Sender: TObject);
begin
  try
    If zwischen then
      Ausgabe.Text := FloatToStr (Ergebnis + StrToFloat (Ausgabe.Text));
    zwischen := true ;
    Ergebnis := StrToFloat (Ausgabe.Text) ;
    rz := 1 ;
    Ausgabe.Text := '' ;
  except
    Showmessage ('Bitte 2 oder mehr Zahlen addieren !');
  end;
end;
Ein wenig formatieren, das nicht auszurottende "if irgendwas=true then" berichtigt, und schon ist das alles etwas lesenswerter.

Gruß
K-H

Popov 7. Dez 2012 13:40

AW: Taschenrechner ein Editfeld
 
Hättest du den Komponenten aussagekräftige Namen gegeben, man könnte leichter nachvollziehen was wofür ist.

Ich hab auch mal paar Taschenrechner am Anfang geprogt und hab sogar einen der Punkt vor Strichrechnung beachtet, finde den aber im Archiv nicht. Vielleicht ist es auf einer der anderen CDs.

Was ich aber gefunden habe ist mein alter Ein-Prozedur-Taschenrechner für ein Editfeld. Allerdings keine Punkt vor Strichrechnung. Ich glaube sonst hat er funktioniert.

Aber vielleicht ist es gut für paar Anregungen.

Delphi-Quellcode:
{                  --== Ein-Prozedur Taschenrechner ==--                       }
{           Hinweis: befolgt nicht die Punkt vor Strich Regel                 }
var
  Mem1, Mem2: Extended;
  LastOpKey: Char;

{Mögliche Tasten: "0123456789" und ",", dann "+-*/", "c", "=", alternativ Enter}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  Edit: TEdit;
begin
  {Dies und das}
  Edit := Edit1;
  if Key = #13 then Key := '=';

  {Clear}
  if Key = 'c' then
  begin
    Edit.Text := FloatToStr(0);
    Edit.SelStart := Length(Edit.Text); //setzt Cursor an Editfeld Ende
    Mem2 := 0;
    LastOpKey := #0;
    Key := #0;
    Exit;
  end;

  {Rechnen}
  if Key in ['+', '-', '*', '/', '='] then
  begin
    {Änderung des Operators (Operatorkorrektur)}
    if not Edit.Modified then
    begin
      LastOpKey := Key;
      Key := #0;
      Exit;
    end;
    {bedeutet, daß Opperator eigegeben wurde und vor der nächsten Zahleeingabe
    Edit-Feld gelöscht werden muß. Wird auch für Operatorkorrektur genutzt}
    Edit.Modified := False;

    {altuelle Zahl aus Editfeld holen}
    Mem1 := StrToFloat(Edit.Text);

    case LastOpKey of
    '+': Mem1 := Mem2 + Mem1;
    '-': Mem1 := Mem2 - Mem1;
    '*': Mem1 := Mem2 * Mem1;
    '/': Mem1 := Mem2 / Mem1;
    else
      Mem2 := Mem1;
      LastOpKey := Key;
      Key := #0;
      Exit;
    end;

    {Ergebnis und Zwischenergebns in Editfeld zurückschreiben}
    Edit.Text := FloatToStr(Mem1);
    Edit.SelStart := Length(Edit.Text);

    {auf nächste Zahlen-Eingabe verbreiten}
    Mem2 := Mem1;
    if Key <> '=' then LastOpKey := Key else LastOpKey := #0;
    Key := #0;
    Exit;
  end;

  {Zahlen Filtern}
  if not (Key in [#8, '0'..'9', ',']) then Key := #0;
  {Löscht Editinhalt nach Operatoreingabe, bei neuen Zahleingabe}
  if not Edit.Modified then Edit.Text := '';
end; {Popov}

Beat 7. Dez 2012 14:53

AW: Taschenrechner ein Editfeld
 
Zitat:

Zitat von p80286 (Beitrag 1194659)
Wenn ich ehrlich bin, bezweifle ich, daß der Taschenrechner richtig funktioniert, - wofür ist "zwischen" gut?
Delphi-Quellcode:
procedure TForm1.Button13Click(Sender: TObject);
begin
try
     If zwischen = true then Ausgabe.Text := FloatToStr (Ergebnis + StrToFloat (Ausgabe.Text));
        zwischen := true ;
        Ergebnis := StrToFloat (Ausgabe.Text) ;
        rz := 1 ;
        form1.Ausgabe.Text := '' ;
except Showmessage ('Bitte 2 oder mehr Zahlen addieren !');
end;
end;

Delphi-Quellcode:
procedure TForm1.Button13Click(Sender: TObject);
begin
  try
    If zwischen then
      Ausgabe.Text := FloatToStr (Ergebnis + StrToFloat (Ausgabe.Text));
    zwischen := true ;
    Ergebnis := StrToFloat (Ausgabe.Text) ;
    rz := 1 ;
    Ausgabe.Text := '' ;
  except
    Showmessage ('Bitte 2 oder mehr Zahlen addieren !');
  end;
end;
Ein wenig formatieren, das nicht auszurottende "if irgendwas=true then" berichtigt, und schon ist das alles etwas lesenswerter.

Gruß
K-H

1. Ganz einfach. Zwischen habe ich eingebaut, damit man mehrere mal hintereinander addieren kann. Sprich Falls (If) zwischen schon bestimmt wurde (= true), dann soll man die alte abgespeicherte Zahl mit der neuen addieren (Ausgabe.Text := FloatToStr (Ergebnis + StrToFloat (Ausgabe.Text));). Ich konnte es nicht anders formulieren ;)

2.
Mhh, was ist denn an dem "if irgendwas=true then" so schlimm ? :D

implementation 7. Dez 2012 14:56

AW: Taschenrechner ein Editfeld
 
Zitat:

Zitat von Beat (Beitrag 1194681)
Mhh, was ist denn an dem "if irgendwas=true then" so schlimm ? :D

Dass man es besser so schreiben kann:
Delphi-Quellcode:
if irgendwas then ...


Mit =true kann man unter Umstaenden grosse Probleme bekommen, die man dann schwer wieder findet.

Popov 7. Dez 2012 15:44

AW: Taschenrechner ein Editfeld
 
Zitat:

Zitat von Beat (Beitrag 1194681)
Mhh, was ist denn an dem "if irgendwas=true then" so schlimm ? :D

An für sich nichts, mal davon abgesehen, dass man mit der Zeit p80286's Variante übersichtlicher findet. Bei Delphi ist das die Typische Variante, (fast) jeder macht es so.

Zufällig gab es die Tage eine Diskussion dazu. Man kann sagen, dass deine Variante gegen True zu prüfen an für sich nicht schlimm ist, solange du nur Delphifunktionen nutzt. Wenn du aber irgendwann mit API oder einigen DLLs usw. arbeitest, kann es passieren, dass es zu Problemen kommen wird. Denn andere Sprachen liefern u. U. andere Werte für True (bei Delphi ist es -1), so dass der Vergleich gegen True u. U. nicht klappen wird. Wenn also eine Delphifremde Funktion für True eine 1 liefert und Delphi unter True -1 versteh, dann wird der Vergleich nicht klappen. Wenn du aber nicht gegen True prüfst, betrachtet Delphi alles was nicht False ist als True, auch eine 3.

Aber wie gesagt, solange du nur Delphi Funktionen nutzt ist es gehopst wie gesprungen ob du es so oder so machst.

Bummi 7. Dez 2012 16:05

AW: Taschenrechner ein Editfeld
 
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

  Function WithTrue:Boolean;
    begin
      Result := Boolean(2);
    end;

begin
  try
    if WithTrue then Writeln('OK 1');
    if WithTrue = true then Writeln('OK 2');
    Readln;

    { TODO -oUser -cConsole Main : Code hier einfügen }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:47 Uhr.
Seite 3 von 4     123 4      

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