Autor Beitrag
SkyX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win Xp
Delphi 2007 Prof
BeitragVerfasst: Mo 17.11.08 20:16 
Servuz,
Ich muss momentan ein Programm in der Schule schreiben, habe jetzt auch länger gefehlt und brauche auch unbedingt Tips von euch wie ich mich in Delphi Programmierung und OOP verbessern könnte!
Aber erstmals zu dem Programm selbst, kann sein das es noch nicht ganz fertig ist:
unit Note
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
unit Unit_Noten;

interface

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

type
   TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edi_Anzahl: TEdit;
    Edit_Schnitt: TEdit;
    Bu_Eingabe: TButton;
    Bu_Ende: TButton;
    Bu_Clear: TButton;
    procedure Bu_EingabeClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Bu_EndeClick(Sender: TObject);
    procedure Bu_ClearClick(Sender: TObject);
  private

    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Noten :TNoten;
  Anzahl: Integer;

implementation

{$R *.DFM}

procedure TForm1.Bu_EingabeClick(Sender: TObject);
var NotenString: string;
    i: word;
begin
  {begin        Hier will er mir keine Showmessage machen weil er sich bei then aufhängt
  If Edi_Anzahl.Text:= '' then
  showmessage('Bitte Eingabe tätigen')  ;
  else }

  Anzahl:= StrToInt(Edi_Anzahl.text);
  //end;

  for i:= 1 to Anzahl do
  begin
    if InputQuery('Noteneingabe',IntToStr(i)+'. Note:',NotenString)
    then Noten.SetNoten(StrToInt(NotenString));Nicht genügend Parameter Laut Delphi
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  edi_Anzahl.setfocus;
end;

procedure TForm1.Bu_EndeClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.Bu_ClearClick(Sender: TObject);
begin
  edi_Anzahl.clear;
  edi_Anzahl.setfocus;
  Edit_Schnitt.clear;
end;

end.


Unit_Klasse
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
unit Klasse_Noten;

interface

type
 TNoten = class(TObject)
 private
   FAnzahl:Integer;
   FSchnitt:single;
   FNoten: array of integer;
 public
   procedure BerechneSchnitt;
   function GetSchnitt(Position:integer):integer;
   procedure SetNoten(Position,Noten:Integer);
   constructor Create (Anzahl:integer);
 end;

implementation

constructor TNoten.Create(Anzahl:Integer);
begin
  inherited create;
  FAnzahl:= Anzahl;
  SetLength(FNoten,FAnzahl);
end;

Procedure TNoten.SetNoten(Position,Noten:Integer);
 begin
   FNoten[Position]:= Noten;
 end;

procedure TNoten.BerechneSchnitt;
var summe,i : integer;
 begin
   summe:= 0;
   For i:= 0 to FAnzahl -1 do Summe := Summe + FNoten[i];
   FSchnitt := Summe/FAnzahl;
 end;




function TNoten.GetSchnitt(Position:Integer):Integer;
begin
  Result:=FNoten[Position];
end;

end.


Schonmal Danke

Moderiert von user profile iconAXMD: Quote- durch Delphi-Tags ersetzt
Moderiert von user profile iconAXMD: Color- durch Highlight-Tags ersetzt
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 17.11.08 20:22 
Zitat:
ausblenden Delphi-Quelltext
1:
If Edi_Anzahl.Text:= '' then					

Du versuchst, in einem Vergleich eine Zuweisung zu machen. Richtig hieße es
If Edi_Anzahl.Text = '' then.
Und SetNoten erwartet 2 Parameter
Zitat:
procedure SetNoten(Position,Noten:Integer);
, Du willst aber nur einen übergeben.
SkyX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win Xp
Delphi 2007 Prof
BeitragVerfasst: Mo 17.11.08 20:33 
Zitat:
If Edi_Anzahl.Text:= '' then

Wurde abgeändert und kam mir grad im Sinn da war damals doch was im untericht mit dem if, then und else!
Und wie mache ich das mit SetNoten?
Habe gerade ausprobiert wie man es machen könnte, aber keine Ahnung, da ich ja auch mit Array arbeite!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 17.11.08 20:36 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
for i:= 1 to Anzahl do
  begin
    if InputQuery('Noteneingabe',IntToStr(i)+'. Note:',NotenString)
    then Noten.SetNoten(i - 1,StrToInt(NotenString)); //Position mit angeben
  end;
