Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE (https://www.delphipraxis.net/169993-abstrakter-fehler-beim-freigeben-einer-komponente-unter-delphi-xe.html)

Tomski 24. Aug 2012 11:52

Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
 
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

Jumpy 24. Aug 2012 12:08

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
 
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.

Tomski 24. Aug 2012 12:17

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
 
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

mjustin 24. Aug 2012 12:21

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
 
Delphi-Quellcode:
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?

Delphi-Quellcode:
  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

Delphi-Quellcode:
TAdvPanel.Create(self)
einfach

Delphi-Quellcode:
TAdvPanel.Create(nil)

himitsu 24. Aug 2012 12:22

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
 
Zitat:

Delphi-Quellcode:
TAdvPanel(Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr))).Free;

Eigentlich ist der Cast unnötig, da TComponent schon das Free kennt.
Delphi-Quellcode:
Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr)).Free;

Was passiert hier?
Delphi-Quellcode:
(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
Delphi-Quellcode:
.Free
und schau mit F7 nach, wo es knallt.

Zitat:

Also statt

Delphi-Quellcode:
TAdvPanel.Create(self)
einfach

Delphi-Quellcode:
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 :thumb:

Tomski 24. Aug 2012 12:59

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
 
@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

dummzeuch 24. Aug 2012 21:24

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
 
Hi,

Zitat:

Zitat von Tomski (Beitrag 1179716)
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.

himitsu 24. Aug 2012 23:52

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
 
Das hat mich grade mal nachsehn lassen und in XE2 hat man da nun sowas Ähnliches gleich direkt integriert. :thumb:

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. :stupid:

Tomski 26. Aug 2012 16:54

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
 
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...

Uwe Raabe 26. Aug 2012 17:16

AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
 
Zitat:

Zitat von Tomski (Beitrag 1179990)
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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 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