AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Exception EAccessViolation bei inherited add()
Thema durchsuchen
Ansicht
Themen-Optionen

Exception EAccessViolation bei inherited add()

Offene Frage von "blackdrake"
Ein Thema von blackdrake · begonnen am 10. Aug 2008 · letzter Beitrag vom 21. Aug 2008
Antwort Antwort
Seite 1 von 3  1 23      
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Exception EAccessViolation bei inherited add()

  Alt 10. Aug 2008, 22:38
Hallo.

Ich bin gerade dabei, eine VCL zu erweitern. Dabei erhalte ich nun eine EAccessViolation bei folgender Funktion:

Delphi-Quellcode:
function TSortListColumns.Add: TSortListColumn;
begin
  Result := TSortListColumn(inherited Add);
end;
Aufgedröselt kann ich erkennen, dass die Exception scheinbar durch inherited verursacht wird:

Delphi-Quellcode:
function TSortListColumns.Add: TSortListColumn;
var
  tmp: TListColumn;
  tmp2: TSortListColumn;
begin
  tmp := inherited Add; // <-- EXCEPTION (wieso da?)
  tmp2 := TSortListColumn(tmp);
  Result := tmp2;
end;
Der vereinfachte Code, der die zusammenhänge zeigt:

Delphi-Quellcode:
type
  TSortListColumns = class(TListColumns)
    {...}
  public
    function Add: TSortListColumn;
  end;

  TSortListView = class(TListView)
    {...}
  published
    property Columns: TSortListColumns read FSortListColumns write SetSortListColumns;
  end;
Die Exception wird ausgelöst bei dem Programmcode:

Delphi-Quellcode:
var tag_history: TSortListView;

tag_history := TSortListView.Create(TagForm);

{...}

with tag_history.Columns.Add do // <-- Exception
begin
  // ...
end;
Weiß jemand weiter? Ich kann mir absolut nicht vorstellen, was hier falsch sein soll, da ich Add() ja nur vererbe.

Ich kann ein kleines Testprogramm zur Verfügung stellen.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Exception EAccessViolation bei inherited add()

  Alt 11. Aug 2008, 05:37
Du musst Delphi auch sagen, das die Methode geerbt ist (overload)
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Exception EAccessViolation bei inherited add()

  Alt 11. Aug 2008, 05:56
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Exception EAccessViolation bei inherited add()

  Alt 11. Aug 2008, 07:09
Zitat von mkinzler:
Du musst Delphi auch sagen, das die Methode geerbt ist (overload)
Statt overload override.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Exception EAccessViolation bei inherited add()

  Alt 11. Aug 2008, 07:16
Hallo ihr beiden,

ich würde sagen "weder noch" - es geht hier um die statische Methode Add() der unterliegenden Collection.

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Exception EAccessViolation bei inherited add()

  Alt 11. Aug 2008, 07:21
Achso, Du meinst, dass weder die Item- noch die Listenklasse abgeleitet bzw. die Ableitungen im Konstruktor nicht benutzt wurden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Exception EAccessViolation bei inherited add()

  Alt 11. Aug 2008, 07:43
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:
constructor TCustomListView.Create(AOwner: TComponent);
begin
  // ...
  FListColumns := TListColumns.Create(Self);
  // ...
end;
Leider kennt der Konstruktor der Collection nur seine eigene Item-Klasse:

Delphi-Quellcode:
constructor TListColumns.Create(AOwner: TCustomListView);
begin
  inherited Create(TListColumn);
  FOwner := AOwner;
end;
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?

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Exception EAccessViolation bei inherited add()

  Alt 11. Aug 2008, 07:47
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Exception EAccessViolation bei inherited add()

  Alt 12. Aug 2008, 12:25
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
Angehängte Dateien
Dateityp: zip test_340.zip (278,8 KB, 4x aufgerufen)
Daniel Marschall
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Exception EAccessViolation bei inherited add()

  Alt 12. Aug 2008, 12:54
In der comctrls.pas von Delphi 5 steht Folgendes:
Zitat:
Delphi-Quellcode:
TCustomListView = class(TWinControl)
  private
    ...
    FListColumns: TListColumns;
    ...
    procedure SetListColumns(Value: TListColumns);
    ...
  protected
    ...
    property Columns: TListColumns read FListColumns write SetListColumns;
    ...
  end;
Da die Deklaration von FListColumns im private-Abschnitt steht, kommst Du da nicht ran, kannst also nicht ohne Weiteres auf Deinen Typ "umbiegen". Sofern Du über die VCL-Sourcen verfügst, bliebe Dir noch die Möglichkeit, die gesamte Kompo von Grund auf aufzubauen, den Originalsource könntest Du als Anhaltspunkt nehmen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 15:04 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