SkyX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win Xp
Delphi 2007 Prof
BeitragVerfasst: Mo 17.11.08 20:43 
Funktioniert so auch mit dem Starten, jedoch bleibt er dann bei steckern!
ausblenden Delphi-Quelltext
1:
FNoten[Position]:= Noten;					


Zeigt mir auch nichts an wo ein Fehler sein könnte! Bin Schritt für Schritt durch gegangen mit F7.
Einloggen, um Attachments anzusehen!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 17.11.08 20:57 
Ist das oben der gesamte Quelltext oder nur ein Auszug? Wenn das der komplette ist, musst Du die Noten-Klasse ja erst noch erzeugen.

[edit] Setz mal ins TForm1.Bu_EingabeClick ein Noten := TNoten.Create(Anzahl);, bevor Du in die Schleife gehst.[/edit]
SkyX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win Xp
Delphi 2007 Prof
BeitragVerfasst: Mo 17.11.08 21:17 
Hier nochmals den Aktuellen Delphi Quellcode! Form Create habe ich jetzt gemacht meckert aber wieder nicht genügend wirkliche parameter vorhanden
Unit_Noten
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
unit Unit_Noten;

interface

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

type
   TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edi_Anzahl: TEdit;
    Edit_Schnitt: TEdit;
    Bu_Eingabe: TButton;
    Bu_Ende: TButton;
    Bu_Clear: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Bu_EingabeClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Bu_EndeClick(Sender: TObject);
    procedure Bu_ClearClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private

    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Noten :TNoten;
  Anzahl: Integer;

implementation

{$R *.DFM}

procedure TForm1.Bu_EingabeClick(Sender: TObject);
var NotenString: string;
    i: word;
begin
  begin
  If Edi_Anzahl.Text = '' then
  showmessage('Bitte Eingabe tätigen')  
  else
  Anzahl:= StrToInt(Edi_Anzahl.text);
  end;

  for i:= 1 to Anzahl do
  begin
    if InputQuery('Noteneingabe',IntToStr(i)+'. Note:',NotenString)
    then Noten.SetNoten(i-1,StrToInt(NotenString));
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  edi_Anzahl.setfocus;
end;

procedure TForm1.Bu_EndeClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.Bu_ClearClick(Sender: TObject);
begin
  edi_Anzahl.clear;
  edi_Anzahl.setfocus;
  Edit_Schnitt.clear;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Noten:= TNoten.create; //<span style="color: green">nicht genügend wirkliche parameter Fehler</span>
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Noten.Destroy;
end;

end.

Klasse_Noten
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
unit Klasse_Noten;

interface

type
 TNoten = class(TObject)
 private
   FAnzahl:Integer;
   FSchnitt:single;
   FNoten: array of integer;
 public
   procedure BerechneSchnitt;
   function GetSchnitt(Position:integer):integer;
   procedure SetNoten(Position,Noten:Integer);
   constructor Create (Anzahl:integer);
 end;

implementation

constructor TNoten.Create(Anzahl:Integer);
begin
  inherited create;
  FAnzahl:= Anzahl;
  SetLength(FNoten,FAnzahl);
end;

Procedure TNoten.SetNoten(Position,Noten:Integer);
 begin
   FNoten[Position]:= Noten;
 end;

procedure TNoten.BerechneSchnitt;
var summe,i : integer;
 begin
   summe:= 0;
   For i:= 0 to FAnzahl -1 do Summe := Summe + FNoten[i];
   FSchnitt := Summe/FAnzahl;
 end;




function TNoten.GetSchnitt(Position:Integer):Integer;
begin
  Result:=FNoten[Position];
end;

end.


EDIT:
So habe mal deinen Vorschlag ausprobiert, er startet aber bringt wieder den selben Fehler bei FNoten[Position]:= Noten;
Und meine neue Methode mit Form Create habe mal nacht Note.Create(Anzahl); gesetzt und startet auch ohne Probleme, aber selber Fehler wie oben!
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: Mo 17.11.08 21:30 
user profile iconSkyX hat folgendes geschrieben Zum zitierten Posting springen:
Hier nochmals den Aktuellen Delphi Quellcode! Form Create habe ich jetzt gemacht meckert aber wieder nicht genügend wirkliche parameter vorhanden
Unit_Noten
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
unit Unit_Noten;
{...}
  for i:= 1 to Anzahl do
  begin
    if InputQuery('Noteneingabe',IntToStr(i)+'. Note:',NotenString)
    then Noten.SetNoten(i-1,StrToInt(NotenString));
  end;
{..}

