Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fehler beim Programmende nach Erzeugung von Panels (https://www.delphipraxis.net/154142-fehler-beim-programmende-nach-erzeugung-von-panels.html)

Steve9825679 29. Aug 2010 18:41

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:
       ======================
       =          =    B    =
       =   A      ===========
       =          =    C    =
       ======================
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.

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);

zeras 29. Aug 2010 18:47

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?

Steve9825679 29. Aug 2010 18:48

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.

DeddyH 29. Aug 2010 18:49

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.

Steve9825679 29. Aug 2010 18:51

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.

DeddyH 29. Aug 2010 18:53

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)?

Steve9825679 29. Aug 2010 18:55

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.

DeddyH 29. Aug 2010 18:58

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?

zeras 29. Aug 2010 19:01

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);

Steve9825679 29. Aug 2010 19:02

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.

DeddyH 29. Aug 2010 19:03

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.

Steve9825679 29. Aug 2010 19:04

AW: Fehler beim Programmende nach Erzeugung von Panels
 
Alles klar, das wars, DANKE euch beiden!
Ich muss
Delphi-Quellcode:
  x.InsertComponent(B);
  x.InsertComponent(C);
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.
Danke nochmals!

sx2008 29. Aug 2010 19:07

AW: Fehler beim Programmende nach Erzeugung von Panels
 
Zitat:

Zitat von zeras (Beitrag 1045952)
wenn ich die Zeilen lösche, geht es, aber es kommt keine Meldung.
// x.InsertControl(B);
// x.InsertControl(C);

Wieso rufst du InsertControl auf?
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!!

Steve9825679 29. Aug 2010 19:09

AW: Fehler beim Programmende nach Erzeugung von Panels
 
Alles klar, danke für deinen Tipp!

DeddyH 29. Aug 2010 19:11

AW: Fehler beim Programmende nach Erzeugung von Panels
 
Nunja, das hatte ich ja bereits 2 mal erwähnt :roll:

Mattze 30. Aug 2010 17:15

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

DeddyH 30. Aug 2010 18:13

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