Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Klassen und Objekte, Zugriffsverletzung bei Verwendung


daywalker0086 - Sa 28.07.12 11:47
Titel: Klassen und Objekte, Zugriffsverletzung bei Verwendung
Hallo Delphi Programmierer,
ich wollte mal anfangen Klassen und Objekte zu verwenden um alles übersichtlicher zu machen und hab mir mal eine kleine Klasse erzeugt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
TLast = class
  private
  FWindsog:single;
  Fwinddruck:single;
  FSchneelast:single;
  FEigengewicht:single;
  public
  Procedure SetWindsog(Sogkraft:single);
  property Windsog: single read FWindsog write SetWindsog;

  end;

Diese Steht direkt unter der Deklaration von TMainForm.

Im Implementation Teil steht das die Prozedur TLast.Setwindsog

Delphi-Quelltext
1:
2:
3:
4:
Procedure TLast.SetWindsog(Sogkraft:single);
begin
FWindsog:=Sogkraft;
end;


Dann hab ich mir einen Button gemacht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TMainForm.Button5Click(Sender: TObject);
var
BereichF:Tlast;
begin
BereichF.Create;
BereichF.SetWindsog(40);
showmessage(Floattostr(BereichF.FWindsog));

BereichF.Free;
end;


Wenn ich allerdings darauf klicke und dann mein Showmessage Dialog wegklicke erhalte ich Zugriffsverletzungen als Fehler.
Wenn ich "Free" weglasse funktioniert alles bis zum schließen den Programms, dann kommt wider die Zugriffsverletzung.

Wo liegt denn der Anfängerfehler?


Xion - Sa 28.07.12 11:50

user profile icondaywalker0086 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TMainForm.Button5Click(Sender: TObject);
var
BereichF:Tlast;
begin
BereichF.Create;
BereichF.SetWindsog(40);
showmessage(Floattostr(BereichF.FWindsog));

BereichF.Free;
end;


Es muss heißen:

Delphi-Quelltext
1:
BereichF:=TLast.Create;                    


daywalker0086 - So 29.07.12 13:23

Dankeschön!


Yogu - So 29.07.12 21:03

user profile icondaywalker0086 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
BereichF.SetWindsog(40);                    

Da du eine Eigenschaft mit einem Setter deklariert hast, musst du diese Methode nicht direkt aufrufen, sondern kannst den Wert übersichtlich direkt zuweisen:


Delphi-Quelltext
1:
BereichF.Windsog := 40;                    

:idea:


Andreas L. - Mo 30.07.12 07:12

Den Setter deklariert man normalerweise im protected-Bereich:


Delphi-Quelltext
1:
2:
  protected
    procedure SetWindsog(Sogkraft:single);


Und Ressourcen-Schutzblöcke sind auch keine schlechte Sache ;-)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TMainForm.Button5Click(Sender: TObject);
var
  BereichF:Tlast;
begin
  BereichF := TLast.Create;
  try
    BereichF.Windsog := 40;
    showmessage(Floattostr(BereichF.Windsog));
  finally
    BereichF.Free;
  end;
end;