Klasse_Noten
ausblenden Delphi-Quelltext
1:
2:
3:
4:
unit Klasse_Noten;
{...}
   For i:= 0 to FAnzahl -1 do Summe := Summe + FNoten[i];
{...}


EDIT:
So habe mal deinen Vorschlag ausprobiert, er startet aber bringt wieder den selben Fehler bei FNoten[Position]:= Noten;
Und meine neue Methode mit Form Create habe mal nacht Note.Create(Anzahl); gesetzt und startet auch ohne Probleme, aber selber Fehler wie oben!


Dynamische Arrays beginnen immer bei 0!

mfg
SkyX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win Xp
Delphi 2007 Prof
BeitragVerfasst: Mo 17.11.08 21:51 
user profile iconLexXis hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconSkyX hat folgendes geschrieben Zum zitierten Posting springen:
Hier nochmals den Aktuellen Delphi Quellcode! Form Create habe ich jetzt gemacht meckert aber wieder nicht genügend wirkliche parameter vorhanden
Unit_Noten
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
unit Unit_Noten;
{...}
  for i:= 1 to Anzahl do
  begin
    if InputQuery('Noteneingabe',IntToStr(i)+'. Note:',NotenString)
    then Noten.SetNoten(i-1,StrToInt(NotenString));
  end;
{..}

Klasse_Noten
ausblenden Delphi-Quelltext
1:
2:
3:
4:
unit Klasse_Noten;
{...}
   For i:= 0 to FAnzahl -1 do Summe := Summe + FNoten[i];
{...}


EDIT:
So habe mal deinen Vorschlag ausprobiert, er startet aber bringt wieder den selben Fehler bei FNoten[Position]:= Noten;
Und meine neue Methode mit Form Create habe mal nacht Note.Create(Anzahl); gesetzt und startet auch ohne Probleme, aber selber Fehler wie oben!


Dynamische Arrays beginnen immer bei 0!

mfg


Bei unit_Noten habe ich es abgeändert! Jedoch bleibt er noch immer an der selben Stelle hängen mit dem Fehler!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 18.11.08 09:28 
LexXis hat folgendes geschrieben:
Dynamische Arrays beginnen immer bei 0!

Deshalb steht da ja auch i - 1.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.Bu_EingabeClick(Sender: TObject);
var NotenString: string;
    i: word;
begin
  If Edi_Anzahl.Text = '' then
    showmessage('Bitte Eingabe tätigen')  
  else
    Anzahl:= StrToInt(Edi_Anzahl.text);

  Noten := TNoten.Create(Anzahl);

  for i:= 1 to Anzahl do
  begin
    if InputQuery('Noteneingabe',IntToStr(i)+'. Note:',NotenString)
    then Noten.SetNoten(i-1,StrToInt(NotenString));
  end;
end;


Allerdings vermisse ich den Code zur Freigabe des angeforderten Speichers in der Klasse Noten.
SkyX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win Xp
Delphi 2007 Prof
BeitragVerfasst: Di 18.11.08 15:50 
So habe es ergänzt, und bemerkungen stehen drinnen im Quellcode:
Scheint noch nicht sauber zu arbeiten!
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
unit Unit_Noten;

interface

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

type
   TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edi_Anzahl: TEdit;
    Edit_Schnitt: TEdit;
    Bu_Eingabe: TButton;
    Bu_Ende: TButton;
    Bu_Clear: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Bu_EingabeClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Bu_EndeClick(Sender: TObject);
    procedure Bu_ClearClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private

    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Noten :TNoten;
  Anzahl: Integer;

implementation

{$R *.DFM}

procedure TForm1.Bu_EingabeClick(Sender: TObject);
var NotenString: string;
    i: word;
begin
  begin
    If Edi_Anzahl.Text = '' then
      showmessage('Bitte Eingabe tätigen')
    else
    Anzahl:= StrToInt(Edi_Anzahl.text);
    Noten := TNoten.Create(Anzahl);//Ist ergänzt
  end;

  for i:= 1 to Anzahl do
  begin
    if InputQuery('Noteneingabe',IntToStr(i)+'. Note:',NotenString)
    then begin
    Noten.SetNoten(i-1,StrToInt(NotenString));
    Noten.BerechneSchnitt;//habe es ergänzt da keine Berechnung durchgeführt wurde, jedoch öffnet er jedesmal das query auch wenn schon //was eingegeben wurde ins Query!
  end;
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  edi_Anzahl.setfocus;
end;

