![]() |
Zugriffsverletzung
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
wenn ihr die exe im Anhang startet und dann auf das Symbol für Neue Datei klickt, dann erscheint ein neuer Tab. Nun klickt man auf den letzten Knopf mit dem X und dieser verschwindet. Anschließend klickt man wieder auf den letzen Knopf und es tritt eine Zugriffsverletzung auf. Die Procedure DeleteSubject in der maf.pas wird beim Klicken aufgerufen. Kann jemand den Fehler finden??? :f |
Re: Zugriffsverletzung
Zitat:
Wenn eine Zugriffsverletzung auftritt, nachdem etwas verschwindet, ist es nicht weiter schwer einen möglichen Fehler zu finden. Mit hoher Wahrscheinlichkeit findet wohl ein Zugriff auf ein gelöschtes Objekt statt. Also musst du nur dafür sorgen, dass du nicht auf etwas freigebenes zugreifst. Hab jetzt nicht in deinen Code geschaut, aber prüfen ob eine Variable noch zugewiesen ist macht man mit assigned(Variable) und beim Freigeben kannst du mit FreeAndNil(Variable) sicherstellen, dass der gespeicherte Zeiger nach dem Freigeben der Nullpointer ist. Gruß Der Unwissende |
Re: Zugriffsverletzung
Ich habe mal den Debugger benutzt. Mit F7 gehe ich Zeile für Zeile durch. Der Debugger springt in die markierte Zeile und danach wird der Fehler ausgelöst.
Delphi-Quellcode:
procedure TMarkFile.DeleteSubject(Sender : TObject);
var row,i,i2:integer; begin row:=(Sender as TButton).Tag; if row=High(FEingabeArray) then begin for i2 := 1 to 5 do begin FreeAndNil(FEingabeArray[row].array_edit[i2]); end; FreeAndNil(FEingabeArray[row].button_loeschen); FreeAndNil(FEingabeArray[row].Combobox_fach); end else begin for i := row to High(FEingabeArray)-1 do begin for i2 := 1 to 5 do begin FEingabeArray[i].array_edit[i2].text:=FEingabeArray[i+1].array_edit[i2].Text; end; FEingabeArray[i].button_loeschen.Tag:=FEingabeArray[i+1].button_loeschen.Tag; FEingabeArray[i].Combobox_fach.Text:=FEingabeArray[i+1].Combobox_fach.Text; end; FreeAndNil(FEingabeArray[High(FEingabeArray)].button_loeschen); FreeAndNil(FEingabeArray[High(FEingabeArray)].Combobox_fach); for i2 := 1 to 5 do begin FreeAndNil(FEingabeArray[High(FEingabeArray)].array_edit[i2]); end; end; SetLength(FEingabeArray,Length(FEingabeArray)-1); UpdateSubjects; end;//hier nach end; wird der Fehler ausgelöst. Danach kommt nichts mehr. |
Re: Zugriffsverletzung
Hallo,
kann es sein, dass Du den button löschst, der gerade gedrückt wurde? In diesem Fall passiert nämlich Folgendes: - Button.DoClick wird ausgelöst - Eigenes Ereignis OnClick wird ausgeführt - Button wird zerstört - Rücksprung zu Button.DoClick, aber Button ist nicht mehr vorhanden -> AV Gruß xaromz |
Re: Zugriffsverletzung
Ja so wird es sein :autsch: Und was kann man dagegen tun?
|
Re: Zugriffsverletzung
Hallo,
Zitat:
Da PostMessage die Message in die Warteschlage steckt, kommt diese nach dem Buttonclick an. In der Behandlungsroutine kannst Du dann den Button zerstören. ![]() Gruß xaromz |
Re: Zugriffsverletzung
Hab ich gemacht, aber der Button verschwindet nicht :roll:
|
Re: Zugriffsverletzung
Delphi-Quellcode:
Das wird gar nicht aufgerufen.
procedure TMarkFile.LoeschMich(var Msg: TMessage);
begin TObject(Msg.WParam).Free; // WParam nach TObject casten und freigeben showmessage('blubb'); end; |
Re: Zugriffsverletzung
dann sendest du wohl die message nicht
|
Re: Zugriffsverletzung
Ich hab das nicht abgespeichert, darum kann ich den modifizierten Source nicht mehr herzeigen. Meine Bitte: Kann das mal bitte jemand anpassen? :oops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 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