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?
Yogu - So 29.07.12 21:03
daywalker0086 hat folgendes geschrieben : |
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; |