procedure TForm1.Bu_EndeClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.Bu_ClearClick(Sender: TObject);
begin
  edi_Anzahl.clear;
  edi_Anzahl.setfocus;
  Edit_Schnitt.clear;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Noten:= TNoten.create(Anzahl);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Noten.Destroy;
end;

end.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 18.11.08 16:07 
So ganz komme ich nicht mehr mit, was war und was jetzt ist.

Aber:

Du legst die Anzahl initial fest und berechnest nach jedem hinzufügen für das ganze Array auch wenn der Rest noch leer ist??

und das hier scheint mir auch nicht das gewünschte zu sein:

function TNoten.GetSchnitt(Position:Integer):Integer;
begin
Result:=FNoten[Position];
end;


warum nicht ein create ohne Anzahl
ein Function Add(Note):Double die
SetLength(FNoten,High(FNoten) + 2);
FNoten[High(Fnoten)]:=Note;
Result :=0;
For i:= LOW(FNoten) to High(Fnoten) do Result := Result + Fnoten[i];
Result := Result / High(Fnoten) + 1;
FSchnitt := Result;


MfG
Bummi

www.explido-software.de
SkyX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win Xp
Delphi 2007 Prof
BeitragVerfasst: Di 18.11.08 16:35 
So nochmas die Grundfunktionen des Programmes, das ich schreiben soll!
Es geht darum das ich die Anzahl der Noten selber eingeben kann und dementsprechend öffnet sich ein Query, wo man die Noten eingibt! Mit dem letzten Ok des Querys soll der Schnitt ermittet werden und in einem Edit Fenster ausgegeben werden.

@bummi
wenn ich Anzahl wegnehme kommt ein Fehler (nicht genügend Parameter vorhanden)

Und zur Rechnung sollte ja eigentich so stimmen, habe nämich ein ähnliches Programm vorher gehabt wo man nur eine bestimmte Anzahl hatte von Noten und habe die Rechnung grad übernommen und ein bisschen abgeändert, sollte eigentich stimmen!
Hier beide Codes nochmals:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
unit Unit_Noten;

interface

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

type
   TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edi_Anzahl: TEdit;
    Edit_Schnitt: TEdit;
    Bu_Eingabe: TButton;
    Bu_Ende: TButton;
    Bu_Clear: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Bu_EingabeClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Bu_EndeClick(Sender: TObject);
    procedure Bu_ClearClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private

    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Noten :TNoten;
  Anzahl: Integer;

implementation

{$R *.DFM}

procedure TForm1.Bu_EingabeClick(Sender: TObject);
var NotenString: string;
    i: word;
begin
  begin
    If Edi_Anzahl.Text = '' then
      showmessage('Bitte Eingabe tätigen')
    else
    Anzahl:= StrToInt(Edi_Anzahl.text);
    Noten := TNoten.Create(Anzahl);
  end;

  for i:= 1 to Anzahl do
  begin
    if InputQuery('Noteneingabe',IntToStr(i)+'. Note:',NotenString)
    then begin
    Noten.SetNoten(i-1,StrToInt(NotenString));
    Noten.BerechneSchnitt;
  end;
  end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  edi_Anzahl.setfocus;
end;

procedure TForm1.Bu_EndeClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.Bu_ClearClick(Sender: TObject);
begin
  edi_Anzahl.clear;
  edi_Anzahl.setfocus;
  Edit_Schnitt.clear;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Noten:= TNoten.create(Anzahl);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Noten.Destroy;
end;

end.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
interface

type
 TNoten = class(TObject)
 private
   FAnzahl:Integer;
   FSchnitt:single;
   FNoten: array of integer;
 public
   procedure BerechneSchnitt;
   function GetSchnitt(Position:integer):integer;
   procedure SetNoten(Position,Noten:Integer);
   constructor Create (Anzahl:integer);
 end;

implementation

constructor TNoten.Create(Anzahl:Integer);
begin
  inherited create;
  FAnzahl:= Anzahl;
  SetLength(FNoten,FAnzahl);
end;

Procedure TNoten.SetNoten(Position,Noten:Integer);
 begin
   FNoten[Position]:= Noten;
 end;

