Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#13

Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze

  Alt 14. Dez 2006, 22:32
Die Frage hast du doch nun schon in einem anderen Thread gestellt

Grundlegend gibt es bei keiner Delphi Version die ich benutze/benutzt habe (D3, D4, D5, D6, D7 und D10) habe ich jemals Probleme mit Self gehabt. Wenn es eine AV in der von dir genannten Stelle gab, dann war immer eine ungültige Referenz der Auslöser. Entweder wurde ein Objekt freigegeben und die Instanzenvariable nicht Nil gesetzt (wie mkinzler im anderen Thread schon sagte). Eine andere Möglichkeit ist, die Instanz wurde in mehreren Variablen abgelegt und eine davon wurde freigegeben, damit wird die anderen unbemerkt ungültigt. Beispiel dazu:

Delphi-Quellcode:
Var
  lInstanz,
  lGleicheInstanz: TObject;
Begin
  lInstanz := TObject.Create;
  lGleicheInstanz := lInstanz; // beide Variablen enthalten die gleiche Instanz und [b]keine Kopie[/b]!

  lInstanz.Free; // damit wird lGleicheInstanz automatisch mit ungültig!
End;
Ein anderer Fall: Die Instanz wurde durch den Owner schon freigegeben: Beispiel: eine Variable TPanel welche ein Panel zugewiesen wurde und als Owner wurde eine Form übergeben. Wenn die Form freigegeben wird, gibt diese auch die TPanel Instanz frei und die Variable enthalt dann eine ungültige Instanz. Auch hier würde im besten Falle eine AV beim Free ausgelöst werden.

Grundlegend sollte Self immer gut sein. Wenn in einer Methode Self NIL ist, dann befindet man sich in einer Methode einer nicht instanziierten Klasse. Dieses kann auch leicht geschehen, wenn man einen virtuellen Constructor versteckt und einen neuen implementiert (Compiler Warnung kann ja mit ReIntroduce unterdrückt werden) und die Klasse aber über die Basisklasse instanziiert wird.
  Mit Zitat antworten Zitat