![]() |
Exception EAccessViolation bei inherited add()
Hallo.
Ich bin gerade dabei, eine VCL zu erweitern. Dabei erhalte ich nun eine EAccessViolation bei folgender Funktion:
Delphi-Quellcode:
Aufgedröselt kann ich erkennen, dass die Exception scheinbar durch inherited verursacht wird:
function TSortListColumns.Add: TSortListColumn;
begin Result := TSortListColumn(inherited Add); end;
Delphi-Quellcode:
Der vereinfachte Code, der die zusammenhänge zeigt:
function TSortListColumns.Add: TSortListColumn;
var tmp: TListColumn; tmp2: TSortListColumn; begin tmp := inherited Add; // <-- EXCEPTION (wieso da?) tmp2 := TSortListColumn(tmp); Result := tmp2; end;
Delphi-Quellcode:
Die Exception wird ausgelöst bei dem Programmcode:
type
TSortListColumns = class(TListColumns) {...} public function Add: TSortListColumn; end; TSortListView = class(TListView) {...} published property Columns: TSortListColumns read FSortListColumns write SetSortListColumns; end;
Delphi-Quellcode:
Weiß jemand weiter? Ich kann mir absolut nicht vorstellen, was hier falsch sein soll, da ich Add() ja nur vererbe.
var tag_history: TSortListView;
tag_history := TSortListView.Create(TagForm); {...} with tag_history.Columns.Add do // <-- Exception begin // ... end; Ich kann ein kleines Testprogramm zur Verfügung stellen. Gruß blackdrake |
Re: Exception EAccessViolation bei inherited add()
Du musst Delphi auch sagen, das die Methode geerbt ist (overload)
|
Re: Exception EAccessViolation bei inherited add()
Moin Daniel,
der Aufruf von inherited Add() schlägt wahrscheinlich fehl, weil du implizit im Konstruktor von TSortListView immer noch die Collection ListColumns mit der ItemClass TListColumn erzeugst. Freundliche Grüße |
Re: Exception EAccessViolation bei inherited add()
Zitat:
|
Re: Exception EAccessViolation bei inherited add()
Hallo ihr beiden,
ich würde sagen "weder noch" - es geht hier um die statische Methode Add() der unterliegenden Collection. Freundliche Grüße |
Re: Exception EAccessViolation bei inherited add()
Achso, Du meinst, dass weder die Item- noch die Listenklasse abgeleitet bzw. die Ableitungen im Konstruktor nicht benutzt wurden.
|
Re: Exception EAccessViolation bei inherited add()
Moin Detlef,
die gewünschten Ableitungen (TListColumn, TListColumns, TSortListView) wurden ja hergestellt, aber im Konstruktor von TSortListView bleibt die Collection "Columns" die alte:
Delphi-Quellcode:
Leider kennt der Konstruktor der Collection nur seine eigene Item-Klasse:
constructor TCustomListView.Create(AOwner: TComponent);
begin // ... FListColumns := TListColumns.Create(Self); // ... end;
Delphi-Quellcode:
Es ist immer problematisch, wenn bei einer Ableitung auch noch eingebettete Klassen abgeleitet werden sollen und diese Vorgehensweise vom Designer der Klassenhierarchie nicht vorgesehen wurde. Daniel sollte vielleicht nochmal überlegen, ob sein Ansatz hier der richtige ist. Lässt TD nicht schon class decoration zu?
constructor TListColumns.Create(AOwner: TCustomListView);
begin inherited Create(TListColumn); FOwner := AOwner; end; Freundliche Grüße |
Re: Exception EAccessViolation bei inherited add()
Moin Achim,
dann war mein weiterer persönlicher Gedankengang ja gar nicht so verkehrt. Ich hatte mich nämlich gefragt, wie zum Kuckuck man in einer Ableitung die "Originalliste" durch seine eigene ersetzen kann. Durch Vererbung ist diese ja bereits vorhanden, nur dann eben vom falschen Typ. |
Re: Exception EAccessViolation bei inherited add()
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.
Das mit overload funktioniert nicht, da die Originalmethode irgendwie virtuell ist. Das mit dem Impliziten verstehe ich nicht ganz. Wäre es möglich, dass ihr meinen Code einmal anschaut und mir Ratschläge gebt? Ich habe eine Beispielprojekt gepostet. Das hier ist mein erster Versuch, irgendwas mit vererbten Klassen und VCLs zu tun. Ich habe daher in diesem Bereich das Wissen einer Tomate. Ich habe ziemlich lange gebraucht, bis ich TColumn komplett zu TSortColumn erweitern konnte. Diese Column soll eine zusätzliche Eigenschaft "SortMode" haben (das heißt konvertierung von TColumn zu TSortColumn ist ohne Probleme möglich). Diese zusätzliche Eigenschaft beschreibt, mit welchen Sortieralgorithmus die Spalte beim Sortieren behandelt werden soll. Es ist mir wichtig, dass ich beim Erweitern dieser VCL etwas lerne und mein Wissen über VCL, die properties und die Vererbungen erweitere. PS: Ich würde außerdem gerne beim "alten" Delphi-Standard bleiben, sofern das in diesem Falle möglich ist. (Sprich: auf moderne Klassenerweiterungen / helper classes / decoration class / etc. verzichten) Gruß blackdrake |
Re: Exception EAccessViolation bei inherited add()
In der comctrls.pas von Delphi 5 steht Folgendes:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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 by Thomas Breitkreuz