Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Taschenrechner Problem: Record, Objekt oder Klassentyp (https://www.delphipraxis.net/139058-taschenrechner-problem-record-objekt-oder-klassentyp.html)

Ghostleader 22. Aug 2009 15:42

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Nein also = + usw sind alles Buttons.

Reihenfolge:

1.)User drückt einen Button1-9 (so oft wie er will - also das er auch zweimal Button1 drücken kann.)
2.)User drückt Button +.
3.)User drückt einen Button1-9 (so oft wie er will - also das er auch zweimal Button1 drücken kann.)
4.)User drückt Button =.
5.)Das Ergebnis wird in Label1 (Caption: Anzeige), angezeigt.

So wollte ich den Rechner haben.

Wenn der Button 2 gedrückt wird, soll die Anzeige leer sein, damit erneut etwas eingegeben werden kann.

Nicht bedacht habe ich, fällt mir gerade auf, wie das Programm sich die Zahl von Schritt 1.) merken soll. Aber das geht doch über den Arbeitspeicher (mit entsprechendem Befehl), oder nicht?

mirage228 22. Aug 2009 15:48

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Du könntest Die Zahl in einem sog. "Feld" des Formulars speichern.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    Ergebnis: TButton;
    Zahl4: TButton;
    Zahl2: TButton;
    Zahl1: TButton;
    Zahl9: TButton;
    Zahl6: TButton;
    Zahl7: TButton;
    Zahl8: TButton;
    Zahl5: TButton;
    Zahl3: TButton;
    Label2: TLabel;
    Plus: TButton;
    procedure ErgebnisClick(Sender: TObject);
  private
    { Private-Deklarationen } 
    FErsteZahl: Integer;
  public
    { Public-Deklarationen } 
  end;
Die Zahl kommt a) in den "private" Abschnitt (wir brauchen sie ja nur innerhalb des Formulars) und b) wird üblicherweise solchen Feldern ein "F" (für Feld oder engl. Field) vorangestellt.

Viele Grüße

Ghostleader 22. Aug 2009 15:53

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Button10: TButton;
    Button12: TButton;
    Label3: TLabel;
    Panel3: TPanel;
    Button4: TButton;
    Button1: TButton;
    Button7: TButton;
    Button8: TButton;
    Button5: TButton;
    Button2: TButton;
    Button3: TButton;
    Button6: TButton;
    Button9: TButton;
    Panel4: TPanel;
    Plus: TButton;
    Ergebnis: TButton;
    Label4: TLabel;
    Label5: TLabel;
    Button11: TButton;
    procedure ErgebnisClick(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FErsteZahl: Integer;
  public
    { Public-Deklarationen }
  end;
So siehts aus. (Hab noch einige Panels+Labels hinzugefügt aber nur fürs Aussehen.)
Allerdings, kommt immernoch:

[Hinweis] Taschenrechnerunit.pas(57): Auf 'Zahl1' zugewiesener Wert wird niemals benutzt
[Hinweis] Taschenrechnerunit.pas(54): Variable 'Plus' wurde deklariert aber in 'TForm1.ErgebnisClick' nicht verwendet
[Fehler] Taschenrechnerunit.pas(66): 'END' erwartet, aber ',' gefunden
[Hinweis] Taschenrechnerunit.pas(40): Das private Symbol 'FErsteZahl' wurde deklariert, aber nie verwendet
[Fataler Fehler] Taschenrechnerprojekt.dpr(5): Verwendete Unit 'Taschenrechnerunit.pas' kann nicht compiliert werden
und

Ergebnis:= Zahl1,Zahl2,Zahl3,Zahl4,Zahl5,Zahl6,Zahl7,Zahl8,Za hl9+Zahl1,Zahl2,Zahl3,Zahl4,Zahl5,Zahl6,Zahl7,Zahl 8,Zahl9;

ist dabei rot markiert.

mirage228 22. Aug 2009 16:02

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Du musst diese Variable bzw. das Feld auch benutzen.

Das mit Ergebnis, diese Zuweisung ist nicht möglich.

Schau Dir besser die Grundlagen Tutorials von dsdt.info an, dann werden Dir einige Zusammenhänge klarer sein.

Viele Grüße

Ghostleader 22. Aug 2009 16:04

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Hm das mit dem kleinen Rechner Tutorial kenne ich schon. Ich will allerdings Buttons kein Edits :)

Ich werd wohl erstmal aufhören mit dem Rechner. Nur diese Editierboxen find ich zu stupide und die Buttons krieg ich nicht auf die Reihe :).

Vielen Dank für deine große Hilfe ;).

Mit freundlichen Grüßen Ghostleader

BAMatze 22. Aug 2009 18:32

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Hallo,

also das mit den TEdit ist ja auch nur Beispielhaft. Du könntest ja einfach machen, dass wenn ein Button gedrückt wird (je nachdem ob 1, 2, 3, ...) wird das EditFeld um diese Zahl erweitert. Wenn + gedrückt wird, dann merkst du dir die Zahl (eine TStringlist wäre da Beispielsweise gut) und danach leerst du das EditFeld, damit die 2., 3., 4., ... Zahl eingegeben wird. Die TStringlist hätte den Vorteil, dass du auch mehrere Zahlen dir merken kannst ohne dir Gedanken über die Anzahl der Möglichen eingegebenen Zahlen zu machen. Bei = wird dann alles berechnet, das Ergebnis ausgegeben und die TStringList gelöscht.
So ist eigentlich heute Jeder Taschenrechner aufgebaut. Ist denke ich auch mit einem relativ geringem Aufwand umsetzbar. Wenn natürlich höhere Funktionen und komplizierte Berechnungen (z.B. Beachtung von Punkt- und Strichrechnungnen bei längeren Formeln oder Integrale) kommen, wird der Programieraufwand natürlich deutlich größer.

