![]() |
Delphi-Version: 5
Verwirrung pur
Hallo Leute,
ich bins mal wieder und bin mal wieder blind. Das ist der Quellcode den ich in der Schule abgeschrieben habe (beim Lehrer hat er funktioniert), und jetzt funktioniert er bei mir nicht :shock: Hat jemand ne Idee oder is jemand nicht so blind wie ich und findet den Fehler? Es kommt immer der Fehler "Acces Violation" und der Fehler schein in der Zeile zu entstehen, in der ich den Kreis in die Form1 zeichne. Vielen Dank schonmal =)
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type TKreis = class x,y,d: Integer; constructor create (xx,yy,dd: Integer); procedure erscheinen; procedure verschwinden; end; { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; Kreis: TKreis; implementation {$R *.lfm} constructor TKreis.create (xx,yy,dd: Integer); begin Kreis.x:=xx; Kreis.y:=yy; Kreis.d:=dd; end; procedure TForm1.Button1Click(Sender: TObject); begin Kreis.create(strtoint(Form1.edit1.text),strtoint(Form1.edit2.text),strtoint(Form1.edit3.text)); Kreis.erscheinen; end; procedure TForm1.Button2Click(Sender: TObject); begin Kreis.verschwinden; end; procedure TKreis.verschwinden; begin Form1.refresh; end; procedure TKreis.erscheinen; begin Form1.refresh; Form1.canvas.Ellipse(Kreis.x,Kreis.y,Kreis.x+Kreis.d,Kreis.y+Kreis.d); end; end. |
AW: Verwirrung pur
Den constructor so aufrufen (ansonsten wird er als normale Methode aufgerufen und kein Speicher für x,y und d reserviert):
Delphi-Quellcode:
KReis:=TKreis.create(....);
|
AW: Verwirrung pur
Zitat:
Zitat:
Delphi-Quellcode:
heißen.
Kreis := TKreis.create(...)
|
AW: Verwirrung pur
Bitte gibt dem Thema einen aussagekräftigen Titel :) (so wie es in den Forenregeln steht denen du bei der Anmeldung zugestimmt hast)
|
AW: Verwirrung pur
Ein sehr schönes Beispiel für analoge Kopierverluste ;)
Bei genauerer Betrachtung ist diese auch ein Beispiel wie man es niemals machen sollte Einen schönen Gruß an den Lehrkörper - scheint ein typischer Hohlkörper zu sein :roll: |
AW: Verwirrung pur
Ok vielen dank =) ... Ich frage mich nur wieso es bei meinem Lehrer funktioniert hat 0o
|
AW: Verwirrung pur
Zitat:
Hier mal, wie man so etwas besser aufbaut:
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type TKreis = class private fX,fY,fD: Integer; public constructor create ( aX, aY, aD: Integer ); procedure erscheinen( aForm : TForm ); procedure verschwinden( aForm : TForm ); // Eigenschaften - readonly, weil auf eine externe Veränderung keine Reaktion implementiert ist property X : integer read fX; property Y : integer read fY; property D : integer read fD; end; { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click( Sender: TObject ); procedure Button2Click( Sender: TObject ); private { private declarations } fKreis : TKreis; public { public declarations } property Kreis : TKreis read fKreis; end; var Form1: TForm1; // globale Variablen gehen ja gar nicht // Kreis: TKreis; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click( Sender: TObject ); begin // Wenn es eine Instanz von Kreis gibt, dann diese Instanz auch wieder freigeben, sonst Speicherleck!!! if Assigned( fKreis ) then fKreis.Free; // Das Form1.Edit... ist sowas von falsch, denn bei einer weiteren Instanz von TForm1 funktioniert das nicht mehr // Was noch gehen würde wäre Self.Edit1.Text fKreis := TKreis.Create( StrToInt( Edit1.Text ), StrToInt( Edit2.Text ), StrToInt( Edit3.Text ) ); // Self ist die Referenz auf die aktuelle Klassen-Instanz und somit an dieser Stelle diese Formular-instanz Kreis.erscheinen( Self ); end; procedure TForm1.Button2Click(Sender: TObject); begin // Wenn es eine Instanz Kreis gibt, dann die Methode aufrufen, sonst gibt es Zugriffsverletzungen!!! if Assigned( Kreis ) Kreis.verschwinden( Self ); end; { TKreis } constructor TKreis.create ( aX, aY, aD: Integer ); begin inherited Create; // nur zur Vorsicht, falls TObject mal einen speziellen Constructor bekommt fX := aX; fY := aY; fD := aD; end; procedure TKreis.verschwinden( aForm : TForm ); begin aForm.Refresh; end; procedure TKreis.erscheinen( aForm : TForm ); begin verschwinden( aForm ); aForm.Canvas.Ellipse( X, Y, X + D, Y + D ); end; end. |
AW: Verwirrung pur
Zitat:
|
AW: Verwirrung pur
Zitat:
|
AW: Verwirrung pur
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 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 by Thomas Breitkreuz