Delphi-PRAXiS

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 14:56


Taschenrechner Problem: Record, Objekt oder Klassentyp
 
[Fehler] Unit1.pas(43): Record, Objekt oder Klassentyp erforderlich

Das ist der Fehler den ich immer erhalte.
Mein Programm soll ein Taschenrechner werden, so wie der von Windows (,allerdings ersteinmal nur mit den Funktionen +,=.)
Ich habe schon Buttons hinzugefügt: 1-9.
Mein Delphi Code lautet wie folgt: (Ist noch nicht fertig, da ich beim testen schon jetzt den Fehler bekam.)

Delphi-Quellcode:
unit Unit1;

interface

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

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 }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ErgebnisClick(Sender: TObject);
var
   Zahl1,Zahl2,Zahl3,Zahl4,Zahl5,Zahl6,Zahl7,Zahl8,Zahl9,Plus,Ergebnis: integer;
begin
Zahl1:= StrtoInt (Zahl1.text);
Zahl2:= StrToInt (Zahl2.text);

end;

end.
(Ich habe
Zahl1:= StrtoInt (Zahl1.text);
Zahl2:= StrToInt (Zahl2.text);
geschrieben, weil ich nicht wusste was ich bei Buttons, anstelle von .text schreiben sollte.)

Meine Buttons heißen Zahl1-Zahl9 (Button1: Zahl1 und Caption 1, Button2: Zahl2 und Caption 2 usw.)
Außerdem habe ich ein Label (Label1) mit der Caption: "Anzeige".
Dazu noch ein "+"Button und ein "=" Button.

Ich hoffe ihr könnt mir helfen wie ich es hinbekommen kann, dass wenn auf den Button1 mit der Caption 1 geklickt wird auf der Anzeige (Label1),
die Zahl 1 erscheint. (!Mit den anderen Zahlen genauso!) Wenn die Zahl fertig ist, soll auf "+" gedrückt werden können und mann soll eine neue Zahl eingeben.
Sobald alles fertig ist soll auf "=" geklickt werden können und das Ergebnis soll in der Anzeige stehen.

Mit freundlichen Grüßen,
Ghostleader/Michael

mirage228 22. Aug 2009 14:58

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

Der Compiler weiß nicht, ob Du die Integer-Variable oder den Button meinst, da sie den gleichen Namen haben (und wird immmer die lokale Variable versuchen zu verwenden). Um den zu entgegnen könntest Du
Delphi-Quellcode:
Zahl8 := StrToInt(Self.Zahl8.Text);
oder deine Buttons anders (ergo: besser) benennen.

Viele Grüße

Ghostleader 22. Aug 2009 15:04

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Also wenn ich jetzt eingebe:

Delphi-Quellcode:
procedure TForm1.ErgebnisClick(Sender: TObject);
var
   Zahl1,Zahl2,Zahl3,Zahl4,Zahl5,Zahl6,Zahl7,Zahl8,Zahl9,Plus,Ergebnis: integer;
begin
Zahl1:= StrtoInt (Self.Zahl1.text);
Zahl2:= StrToInt (Self.Zahl2.text);
Bleibt das Problem dasselbe. Ich hoffe ich hab dich falsch verstanden :D.
Was meinst du mit Button besser benennen? Ist das Problem nicht dasselbe wenn ich die Buttons jetzt, Button1-9 lassen würde und es dann so aussehen würde:

Delphi-Quellcode:
procedure TForm1.ErgebnisClick(Sender: TObject);
var
   Button1, Button2, Button3, Button4, Button5, Button6, Button7, Button8, Button9, Plus,Ergebnis: integer;
   
begin
Button1:= StrtoInt (Self.Button1.text);
Button2:= StrToInt (Self.Button2.text);
end;
Danke für die schnelle Antwort.
Mfg, Ghostleader

mirage228 22. Aug 2009 15:07

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Nenne die Buttons Button1 bis Button9 und in der Methode nennst Du die Variablen Zahl1 bis Zahl9. Problem gelöst :)
Delphi-Quellcode:
Zahl1 := StrToInt(Button1.Caption);

