![]() |
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? |
Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
Du könntest Die Zahl in einem sog. "Feld" des Formulars speichern.
Delphi-Quellcode:
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.
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; Viele Grüße |
Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
Delphi-Quellcode:
So siehts aus. (Hab noch einige Panels+Labels hinzugefügt aber nur fürs Aussehen.)
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; 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. |
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 ![]() Viele Grüße |
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 |
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 |
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:
So als nächstes solltest du noch ein Operator hinzufügen. Damit du nachher auch weißt was gedrückt wurde.
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; Also du hast die Buttons "+", "-", "*" und "/". Wenn man darauf klickt wird jetzt folgende Methode ausgeführt:
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
So das ist jetzt nicht 100% zu übernehmen. Aber versuche bitten den Code erst zu verstehen.
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; 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. |
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