MfG
BAMatze

xZise 22. Aug 2009 21:29

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Du hast doch beschrieben, was du machen musst ;)

Als erstes gibt der Benutzer ein, was die erste Zahl ist.

Also machst du da einfach ganz am Anfang (du meintest Button2 würde das Zurücksetzen?) "FErsteZahl" oder wie du das genannt hattest" auf 0.
Wenn jetzt jemand auf die 1 drückt, dann willst du ja das in FErsteZahl statt 0 jetzt 1 steht. Nun könntest du einfach sagen: FErsteZahl := 1. Aber was ist, wenn man 11 haben will? Deshalb musst du das etwas erweitern ;) Und zwar kommt eine Stelle hinzu und das macht man im Dezimalsystem mit einer Multiplikation.

So jetzt wird es etwas kompilizierter. Und zwar wenn du auf einem Button (0-9) drückst dann wird im "OnClick"-Ergebnis das aufgerufen:
Delphi-Quellcode:
procedure TForm1.ButtonZifferClick(Sender : TObject);
begin
  // In Sender steht die Komponente drinne die das ausgelöst hat. Hiermit teste ich
  // ob darin ein Button steht
  if Sender is TButton then
  begin
    // Jetzt nehmen wir die Zahl mal 10
    // Also wenn wir vorher 1 hatten und jetzt die 2 gedrückt haben wollen wir ja 12
    // Und 12 ist ja: 1 * 10 + 2 also 10 * WasVorherWar + WasJetztGedrücktWurde
    FErsteZahl := FErsteZahl * 10;
    // Und ganz zum schluss musst du ja das neue Ergebnis hinzufügen
    // Dazu gucken wir, welcher Text im übergebenen Button stand (dafür das if da oben)
    FErsteZahl := FErsteZahl + StrToInt(TButton(Sender).Caption);
  end;
end;
So als nächstes solltest du noch ein Operator hinzufügen. Damit du nachher auch weißt was gedrückt wurde.
Also du hast die Buttons "+", "-", "*" und "/". Wenn man darauf klickt wird jetzt folgende Methode ausgeführt:
Delphi-Quellcode:
procedure TForm1.ButtonOperatorClick(Sender : TObject);
begin
  // In Sender steht die Komponente drinne die das ausgelöst hat. Hiermit teste ich
  // ob darin ein Button steht
  if Sender is TButton then
  begin
    // Jetzt speichern wir einfach den Operator
    FOperator := TButton(Sender).Caption[1];
    // Dazu nehme ich das erste Zeichen aus dem Text.

    // Dann die zweite Zahl zurücksetzen
    FZweiteZahl := 0;
  end else
    // Wenn im Sender kein Button stand dann den Operator "ungültig" setzen
    FOperator := #0;
end;
Damit sind wir schon fast fertig. Jetzt müssen wir den Inhalt aus ButtonZifferClick verbessern. Bisher haben wir da ja nur die erste Zahl gesetzt. Jetzt wollen wir da auch die zweite Zahl setzen. Dazu modifizieren wir den Code:
Delphi-Quellcode:
procedure TForm1.ButtonZifferClick(Sender : TObject);
begin
  if Sender is TButton then
  begin
    // NEU: Wenn der Operator "ungültig" ist, dann ändern wir die erste Zahl, ansonsten die zweite
    if FOperator = #0 then
    begin
      FErsteZahl := FErsteZahl * 10 + StrToInt(TButton(Sender).Caption);
    end else
    begin
      FZweiteZahl := FZweiteZahl * 10 + StrToInt(TButton(Sender).Caption);
    end;
  end;
end;
Ich habe dazu den Code etwas optimiert und die Kommentare raus genommen. Als letzten Schritt müssen wir dann nur noch etwas Code ausführen, wenn der "="-Button gedrückt wird:
Delphi-Quellcode:
procedure TForm1.ButtonGleichClick(Sender : TObject);
begin
  // Jetzt überprüfen wir welcher Operator gewählt wurde
  case FOperator of
    '+' : LErgebnis.Caption := IntToStr(FErsteZahl + FZweiteZahl);
    '-' : LErgebnis.Caption := IntToStr(FErsteZahl - FZweiteZahl);
    '*' : LErgebnis.Caption := IntToStr(FErsteZahl * FZweiteZahl);
    '/' : LErgebnis.Caption := FloatToStr(FErsteZahl / FZweiteZahl);
    else LErgebnis.Caption := 'Unvollständige Eingabe';
  end;
  FErsteZahl := 0;
  FZweiteZahl := 0;
  FOperator := #0
end;
So das ist jetzt nicht 100% zu übernehmen. Aber versuche bitten den Code erst zu verstehen.

MfG
xZise

PS: Anfangs war das Problem, dass du "Button.Text" hattest und auch ein Self hat da nicht geholfen :D Aber die Codevervollständigung (Strg+Leerzeichen) hilft dir da gerne!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr.
Seite 2 von 2     12   

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