Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi EAccessViolation!!!! Finde den Fehler im Programm nicht!!! (https://www.delphipraxis.net/80333-eaccessviolation-finde-den-fehler-im-programm-nicht.html)

C0lumb0 7. Nov 2006 13:53


EAccessViolation!!!! Finde den Fehler im Programm nicht!!!
 
Hallo ich bin gerade dabei ein Programm zu schreiben und eigentlich ist alles korrekt. Ich bin Programmzeile für Programmzeile mit Einzelanweisungen durchgegangen und nirgends kommt ein fehler. Erst nachdem die Procedure schon abgeschlossen ist tritt ein EAccessViolation auf: Meldung: 'Zugriffsverletzung bei Adresse 004032D5 in Modul AUfgabe2.exe. Lesen von Adresse 00001544. Prozess wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen.

Der Fehler tritt genau dann auf wenn ich einen Button anklicke, der wiederum einige Objekte auf der Form löscht(freigibt) sich selber auch !!

Delphi-Quellcode:
procedure TReihenfolge.BedDelete(Sender: TObject);
var nummer:string;i:integer; lbl : TLabel; pic1,pic2:Timage; bitbut:Tbitbtn;
begin
nummer:=(Tbitbtn(sender).name[4]) ;
bed1.Delete(strtoint(nummer)-1);// .componentindex-13);
bed2.Delete(strtoint(nummer)-1);//(Tbitbtn(sender).componentindex-13);
lbl := FindComponent('tex'+(nummer)) as TLabel ;
lbl.free;
pic1 := FindComponent('bi1'+(nummer)) as TImage ;
pic1.free;
pic2 := FindComponent('bi2'+(nummer)) as TImage ;
pic2.free;
Tbitbtn(sender).free;
if (anzbed)>strtoint(nummer) then
  begin
    for i:=(strtoint(nummer)+1) to (anzbed) do
      begin
       lbl := FindComponent('tex'+inttostr(i)) as TLabel ;
       lbl.name:='tex'+inttostr(i-1);
       pic1 := FindComponent('bi1'+inttostr(i)) as TImage ;
        pic1.name:='bi1'+inttostr(i-1);
       pic2 := FindComponent('bi2'+inttostr(i)) as TImage ;
       pic2.name:='bi2'+inttostr(i-1);
       bitbut := FindComponent('but'+inttostr(i)) as TBitbtn ;
       bitbut.name:='but'+inttostr(i-1);
      end;

  end;
anzbed:= anzbed-1;
end;
Könnt ihr mir irgendwie helfen ich hab alles versucht aber ich kann den Fehler nicht finde..
Mfg Andre

NormanNG 7. Nov 2006 15:04

Re: EAccessViolation!!!! Finde den Fehler im Programm nicht!
 
Hi,

also das Freigeben der Elemente ist nicht wirklich gut. Spätestens wenn das Formular zerstört wird, dann werden sie nochmal freigegeben, wenn sie nicht manuell erstellt wurden!
Ich nehme mal an, direkt nach deiner Ereignisprozedur wird der Button wieder angesprochen, aber da isser schon weg...
Warum schaltest du den Butten nicht einfach unsichtbar?

shmia 7. Nov 2006 15:33

Re: EAccessViolation!!!! Finde den Fehler im Programm nicht!
 
das Problem ist die Zeile:
Delphi-Quellcode:
Tbitbtn(sender).free;
Du killst den Button innerhalb des Eventhandlers und das darf man nicht.
Für Formulare verwendet man in diesem Falle die Methode .Release.
Lies dazu mal:
http://www.delphipraxis.net/internal...ct.php?t=29732

C0lumb0 7. Nov 2006 15:56

Re: EAccessViolation!!!! Finde den Fehler im Programm nicht!
 
der button wurde während der laufzeit erstellt und soll deswegen auch wieder gelöscht werden außerdem geht hiden nicht da andere buttons deren komponentennamen bekommen.
release geht leider nicht für buttons..

shmia 7. Nov 2006 16:00

Re: EAccessViolation!!!! Finde den Fehler im Programm nicht!
 
Zitat:

Zitat von C0lumb0
release geht leider nicht für buttons..

Richtig erkannt; sollte auch nur als weiteres Hintergrundwissen dienen.
Im angegeben Link wird gezeigt, wie man mit Window Messages arbeitet, um den Button zu löschen.
Auch [TCustomForm].Release arbeitet intern mit Window Messages.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 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