![]() |
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 |
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. |
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 |
AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
Delphi-Quellcode:
Der Hardcast zu TAdvPanel ist unnötig.
TAdvPanel(Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr))).Free;
Tritt der Fehler auch auf wenn das Free mit dieser Zeile ausgeführt wird?
Delphi-Quellcode:
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.
Hauptform.FindComponent('SatzEditPanel'+ IntToStr(PanelNr)).Free;
Auch ist es bei selbsterzeugten Komponenten nicht notwendig den Owner anzugeben, wenn man sie selbst wieder freigibt. Also statt
Delphi-Quellcode:
einfach
TAdvPanel.Create(self)
Delphi-Quellcode:
TAdvPanel.Create(nil)
|
AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
Zitat:
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:
Hast du vom 2007 mindestens eine Professional?
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; Wenn ja, dann schalte in den Projektoptionen die Debug-DCUs an, setze einen Haltepunkt auf das
Delphi-Quellcode:
und schau mit F7 nach, wo es knallt.
.Free
Zitat:
Delphi 2 Desktop :thumb: |
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 |
AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
Hi,
Zitat:
![]() 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. |
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: |
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...
|
AW: Abstrakter Fehler beim freigeben einer Komponente unter Delphi XE
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 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