AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

Ein Thema von Tomski · begonnen am 24. Aug 2012 · letzter Beitrag vom 26. Aug 2012
Antwort Antwort
Tomski

Registriert seit: 17. Jun 2010
13 Beiträge
 
Delphi 2 Desktop
 
#1

Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

  Alt 24. Aug 2012, 12:52
Bei meinem Programm wird ein Abstrakter Fehler unter Delphi XE ausgelöst, wenn ich eine vorher zur Laufzeit erzeugte Komponente wieder freigebe. Unter Delphi 2007 wurde dieser Fehler nicht erzeugt. Hier der Quelltext...

With TAdvPanel.Create(self) do begin
...
...
end;

später im Quelltext wenn Sie wieder freigegeben wird, wird der Abstrakte Fehler ausgelöst.

TAdvPanel(Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr))).Free;

Die Funktionen der Komponente sind einwandfrei. Auf dem Panel befinden sich noch andere Komponenten, die ich nicht extra freigebe. Habe ich aber auch schon probiert bringt nichts es wird immer wieder diese Exception ausgelöst. Wäre super wenn mir jemand sagen könnte wie ich das behebe.

Gruß an Alle
Tomski
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
990 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

  Alt 24. Aug 2012, 13:08
Nur mal geraten, da nicht klar ist, was im with-Block passiert.
Es könnte sein, dass du denkst dass du da mit name:='blub' dem Panel einen Namen gibst während du diesen tatsächlich irgendwem anders zuweist.
Ralph
  Mit Zitat antworten Zitat
Tomski

Registriert seit: 17. Jun 2010
13 Beiträge
 
Delphi 2 Desktop
 
#3

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

  Alt 24. Aug 2012, 13:17
Hier der 'With-Block', wie gesagt die Komponente und alle auf der Komponente erzeugten Komponenten funktionieren einwandfrei und unter Delphi 2007 gibts diese Exception nicht. Es liegt also sehr wahrscheinlich an einer internen Änderung des Handlings unter Delphi.

With TAdvPanel.Create(self) do begin //ContainerPanel erzeugen
Parent := PanelSpielbericht;
Name := 'SatzEditPanel'+IntToStr(PanelNr); BevelOuter := TBevelCut(bvNone); Color := clMaroon;
Caption.Height := 20; Caption.TopIndent := Trunc((SatzEditPanelArray[DivAnzGewinnSaetze,2]-Caption.Height)/2); Caption.Color := clMaroon;
Caption.Font.Color := clYellow; Caption.Font.Name := 'Arial'; Caption.Font.Size := 11; Caption.Font.Style := [fsBold]; Caption.Visible := true;
Left := SatzEditPanelArray[DivAnzGewinnSaetze,0]; Top := ZeilenPosArray[PanelNr];
Height := SatzEditPanelArray[DivAnzGewinnSaetze,2]; Width := SatzEditPanelArray[DivAnzGewinnSaetze,3];
end;

Grüßle
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
1.938 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

  Alt 24. Aug 2012, 13:21
TAdvPanel(Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr))).Free; Der Hardcast zu TAdvPanel ist unnötig.

Tritt der Fehler auch auf wenn das Free mit dieser Zeile ausgeführt wird?

  Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr)).Free; Wenn der Sourcecode vorhanden ist, könnte man die eigentliche Ursache des Abstract Errors auch mit dem Debugger finden. Es wird eine abstrakte Methode aufgerufen, nur für welches Objekt das geschieht ist die Frage.

Auch ist es bei selbsterzeugten Komponenten nicht notwendig den Owner anzugeben, wenn man sie selbst wieder freigibt.

Also statt

TAdvPanel.Create(self) einfach

TAdvPanel.Create(nil)
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
28.538 Beiträge
 
Delphi XE3 Professional
 
#5

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

  Alt 24. Aug 2012, 13:22
Zitat:
TAdvPanel(Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr))).Free;
Eigentlich ist der Cast unnötig, da TComponent schon das Free kennt.
Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr)).Free;
Was passiert hier?
(Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr)) as TAdvPanel).Free;
Free wurde doch hoffentlich nirgendwo überschrieben?

