Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletzung (https://www.delphipraxis.net/71178-zugriffsverletzung.html)

Koller 10. Jun 2006 10:46


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

Der_Unwissende 10. Jun 2006 10:54

Re: Zugriffsverletzung
 
Zitat:

Zitat von Koller
Kann jemand den Fehler finden??? :f

Klar, aber wie wär's denn wenn du dieser jmd. bist?

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

Koller 10. Jun 2006 11:14

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.

xaromz 10. Jun 2006 11:23

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

Koller 10. Jun 2006 11:36

Re: Zugriffsverletzung
 
Ja so wird es sein :autsch: Und was kann man dagegen tun?

xaromz 10. Jun 2006 12:55

Re: Zugriffsverletzung
 
Hallo,
Zitat:

Zitat von Koller
Ja so wird es sein :autsch: Und was kann man dagegen tun?

Du kannst Dir eine eigene Message bauen und diese mit PostMessage an Dein TForm schicken.
Da PostMessage die Message in die Warteschlage steckt, kommt diese nach dem Buttonclick an. In der Behandlungsroutine kannst Du dann den Button zerstören.

Hier hab' ich sowas mal beschrieben.

Gruß
xaromz

Koller 10. Jun 2006 15:35

Re: Zugriffsverletzung
 
Hab ich gemacht, aber der Button verschwindet nicht :roll:

Koller 10. Jun 2006 15:40

Re: Zugriffsverletzung
 
Delphi-Quellcode:
procedure TMarkFile.LoeschMich(var Msg: TMessage);
begin
  TObject(Msg.WParam).Free; // WParam nach TObject casten und freigeben
  showmessage('blubb');
end;
Das wird gar nicht aufgerufen.

SirThornberry 10. Jun 2006 15:56

Re: Zugriffsverletzung
 
dann sendest du wohl die message nicht

Koller 11. Jun 2006 20:14

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 02:52 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz