Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Element hat kein übergeordnetes Fenster (https://www.delphipraxis.net/166720-element-hat-kein-uebergeordnetes-fenster.html)

tofse 27. Feb 2012 07:58

Element hat kein übergeordnetes Fenster
 
Hallo,
ich erhalte folgende Fehlermeldung in einer ganz speziellen Situation, mit der ich nichts anfangen kann:

Im Projekt ist eine Exception der Klasse EInvalidOperation mit der Meldung 'Element " hat kein übergeordnetes Fenster' aufgetreten

Folgende Situation:

Es gibt ein TTabControl mit mehreren Reitern. Wenn der letzte Reiter angeklickt wird, wird dynamisch ein oder mehrere TStringGrid's erzeugt. Außerdem gibt es dort ein
Code:
class var GridMenu: TPopUpActionBar;
Code:
constructor TListenAnsicht.Create(AOwner: TComponent);
  var Item:TMenuItem;
  begin
    inherited;
    if not assigned(GridMenu) then
    begin
      GridMenu:=TPopUpActionBar.Create(nil);
    ......
Das wird den TStringGrid's zugewiesen.

Der Fehler kommt nun so zu Stande. Ich öffne mit Rechtsklick das Menü und lasse es offen. Dann wechsel ich den Reiter vom TTabControl....und dann kommt der Fehler.

Beim Tabwechsel läuft das hier ab
Code:
procedure TForm1.TabControlViewsChange(Sender: TObject);
begin
  ActualTermin:=nil;
  wechselTabEbene1(TabControlViews.TabIndex);
  sleep(0); // -> Breakpoint zum Testen
end; // --> Fehler kommt NACH sleep
Der Fehler kommt NUR, wenn ich das Menü beim Tabwechsel geöffnet lasse.
Was noch wichtig ist, in der tiefe des Codes, wird durch den Tabwechsel veranlasst auch der Inhalt vom Tab 'aufgeräumt'.
Code:
destructor TListenAnsicht.Destroy;
  begin
    if Assigned(GridMenu) then
    begin
      GridMenu.CloseMenu;
      FreeAndNil(GridMenu);
    end;
    inherited Destroy;
  end;
Das war jetzt natürlich sehr verkürzt, aber ich hoffe, damit kann jemand was anfangen

Grüße
Christof

himitsu 27. Feb 2012 09:10

AW: Element hat kein übergeordnetes Fenster
 
Und wo hast du deinem GridMenü das übergeordnete Fenster (Parent) zugewiesen?

tofse 27. Feb 2012 09:14

AW: Element hat kein übergeordnetes Fenster
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu (Beitrag 1153054)
Und wo hast du deinem GridMenü das übergeordnete Fenster (Parent) zugewiesen?

Gibt es ja nicht...der Fehler kommt ja nur, wenn das Menü beim Tabwechsel noch offen ist

Ich weiße meinem TStringGrid nur das Popupmenu zu
Code:
SG.PopupMenu:=GridMenu;

himitsu 27. Feb 2012 09:44

AW: Element hat kein übergeordnetes Fenster
 
Hmmmm, also wenn es passiert, wenn das Ding sichtbar ist, dann könnte man versuchen es auszublenden?
Delphi-Quellcode:
if Assigned(GridMenu) then
  GridMenu.CloseMenu;
Im OnChange/OnViewChange oder besser noch im OnChanging de TabControls.

tofse 27. Feb 2012 09:47

AW: Element hat kein übergeordnetes Fenster
 
Zitat:

Zitat von himitsu (Beitrag 1153060)
Im OnChange/OnViewChange oder besser noch im OnChanging de TabControls.

Hatte ich oben schon beschrieben:
Code:
destructor TListenAnsicht.Destroy;
  begin
    if Assigned(GridMenu) then
    begin
      GridMenu.CloseMenu;
      FreeAndNil(GridMenu);
    end;
    inherited Destroy;
  end;
Im onChange werden die Objekte von TListenAnsicht freigegeben. Darin sind enthalten die TStringGrids und das Menü.
Habs im Debugger auch nachvollzogen, da wird auf jeden Fall auch reingesprungen, von daher bin ich echt ratlos

himitsu 27. Feb 2012 09:57

AW: Element hat kein übergeordnetes Fenster
 
Hast du irgendwie DevExpress im Programm?

Wir haben hier, im XE auch diese Fehlermeldung, bei einer ComboBox (TdxBarImageCombo), seit dem letzen Update vor ein paar Tagen.
Im OnChange wird eventuell ein Passwort abgefragt und sobald dieser Abfragedialofg auch nur einmal angezeigt wird, kommt nach dem END auch diese Fehlermeldung.

tofse 27. Feb 2012 09:58

AW: Element hat kein übergeordnetes Fenster
 
Zitat:

Zitat von himitsu (Beitrag 1153065)
Hast du irgendwie DevExpress im Programm?

Sagt mir jetzt nichts

himitsu 27. Feb 2012 10:16

AW: Element hat kein übergeordnetes Fenster
 
Dann wird's das wohl auch nicht sein. :lol:

Du könntest, in den Projektoptionen, mal das "mit Debug-DCUs kompilieren" aktivieren ... vielleicht kommst du damit der Fehlerstelle etwas näher.
(eventuell auch sicherheitshalber, nach dem Umstellen, das Projekt neu erzeugen > Shift+F9)

tofse 27. Feb 2012 10:23

AW: Element hat kein übergeordnetes Fenster
 
ok, dann springt er hier hin:

Code:
procedure TWinControl.CreateWnd;
var
  Params: TCreateParams;
  ClassRegistered: Boolean;
{$IF DEFINED(CLR)}
  TempClass: TWndClassInfo;
  WndClass: TWndClass;
{$ELSE}
  TempClass: TWndClass;
{$IFEND}
begin
  CreateParams(Params);
{$IF DEFINED(CLR)}
  Params.WinClassName := Format('%s.%d',
    [Params.WinClassName, AppDomain.CurrentDomain.GetHashCode]);
{$IFEND}
  with Params do
  begin
    if (WndParent = 0) and (Style and WS_CHILD <> 0) then
      if (Owner <> nil) and (csReading in Owner.ComponentState) and
        (Owner is TWinControl) then
        WndParent := TWinControl(Owner).Handle
      else
        raise EInvalidOperation.CreateFmt(SParentRequired, [Name]); // <----------------------------------------- hier stoppt er
Leider muss ich hier passen, was hier das Problem sein soll ?????

himitsu 27. Feb 2012 10:36

AW: Element hat kein übergeordnetes Fenster
 
Einen Haltepunkt auf
Delphi-Quellcode:
raise
oder notfalls auch auf
Delphi-Quellcode:
if (Owner <> nil)
legen.
Eventuell auch erst das Programm starten und dann den Haltepunkt.

Und dort mal schauen was z.B. Self.Name, Self.ClassName und Owner so sagen. (überwachte Variablen)

Haltepunkt, damit man an die Werte noch vor der Exception rankommt ... danach hat Delphi gerne Probleme damit. :cry:

tofse 27. Feb 2012 12:37

AW: Element hat kein übergeordnetes Fenster
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hm, hat mir leider auch nicht weitergeholfen...
scheint wohl mit meiner Klasse was zu tun zu haben, aber in welchem Zusammenhang der Fehler da reinläuft :(:(:(:(

stahli 27. Feb 2012 23:14

AW: Element hat kein übergeordnetes Fenster
 
Schau Dir mal an, ob Du mit dem Focus weiter kommst.
Ich hatte ähnliche Probleme durch das Zerstören von Controls, die eigentlich noch den Focus hatten.
Windows (oder die VCL) hat alles korrekt ausgeführt und wollte dann aber noch das Control neu zeichnen, das den Focus verloren hat.
Dieses war aber nun nicht mehr existent, was zu diversen Problemen führte.
Lösung: Control nur unsichtbar machen und später zerstören.

Vielleicht hilft Dir das ja auf den Weg...

tofse 28. Feb 2012 07:51

AW: Element hat kein übergeordnetes Fenster
 
Hallo,

danke für den Tipp. Ich habe nun einiges umgestellt.
Fokus hat nichts gebracht.

Ich verwalte die Objekte nun in einem Pool und blende sie bei Bedarf ein bzw. aus.
Erst beim Programmende wird alles freigegeben.

Ich überlege noch, ob ich mit Hilfe eines Timers die Objekte früher freigeben soll, wenn sie länger nicht benötigt werden, aber nach den letzten Erfahrungen habe ich etwas Bammel davor...ich war ja der Meinung, doch recht "sauber" programmiert zu haben, und dennoch kam der Fehler :?

Naja mal überlegen, so funktioniert es zumindest jetzt zuverlässig :thumb:

himitsu 28. Feb 2012 09:20

AW: Element hat kein übergeordnetes Fenster
 
Eventuell könntest du ein kleines Beispiel geben?

Alles ausbauen, was unwichtig ist, so daß man möglichst wenig Testcode hätte, um den Fehler reproduzieren zu können,
oder den Fehler in einem neuen/leeren Projekt nachbauen.

tofse 28. Feb 2012 09:23

AW: Element hat kein übergeordnetes Fenster
 
Zitat:

Zitat von himitsu (Beitrag 1153316)
Eventuell könntest du ein kleines Beispiel geben?

Alles ausbauen, was unwichtig ist, so daß man möglichst wenig Testcode hätte, um den Fehler reproduzieren zu können.

Das ist doch ziemlich aufwendig, v.a. das Ausbauen...mit der aktuellen Lösung kann ich aber leben.
Danke


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