Delphi-Quellcode:
if not (TObject(Hauptform) is TForm) then
  raise Exception.Create('Fehler');
if not (Hauptform.FindComponent('SatzEditPanel' + IntToStr(PanelNr)) is TAdvPanel) then
  raise Exception.Create('Fehler');
Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr)).Free;
Hast du vom 2007 mindestens eine Professional?
Wenn ja, dann schalte in den Projektoptionen die Debug-DCUs an, setze einen Haltepunkt auf das .Free und schau mit F7 nach, wo es knallt.

Zitat:
Also statt

TAdvPanel.Create(self) einfach

TAdvPanel.Create(nil)
Joar, wenn das "Self" vor deinem Free freigegeben wird, dann muß es hier natürlich auch knallen, weil das Panel ja dann schon weg ist.


Delphi 2 Desktop
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (24. Aug 2012 um 13:25 Uhr)
  Mit Zitat antworten Zitat
Tomski

Registriert seit: 17. Jun 2010
13 Beiträge
 
Delphi 2 Desktop
 
#6

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

  Alt 24. Aug 2012, 13:59
@mjustin @himitsu
Leider hilft das nil statt self nicht, es wird jetzt irgendwo zwischen dem Erzeugen der Kompenente und dem späteren Auflösen schon eine Exception ausgelöst, die zu suchen ist meiner Meinung nach Zeitverschwendung. Ich habe auch wie empfohlen geprüft ob die Komponente noch da ist zu dem Zeitpunkt wo Sie freigegeben wird... Sie ist da. Wie gesagt ist das Problem ziemlich sicher ein anderes Handling unter XE gegenüber 2007, irgendetwas muß unter XE andersd gemacht werden. Ein Suche nach Syntaxfehlern oder ähnlichem wird hier wohl nichts bringen, da es ja unter 2007 hervorragend läuft un keine Exceptions ausgelöst werden.

LG
  Mit Zitat antworten Zitat
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
61 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

  Alt 24. Aug 2012, 22:24
Hi,

Bei meinem Programm wird ein Abstrakter Fehler unter Delphi XE ausgelöst, wenn ich eine vorher zur Laufzeit erzeugte Komponente wieder freigebe. Unter Delphi 2007 wurde dieser Fehler nicht erzeugt. Hier der Quelltext...
Binde mal diese Unit ein:

http://sourceforge.net/p/dzlib/code/...actHandler.pas

Die sollte dafuer sorgen, dass der Abstract-Error den Debugger dort anhaelt, wo die abstrakte Methode aufgerufen wird.

twm

Gruss an Allan Mertner, von dem dieser Code original stammt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
28.538 Beiträge
 
Delphi XE3 Professional
 
#8

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

  Alt 25. Aug 2012, 00:52
Das hat mich grade mal nachsehn lassen und in XE2 hat man da nun sowas Ähnliches gleich direkt integriert.

Aber schöner praktischer es gewesen, wenn diese Funktion im Debugmodus mit der RTTI gekoppelt würde und direkt den Klassen-/Methodennamen anzeigen würde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (25. Aug 2012 um 00:54 Uhr)
  Mit Zitat antworten Zitat
Tomski

Registriert seit: 17. Jun 2010
13 Beiträge
 
Delphi 2 Desktop
 
#9

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

  Alt 26. Aug 2012, 17:54
Danke für eure Infos und Tipps. Ich hab mal ein normales Panel verwendet und das lässt sich ohne Exception freigeben. So wie die Sache aussieht liegt der Fehler in der Vererbungsreihenfolge im AdvPanel. Also Danke noch mal...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
3.122 Beiträge
 
Delphi XE7 Architect
 
#10

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE

  Alt 26. Aug 2012, 18:16
Danke für eure Infos und Tipps. Ich hab mal ein normales Panel verwendet und das lässt sich ohne Exception freigeben. So wie die Sache aussieht liegt der Fehler in der Vererbungsreihenfolge im AdvPanel. Also Danke noch mal...
Du verwendest aber schon die zu XE gehörende Version von TAdvPanel?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf