Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Exception EAccessViolation bei inherited add() (https://www.delphipraxis.net/118574-exception-eaccessviolation-bei-inherited-add.html)

DeddyH 12. Aug 2008 18:42

Re: Exception EAccessViolation bei inherited add()
 
Ich kämpfe im Moment "an allen Fronten", hab daher leider keine Luft, um mir das im Detail anzusehen. Evtl. morgen :|

blackdrake 18. Aug 2008 22:10

Re: Exception EAccessViolation bei inherited add()
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Ich habe bei meinem Demoprojekt die ganzen Schritte von OnCreate() in ein Button-Click-Ereignis geschoben (soll später in OnShow, mit Aufruf von Loaded). Bei OnCreate ist die ImageList ja noch gar nicht geladen, weswegen es das Loaded() Problem gab (das du für mich gefunden hast).

Ich erhalte bei folgender Stelle nun eine Meldung "Listenindex überschreitet Maximum 0":

Delphi-Quellcode:
with tag_history.Columns.Add do
begin
  Caption := '1'; // EXCEPTION
  Width := (tag_history.Width - 20) div 3 * 2;
end;
Das Seltsame:

Delphi-Quellcode:
function TSortListColumns.Add: TSortListColumn;
begin
  Result := TSortListColumn(inherited Add);
end;
Der Debugger sagt bei F7 nicht, dass es bei "inherited Add" weiter (in die "tiefe") geht!!

Normalerweise sollte er bei

Delphi-Quellcode:
{ ComCtrls }

function TListColumns.Add: TListColumn;
begin
  Result := TListColumn(inherited Add);
  UpdateCols;
end;
weitermachen! Hier wird der Haltepunkt aber niemals erreicht.

Auch die noch weiter oben liegende Weiterleitung

Delphi-Quellcode:
{ Classes }

function TCollection.Add: TCollectionItem;
begin
  Result := FItemClass.Create(Self);
  Added(Result);
end;
wird niemals erreicht...

Komisch. TSortListColumns ist das Kind von TListColumns, also müsste doch die inherited-Variante bei TListColumns.Add() anknüpfen, oder nicht???

Irgendeine Idee?

Gruß
Daniel Marschall
blackdrake

blackdrake 19. Aug 2008 20:32

Re: Exception EAccessViolation bei inherited add()
 
Kann mir denn niemand helfen? Wieso ruft inherited nicht die höhere Instanz auf? Ich habe sogar in die ComCtrls.pas eine showmessage() eingebaut, um ganz sicher zu gehen, dass sich der Debugger nicht geirrt hat. Der Punkt wird tatsächlich nicht erreicht.

Ich weiß nicht, ob das komplette Neuschreiben der Klasse überhaupt notwendig ist, da man es mit der Ableitung eigentlich prima hinbekommen könnte. (Schließlich macht es Borland meist genau so, z.B. mit den TCollectionItems, die einfach durch Ableiten erweitert werden)

blackdrake 21. Aug 2008 20:11

Re: Exception EAccessViolation bei inherited add()
 
Delphi-Quellcode:
function TSortListColumns.Add: TSortListColumn;
var
  x: TListColumn;
  y: TSortListColumn;
begin
  x := inherited Add;     // NACH DIESEM PUNKT IST MIT F7 DIE PROZEDUR ZUENDE!
                           // DER DEBUGGER GEHT NICHT IN DIE TIEFE
  y := TSortListColumn(x); // DIESER PUNKT WIRD NIEMALS ERREICHT
  Result := y;            // DIESER PUNKT WIRD NIEMALS ERREICHT

  //Result := TSortListColumn(inherited Add);
end;
Das kann doch nicht sein. Das Vererbungsmodell von Delphi funktioniert hier einfach nicht! Die Methode "Add" ist nicht als virtuell definiert, so dass man sie nicht mit override überschreiben kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr.
Seite 3 von 3     123   

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