Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fehlermeldung "Element hat kein übergeördnetes Fenster" (https://www.delphipraxis.net/129393-fehlermeldung-element-hat-kein-uebergeoerdnetes-fenster.html)

devidespe 18. Feb 2009 10:35


Fehlermeldung "Element hat kein übergeördnetes Fenster&
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich verzweifle hier nochmal mit meiner Thread-Beispielapplikation.

Dafür habe ich ein Hauptformular mit 2 Schaltern erstellt, wobei der erste Schalter testweise ein leeres Formular öffnet. Der 2. Schalter öffnet ein Thread-Formular, in dem sich 3 Memofelder sowie ein Abbruch-Schalter befinden. Zu jedem der 3 Memos gehört ein Thread, der die Memos mit Zufallszahlen befüllt. Das funktioniert soweit ganz gut.

Der Abbruch-Schalter beendet die 3 Threads jeweils mit ihren Terminate-Funktionen und ruft ein Close auf, um das Fenster zu schließen und wieder zum Hauptformular zu gelangen. Leider resultiert daraus immer wieder die Fehlermeldung "Element hat kein übergeördnetes Fenster" (siehe auch Screenshot).

Ich habe irgendwas davon gelesen, dass man Create oder CreateWnd überschreiben muss und ein Parent zuweisen muss. Damit hatte ich allerdings keinen Erfolg. Ich bilde mir aber ein, dass es etwas mit den Threads zu tun haben muss, da das erste Testfenster ja fehlerfrei geschlossen werden kann.

Woran kann das liegen ? Notfalls kann ich die Beispielapplikation einmal hochladen.

himitsu 18. Feb 2009 10:39

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
erst mal eine Frage: du erstellst VCL-Fenster innerhalb der Thread's, oder hab ich das falsch verstanden?

devidespe 18. Feb 2009 10:42

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Zitat:

Zitat von himitsu
erst mal eine Frage: du erstellst VCL-Fenster innerhalb der Thread's, oder hab ich das falsch verstanden?

Ne, die Threads beschreiben nur die Memo-Felder und verwenden dafür die Thread-Synchronize-Funktionen. In der FormActivate-Funktion des Formulars werden die Threads erzeugt sowie gestartet und mit dem Abbrechen-Schalter via Terminate beendet.

Zoot 18. Feb 2009 10:53

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Passiert das Ganze auch, wenn du die Threads ganz weglässt?
Also nur beim Schließen des Fensters?

himitsu 18. Feb 2009 10:57

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
OK, dann hab ich das wohl wirklich falsch verstanden :oops:
Also wird da wohl nicht das Problem liegen :angel2:

Passieren kann nichts, wenn das Fenster schon weg ist und z.B. einer der Threads noch versucht darauf zuzugreifen?
Die Threads werden ja nicht sofort du .Terminate beendet, sondern laufen noch etwas weiter (bis sie da ankommen wo sie selbst .Terminated prüfen und sich beenden).

devidespe 18. Feb 2009 10:58

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sobald ich die Threads rausnehme, öffnet und schließt das Fenster ohne Probleme.

Ich habe einmal die Beispielapplikation angehängt, um einen besseren Eindruck von der Situation zu geben.

DeddyH 18. Feb 2009 11:03

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Ich habe nur das Kompilat gestartet. Bei mir tritt kein Fehler auf (XP SP 3).

himitsu 18. Feb 2009 11:09

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
wie gesagt, DoThread wird noch aufgerufen, nachdem das Fenster schon weg ist ... und dort entsteht auch die Exception.

PS:
das ist schon "kraß"
Delphi-Quellcode:
while (true) and (Terminated = false) do
(true) ?
ja und dann wird es hier auch immer wieder gesagt: prüfe nicht auf True und False
Delphi-Quellcode:
while not Terminated do
@DeddyH: selbes System, aber ich hab Fehler (im Debugger gestartet)


[add]
also entweder prüfst du in .DoThread ob das das Fenster noch existiert und greifst dann nicht darauf zu,

oder die einfach Lösung für diesen Fall:
Delphi-Quellcode:
procedure TThreadForm1.Button1Click(Sender: TObject);
begin
  Th1.Terminate;
  Th2.Terminate;
  Th3.Terminate;
                                //while not (alle_threads_beendet) do begin
  Sleep(100);                  //  Sleep(10);
  Application.ProcessMessages; //  Application.ProcessMessages;
                                //end;
  Close;
end;
hier würde sich dann aber eine Schleife besser eignen, welche vor Close; drauf wartet, daß alle Thread beendet wurden.

devidespe 18. Feb 2009 11:09

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Tatsächlich, der Fehler tritt nur in der Delphi-IDE auf. Kannst Du das auch bestätigen ?

Ich verwende Delphi 2007 Pro mit allen Updates.

DeddyH 18. Feb 2009 11:11

Re: Fehlermeldung "Element hat kein übergeördnetes Fens
 
Ich hab auf der Arbeit nur Delphi 5 zur Verfügung, daher kann ich das nicht ausprobieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:12 Uhr.
Seite 1 von 4  1 23     Letzte »    

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