AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung

Ein Thema von Koller · begonnen am 10. Jun 2006 · letzter Beitrag vom 15. Jun 2006
Antwort Antwort
Seite 1 von 3  1 23      
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#1

Zugriffsverletzung

  Alt 10. Jun 2006, 11:46
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
Angehängte Dateien
Dateityp: zip mark_analyzer_149.zip (285,7 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Zugriffsverletzung

  Alt 10. Jun 2006, 11:54
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
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#3

Re: Zugriffsverletzung

  Alt 10. Jun 2006, 12:14
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.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: Zugriffsverletzung

  Alt 10. Jun 2006, 12:23
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
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#5

Re: Zugriffsverletzung

  Alt 10. Jun 2006, 12:36
Ja so wird es sein :autsch: Und was kann man dagegen tun?
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: Zugriffsverletzung

  Alt 10. Jun 2006, 13:55
Hallo,
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
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#7

Re: Zugriffsverletzung

  Alt 10. Jun 2006, 16:35
Hab ich gemacht, aber der Button verschwindet nicht
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#8

Re: Zugriffsverletzung

  Alt 10. Jun 2006, 16:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Zugriffsverletzung

  Alt 10. Jun 2006, 16:56
dann sendest du wohl die message nicht
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#10

Re: Zugriffsverletzung

  Alt 11. Jun 2006, 21:14
Ich hab das nicht abgespeichert, darum kann ich den modifizierten Source nicht mehr herzeigen. Meine Bitte: Kann das mal bitte jemand anpassen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 Uhr.
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