![]() |
Warum AccessViolation?
Moin!
Ich habe hier ein kleines testprogramm. Wenn ich zuerst auf Button1 und dannach auf Button2 klicke bekomme ich eine AccessViolation, obwohl die Variable eigentlich definiert ist. Wisst ihr wodran das liegt?
Delphi-Quellcode:
ciao, moin399 :coder:
TTest = class
private TestString : string; public constructor create; procedure ShowString; end; var Form1 : TForm1; test : TTest; implementation {$R *.dfm} constructor TTest.create; begin TestString := 'Hallo'; while true do begin Application.ProcessMessages; end; end; procedure TForm1.Button1Click(Sender: TObject); begin test := TTest.create; test.free; end; procedure TTest.ShowString; begin ShowMessage(TestString); // Exception: EAccessViolation end; procedure TForm1.Button2Click(Sender: TObject); begin test.ShowString; end; |
Re: Warum AccessViolation?
:wiejetzt:
Zitat:
Mfg Frank |
Re: Warum AccessViolation?
Zitat:
|
Re: Warum AccessViolation?
Würde das ganze funktionieren wenn die endlosschleife in einer anderen methode von TTest ist, also nicht im constructor? (habe hier grad kein Delphi)
moin339 |
Re: Warum AccessViolation?
Du kannst die Endlosschleife hinpacken wohin du willst. Aber was meinst du wie viel Instanzen deines Objektes noch existieren, wenn du nach Create gleich ein Free wieder aufrufst?
|
Re: Warum AccessViolation?
Also den Fehler hat jetzt sogar mein Cousin gefunden und der hat noch nie Programmiert.
Delphi-Quellcode:
Das kann so nicht funktionieren. In Button1Click erzeugst Du die Variable Test, gibst sie aber auch gleich wieder frei.
procedure TForm1.Button1Click(Sender: TObject);
begin test := TTest.create; test.free; end; procedure TForm1.Button2Click(Sender: TObject); begin test.ShowString; end; Das heißt, wenn Du Button2 anklickst ist Test schon längst wieder freigegeben. |
Re: Warum AccessViolation?
Schön, Schön. Bloß wenn ich die "test.free" Zeile lösche passiert das gleiche. Free wird ja auch nicht ausgeführt, da create nicht fertig werden kann (ist ja auch eine ENDLOS-Schleife)
Probiert den code doch bitte mal selber aus ciao, moin339 |
Re: Warum AccessViolation?
Stimmt auch wieder. Aber in diesem Fall wird die Instanz deines Objektes nie erstellt.
Was soll der Blödsinn mit der Endlosschleife überhaupt im Konstruktor? |
Re: Warum AccessViolation?
Zitat:
Zitat:
ciao, moin339 |
Re: Warum AccessViolation?
irgendwie sehe ich keinen Sinn darin
Zitat:
außerdem, wenn du das application.processmessages so inder schleife drinläßt, wird dein CPU-Belastung auf 100% gehen. wenn schobn, dann setzt ein sleep mit rein |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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-2025 by Thomas Breitkreuz