![]() |
Fehler beim Programmende nach Erzeugung von Panels
Hallo!
Ich erzeuge zur Laufzeit mehrere Panels, da ich den Bildschirm mithilfe derer in verschiedene Bereiche A, B und C einteilen muss:
Code:
Panel A hat die Eigenschaft Align=left und eine bestimmte zugewiesene Breite (die Applikation wird an unterschiedlich großen Monitoren ausgestrahlt, und A muss immer eine bestimmte Breite aufweisen), B und C sollen den restlichen Bildschirm ausfüllen. Da align=top für B sich aber über A drüber legt, muss ich unterhalb von B und C zuerst ein temporäres Panel x mit align=client erzeugen. Diesem füge ich dann mit x.InsertControl die Panels B und C zu.
======================
= = B = = A =========== = = C = ====================== Das funktioniert auch einwandfrei! Das Programm startet, etc.... aber wenn ich das Programm beende, kommt die Fehlermeldung "Im Projekt ... ist eine Exception der Klasse EInvalidPointer mit der Meldung 'Ungültige Zeigeroperation' aufgetreten". Wo liegt hier der Fehler? Bitte um Hilfe!
Delphi-Quellcode:
A:=TPanel.Create(self);
A.Name:='A'; A.Parent:=Form1; A.Align:=alLeft; A.ParentBackground:=false; A.ClientWidth:=Round(Screen.Width / 2); A.Color:=clGreen; x:=TPanel.Create(self); x.Name:='x'; x.Parent:=Form1; x.Align:=alClient; x.ParentBackground:=false; B:=TPanel.Create(self); B.Name:='B'; B.Parent:=x; B.Align:=alTop; B.Height:=Round(Screen.Height / 2); B.ParentBackground:=false; B.Color:=clBlue; C:=TPanel.Create(self); C.Name:='C'; C.Parent:=x; C.Align:=alClient; C.ParentBackground:=false; C.Color:=clBlue; x.InsertControl(B); x.InsertControl(C); |
AW: Fehler beim Programmende nach Erzeugung von Panels
Kannst du das nicht schon im Designer fertig machen und dann nur noch die Größen ändern?
|
AW: Fehler beim Programmende nach Erzeugung von Panels
Nein, kann ich nicht. Die Software soll mehrere verschiedene Layouts kennen - sorry, das hab ich beim ersten Post vergessen zu schreiben. Diese oben beschriebene Anordnung ist eine von mehreren möglichen. Darunter sind auch z.B. nur Bereich A über den ganzen Bildschirm etc. möglich. Ich weiß also erst nach Auslesen einer Zeile aus einer Datenbank, welches Layout die Software darstellen soll.
|
AW: Fehler beim Programmende nach Erzeugung von Panels
Wieso gibst Du nicht gleich x als Owner von B und C an? Es existiert ja zum Zeitpunkt der Erzeugung der beiden bereits.
|
AW: Fehler beim Programmende nach Erzeugung von Panels
Danke für den Tipp!
Habs mit x als Owner beim Erzeugen ausprobiert - leider selber Fehler: Programm funktioniert, aber nach Beenden Fehlermeldung. |
AW: Fehler beim Programmende nach Erzeugung von Panels
Da hilft wohl nur noch Durchsteppen und Ermitteln, was diesen Fehler auslöst. Gibst Du vielleicht irgendwo im Code eins oder mehrere der Panels frei (mit Free statt FreeAndNil)?
|
AW: Fehler beim Programmende nach Erzeugung von Panels
Das hab ich schon (öfters!)! Beim Durchsteppen startet das komplette Programm, erst wenn ich das Programm beende, wird der Fehler bei der Zeile "Application.Run" geschmissen. Das sagt mir leider überhaupt nix.
|
AW: Fehler beim Programmende nach Erzeugung von Panels
Wie schon gefragt: wird irgendwo eine Komponente freigegeben, die einen Owner zugewiesen bekommen hat? Tritt der Fehler auch dann auf, wenn Du eins der Panels einmal nicht erzeugst?
|
AW: Fehler beim Programmende nach Erzeugung von Panels
wenn ich die Zeilen lösche, geht es, aber es kommt keine Meldung.
// x.InsertControl(B); // x.InsertControl(C); |
AW: Fehler beim Programmende nach Erzeugung von Panels
Nein, es wird keine Komponente nirgends freigegeben (hab ich alles auskommentiert mal), und ja, der Fehler tritt auch dann auf, wenn ich eine der drei Komponenten nicht erzeuge (mit entsprechend modifiziertem Parent dann). Er tritt nur dann nicht auf, wenn ich B UND C nicht erzeuge.
|
AW: Fehler beim Programmende nach Erzeugung von Panels
Ich bin mir nicht ganz sicher, aber gehört zum jedem InsertControl/InsertComponent nicht auch ein RemoveControl/RemoveComponent? Wobei man sich das ja ganz sparen kann, wenn man gleich den richtigen Owner angibt.
|
AW: Fehler beim Programmende nach Erzeugung von Panels
Alles klar, das wars, DANKE euch beiden!
Ich muss
Delphi-Quellcode:
verwenden. Die restlichen Inhalte der drei Panels werden dann mit InsertControl (diese Code-Teile hab ich hier nicht gepostet, weil vorher schon rausgefiltert) hinzugefügt.
x.InsertComponent(B);
x.InsertComponent(C); Danke nochmals! |
AW: Fehler beim Programmende nach Erzeugung von Panels
Zitat:
Durch Setzen des Property Parent ist automatisch definiert wo das erzeugte Control in der Hierarchie aller Controls steht. Das wäre dann Doppelt-Gemoppelt. Man sollte übrigens das Property so spät wie möglich setzen; also zuerst die anderen Eigenschaften wie Color, Align,... setzen und dann erst Parent zuweisen. PS: Finger weg von InsertControl - das wird schon automatisch im Konstruktor durch die Angabe des Owners erledigt!! |
AW: Fehler beim Programmende nach Erzeugung von Panels
Alles klar, danke für deinen Tipp!
|
AW: Fehler beim Programmende nach Erzeugung von Panels
Nunja, das hatte ich ja bereits 2 mal erwähnt :roll:
|
AW: Fehler beim Programmende nach Erzeugung von Panels
Hi,
also ich vermute mal, dass durch den Hinweis parent:=x das Ding schon als "control" (Componente) in der Componentlist von x hängt. Wenn Du jetzt noch mal insertcontrol machst, geht sie nochmal als Componente rein. Das geht natürlich schief beim Abräumen und würde genau diese Fehlermeldung erklären. Gruß Mattze |
AW: Fehler beim Programmende nach Erzeugung von Panels
Nicht Parent und Owner verwechseln. Der Parent ist für die Anzeige zuständig, der Owner für die Speicherverwaltung.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 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-2025 by Thomas Breitkreuz