procedure TNoten.BerechneSchnitt;
var summe,i : integer;
 begin
   summe:= 0;
   For i:= 0 to FAnzahl -1 do Summe := Summe + FNoten[i];
   FSchnitt := Summe/FAnzahl;
 end;




function TNoten.GetSchnitt(Position:Integer):Integer;
begin
  Result:=FNoten[Position];
end;

end.
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 18.11.08 16:55 
Ich bleibe bei meiner Meinung daß BerechneSchnitt in der gegebenen Implementierung nicht passt.

10 Noten

1. Eingabe (5) >> BerechneSchnitt >> (5 + 9*0) / 10 = 0,5
2. Eingabe (3) >> BerechneSchnitt >> (5 + 3 + 8*0) / 10 = 1,6
...
...
>> zugegebenermaßen passt es nach der kompletten Eingabe aller Noten, aber "sauber" ist die Klasse so nicht

zudem ist mir immer noch nicht klar was Du hier vorhast

ausblenden Delphi-Quelltext
1:
2:
3:
4:
function TNoten.GetSchnitt(Position:Integer):Integer;
begin
  Result:=FNoten[Position];
end;

Du erwartest dem Namen nach den Schnitt ein Float und gibst zurück die Positionte Note.

Die Create Änderung würde so aussehen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
constructor TNoten.Create;
begin
  inherited create;
end;


Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt
SkyX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win Xp
Delphi 2007 Prof
BeitragVerfasst: Di 18.11.08 17:00 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:

>> zugegebenermaßen passt es nach der kompletten Eingabe aller Noten, aber "sauber" ist die Klasse so nicht

zudem ist mir immer noch nicht klar was Du hier vorhast

ausblenden Delphi-Quelltext
1:
2:
3:
4:
function TNoten.GetSchnitt(Position:Integer):Integer;
begin
  Result:=FNoten[Position];
end;

Du erwartest dem Namen nach den Schnitt ein Float und gibst zurück die Positionte Note.

[/delphi]

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


Ja, da geb ich zu das passt nicht mit der Ausgabe korriegiere ich!
Nur wie kriege ich das jetzt sauber zum laufen? Will ja keine Fest gesetzte Notenanzahl haben... sondern die Anzahl der Noteneingabe selber per Arry festlegen und diese dann so berechnen, dass der Durchschnitt der Noten kommt!
EDIT:
Das mit dem constructor hat unser lehrer vorgeben!
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 18.11.08 17:11 
Wie wäere es mit einem eigenen Eingabefenster mit Edit und 2 Button
Button 1 weiter (mrok)
Button 2 fertig (mrCancel)

weiter nur enabled wenn TryStrToInt(Edit1.Text,i)

Der Aufruf:
DeinButtonKlick;
var
loop:Boolean;
begin
loop := true;
while loop do
begin
MyInputForm:=TmyInputForm.Create(self);
if MyInputForm.ModalResult=mrok then
begin
Noten.SetNoten(i-1,StrToInt(MyInputForm.Edit));
end else loop := false;
MyInputForm.Free;
end;
Edit_Schnitt.Text:=FloatToStr(Noten.GetSchnitt(1));
end;
SkyX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win Xp
Delphi 2007 Prof
BeitragVerfasst: Di 18.11.08 17:14 
Die Lösung hört sich jedenfalls besser an, als das mit dem Query!
Aber leider darf ich das Query nicht rausnehmen! Müssen wir so machen mit Query.
Auch wenns nicht die sauberste Lösung sein sollte, sollte es irgendwie mal laufen....
nur ich komm nicht drauf....
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 18.11.08 17:27 
dann bau einfach
function TNoten.GetSchnitt(Position:Integer):Integer;
begin
Result:=FNoten[Position];
end;
um in

function TNoten.GetSchnitt:Double;
begin
Result:=FSchnitt;
end;

und lass den Rest wie er ist

nach Deiner Schleife nocht ein
Edit_Schnitt.Text:=FloatToStr(Noten.GetSchnitt);

und gut ist
SkyX Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win Xp
Delphi 2007 Prof
BeitragVerfasst: Di 18.11.08 17:39 
Danke klappt super, zwar nicht die sauberste Lösung, da man ständig den Schnitt sieht, aber besser als nix!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 18.11.08 17:39 
Und wieso nicht einfach die Klasse TNoten von TList ableiten? Die Eigenschaften Anzahl und Schnitt lassen sich doch in einer Getter-Methode wunderbar berechnen.