Hallo,
Zitat:
Was sind private declarations?
OOP kennt unterschiedliche Zugriffs- bzw. Sichtbarkeitsdeklarationen für Eigenschaften und Methoden innerhalb einer Klasse. Schön beschrieben (wie auch von Frank schon verlinkt) ist es z. B.
hier und etwas ausführlicher
hier
Zitat:
Wie kann die Prozedur Reset ausgeführt werden, wenn das Ausführen in Button1 gar nicht erwähnt wird?
Na ja, es ist schon möglich die Methode Reset in Button1Click aufzurufen. Dazu müsste allerdings geprüft werden, ob das Ende der Spielrunde erreicht ist. Also irgendwie so:
Delphi-Quellcode:
if FCurrentExercise > FMaxExercises then
Reset
Wobei FMaxExcerises der Anzahl an Übungsrunden entspräche. Einfacher ist es doch die Methode im OnClick-Ereignis der Schaltfläche "Los" abzuarbeiten.
Zitat:
Kann ich ohne Probleme das Rechenzeichen, also * mit einer Variable Zufällig duch +, -, DIV austauschen?
Klar geht das. Dazu eignet sich z. B. Aufzählungstypen (oder ein Konstanten-Array) und Random. Also als Ansatz z. B. so (ist nicht getestet, nur im Notepad runtergetippt):
Delphi-Quellcode:
type
TOperator = (opPlus, opMult, opMinus, opDiv);
TForm1 = class (TForm)
edtResidual : TEdit; // Die Eingabemöglichkeit für den Divisionsrest. Müsstest Du halt noch auf Deinem Form einfügen
procedure FormCreate (Sender : TObject);
procedure Button1Click (Sender : TObject);
procedure Button2Click (Sender : TObject); // Der Button mit der Beschriftung "Los"
private
FCorrectAnswers : Integer;
FCurrentExercise : Integer;
FCurrentOperator : TOperator;
FMaxExcerises : Integer;
procedure DoAddUp;
procedure DoDevide;
procedure DoMultiply;
procedure DoSubtract;
procedure InitExercise;
procedure InitOperator;
procedure Reset;
end;
implementation
procedure TForm1.FormCreate (Sender : TObject);
begin
Reset
end;
procedure TForm1.Button1Click (Sender : TObject);
begin
case FCurrentOperator of
opPlus : DoAddUp;
opMult : DoMultiply;
opMinus : DoSubstract;
opDiv : DoDivide;
end;
panel5.caption := IntToStr (FCorrectAnwsers);
Inc (FCurrentExercise);
if FCurrentExercise <= FMaxExcerises then
InitExercise
end;
procedure TForm1.Button2Click (Sender : TObject);
begin
Reset;
InitExercise
end;
procedure TForm1.DoAddUp;
var
a, b, c : Integer;
begin
a := StrToInt (zahla.Caption);
b := StrToInt (zahlb.Caption);
c := StrToInt (zahlc.Caption);
if a + b = c then
Inc (FCorrectAnwsers)
end;
// Hier mal ganzzahlige Division mit Rest
procedure TForm1.DoDevide;
var
a, b, c, r : Integer;
begin
a := StrToInt (zahla.Caption);
b := StrToInt (zahlb.Caption);
c := StrToInt (zahlc.Caption);
r := StrToInt (edtResidual.Text);
if (a div b = c) and (a mod b = r) then
Inc (FCorrectAnwsers)
end;
procedure TForm1.DoMultiply;
var
a, b, c : Integer;
begin
a := StrToInt (zahla.Caption);
b := StrToInt (zahlb.Caption);
c := StrToInt (zahlc.Caption);
if a * b = c then
Inc (FCorrectAnwsers)
end;
procedure TForm1.DoSubtract;
var
a, b, c : Integer;
begin
a := StrToInt (zahla.Caption);
b := StrToInt (zahlb.Caption);
c := StrToInt (zahlc.Caption);
if a - b = c then
Inc (FCorrectAnwsers)
end;
procedure TForm1.InitExercise;
begin
zahla.Caption := IntToStr (Random (area_n));
zahlb.Caption := IntToStr (Random (area_n));
zahlc.Caption := '';
edtResidual.Text := '';
InitOperator;
FMaxExcerises := // hier muss noch die Zuweisung Deiner Komponente Anzahl Runden gemacht werden
end;
procedure TForm1.InitOperator;
begin
FCurrentOperator := TOperator (Random (4));
case FCurrentOperator of
opPlus : PanelX.Caption := '+'; // kann nicht erkennen von welchem Typ die Komponente ist und wie sie heißt
opMult : PanelX.Caption := '*';
opMinus : PanelX.Caption := '-';
opDiv : PanelX.Caption := '/';
end
end;
procedure TForm1.Reset;
begin
FCorrectAnswers := 0;
FCurrentExercise := 1
end;
Vielleicht kannst Du was damit anfangen. Die Methode DoDevide kannst Du natürlich auch mit fixen Kommastellen (z. B. auf 4 Stellen genau) im Ergebnis umschreiben (so zur Übung).
Zitat:
Muss ich die andere Methode aufgeben?
Musst Du natürlich nicht! Für mich wäre es allerdings der Ansatz: Warum einfach, wenn es auch umständlich geht.
Zitat:
Also wäre die andere Methode zu kompliziert für mich? Sinn und Zweck ist ja, dass ich Übung bekommen will.
Wenn Du mit Arrays (statisch und dynamisch) Übung bekommen willst, dann versuch Dich doch mal an den Klassikern; implementier zur Übung mal verschiedene Sortierverfahren (zunächst statisch, danach mit dynamischen Arrays).
Gruß