Ghostleader 22. Aug 2009 15:08

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Danke es funktioniert. :)

Ich hatte dich also falsch verstanden :D

Mfg Ghostleader

mirage228 22. Aug 2009 15:10

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

Zitat von Ghostleader
Danke es funktioniert. :)

Ich hatte dich also falsch verstanden :D

Kein Ding ...
Du hattest mich schon richtig verstanden, ich hatte lediglich vermutet, dass ein "Self." davor das Problem löst, aber dem war in diesem Fall wohl doch nicht so :)

Ghostleader 22. Aug 2009 15:19

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
So nächstes Problem.
Ich hatte erst ein wenig selber versuchen wollen es zu lösen aber ich schaff es einfach nicht. (Zu wenig Vorkentnisse?)

Delphi-Quellcode:
procedure TForm1.ErgebnisClick(Sender: TObject);
var
   Zahl1,Zahl2,Zahl3,Zahl4,Zahl5,Zahl6,Zahl7,Zahl8,Zahl9,Plus,Ergebnis: integer;

begin
Zahl1 := StrToInt(Button1.Caption);
Zahl2 := StrToInt(Button2.Caption);
Zahl3 := StrToInt(Button3.Caption);
Zahl4 := StrToInt(Button4.Caption);
Zahl5 := StrToInt(Button5.Caption);
Zahl6 := StrToInt(Button6.Caption);
Zahl7 := StrToInt(Button7.Caption);
Zahl8 := StrToInt(Button8.Caption);
Zahl9 := StrToInt(Button9.Caption);
Ergebnis:= Zahl1,Zahl2,Zahl3,Zahl4,Zahl5,Zahl6,Zahl7,Zahl8,Zahl9+Zahl1,Zahl2,Zahl3,Zahl4,Zahl5,Zahl6,Zahl7,Zahl8,Zahl9;
Label1.Caption:= IntToStr (Ergebnis);
end;
Mein Problem:
Ich kann ja nicht einfach schreiben:

Ergebnis:= Zahl1+Zahl2;

Da ja sonst nicht die restlichen Möglichkeite (zb.: Zahl1+Zahl8) nicht mitprogrammiert wären.
Allerdings glaube ich nicht, das man jede Möglichkeit selber aufschreiben müsste, also
Ergebnis:= zahl1+zahl2;
Ergebnis:= zahl1+Zahl3;
usw.

Ich hatte mir also gedacht es sollte so funktionieren:

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

Aber dem ist nicht so. Weiß jemand wie ich das jetzt ändern muss, damit alle Möglichkeiten genutzt werden können?

Mfg Ghost

mirage228 22. Aug 2009 15:23

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Dein Ergebnis setzt sich doch aus den beiden Labels zusammen, die vorher durch Drücken von 2 Buttons belegt wurden oder?
Dann könntest Du ja einfach Label1.Caption und Label2.Caption abgreifen und diese Addieren... vergiss aber nicht zu schauen, ob die Labels belegt sind oder nicht :)

Ghostleader 22. Aug 2009 15:30

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Wie meinst du das:
"Label1.Caption und Label2.Caption abgreifen und addieren." ?

Ich hab nur den Label1:

Anzeige

Und dann noch einen Label2 den ich aber nur zum Design benötige :D.

mirage228 22. Aug 2009 15:37

Re: Taschenrechner Problem: Record, Objekt oder Klassentyp
 
Achso ich dachte du hättest 2 Labels für 2 Summanden (und ein drittes fürs Ergebnis) ;)

Also wie ist dann der genaue Ablauf?

1.) User drückt einen der 9 Buttons für die erste Zahl
2.) User drückt Operator (Plus, Minus, ...)
3.) User drückt weiteren Button für zweite Zahl und das Ergebnis wird berechnet.

und in 1.) bis 3.) wird dann halt noch zwischen durch die Anzeige aktualisiert.

Wie hattest Du denn bisher vor gehabt dir die erste Zahl und den Operator zu merken, damit Du bei der Eingabe der zweiten Zahl das Ergebnis berechnen kannst. Da gäbe es ja mehrere Realisierungsoptionen...

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 01:50 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