Delphi-PRAXiS

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/)
-   -   abgeleitete Combobox: Element hat kein übergeordnetes Fenster (https://www.delphipraxis.net/201122-abgeleitete-combobox-element-hat-kein-uebergeordnetes-fenster.html)

Getox 25. Jun 2019 09:54

abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Hallo,

ich habe selber eine Combobox von TCustomComboBox abgeleitet. Ich habe ein Frame erstellt, wo ich diese Combobox einfach nur aus der Komponentenpalette heraus draufziehe - mehr nicht. Von diesem Frame erzeuge ich dann per Code eine Instanz und setze es auf in eine Groupbox, welche sich auf einem Form befindet.
Code:
fFramePerson := TFramePersonen.Create(self);
fFramePerson.Parent := gbPerson;
ob ich als Owner "self" oder die Groupbox übergebe macht keinen Unterschied in Bezug auf mein Problem.

Beim Start des Programms meckert Delphi noch nicht... aber wenn das Form freigegeben wird, wo der Frame drauf ist kommt:
Zitat:

Element 'OtAutoComboBox1' hat kein übergeordnetes Fenster.
Ich kümmere mich nicht um das Freigeben des Frames, da es ja das Form als Owner hat.

Was habe ich falsch gemacht?
Hier meine Komponente (ist bei weitem noch nicht fertig... aber ich will ja erstmal dass es so läuft, bevor ich weiter dran rumbastel). Den Parent setze ich ja sogar manuell im Construktor. Auf dem Frame befinden sich noch weitere von mir abgeleitete Komponenten (von tCustomEdit) und die machen keine Probleme.

Code:
unit otAutoComboBox;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, Graphics, Winapi.Messages, System.Generics.Collections, UnitOtObject;

type
  TOtAutoComboBox = class(TCustomComboBox)
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  private
    { Private-Deklarationen }
    procedure setObjectList(aObjectList: TObjectList<TOtObject>);
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    property objectList: TObjectList<TOtObject> write setObjectList;

    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
    property Align;
    property Font;
    property Height default 24;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('XXXXX', [TOtAutoComboBox]);
end;

{ TOtAutoComboBox }

procedure TOtAutoComboBox.setObjectList(aObjectList: TObjectList<TOtObject>);
var
  i: Integer;
begin
  Items.Clear;
  if aObjectList <> nil then
    for i := 0 to aObjectList.Count - 1 do
      Items.AddObject(aObjectList.Items[i].ToString, aObjectList.Items[i]);
end;

procedure TOtAutoComboBox.WMPaint(var Message: TWMPaint);
var
  CC: TControlCanvas;
begin
  inherited;
  CC := TControlCanvas.Create;
  try
    cc.Control := Self;
    CC.Brush.Color := clGray;
    CC.FrameRect(ClientRect);
  finally
    CC.Free;
  end;
end;

constructor TOtAutoComboBox.Create(AOwner: TComponent);
begin
  inherited;
  AutoSize := False;
  ParentCtl3D := False;
  Ctl3D := False;
  Constraints.MaxHeight := 24;
  Height := 24;
  Font.Size := 11;
  BevelInner := bvNone;
  Parent := AOwner as TWinControl;
end;

destructor TOtAutoComboBox.Destroy;
begin
  objectList := nil;
  inherited;
end;

end.

mkinzler 25. Jun 2019 09:59

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Zieh mal den Parent vor

Delphi-Quellcode:
constructor TOtAutoComboBox.Create(AOwner: TComponent);
begin
  inherited;
  Parent := AOwner as TWinControl;
  AutoSize := False;
  ParentCtl3D := False;
  Ctl3D := False;
  Constraints.MaxHeight := 24;
  Height := 24;
  Font.Size := 11;
  BevelInner := bvNone;
[S] Parent := AOwner as TWinControl;[/S]
end;

Getox 25. Jun 2019 10:03

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Zitat:

Zitat von mkinzler (Beitrag 1435287)
Zieh mal den Parent vor

Habe ich gemacht und der Fehler kommt immer noch.

Edit:
Habe jetzt ein neues leeres Projekt gemacht und nur die Combobox auf das Standardform gezogen. Selbes Problem.

Jasocul 25. Jun 2019 10:26

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Warum setzt du Parent überhaupt manuell?

EWeiss 25. Jun 2019 10:27

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Warum
AOwner: TComponent und nicht direkt als TWinControl

Die Combo ist ein TWinControl.
Zitat:

Warum setzt du Parent überhaupt manuell?
Die Combo benötigt ein Parent oder? Sonst läufts nicht.
Wie man den setzt sollte eigentlich egal sein.

Du musst aber sicherstellen das alle Controls auf denen du die Combo ablegst auch von Typ TWinControl abgeleitet werden.
Kein TWinControl dann geht's in die Hose.

gruss

Jasocul 25. Jun 2019 10:34

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Zitat:

Zitat von EWeiss (Beitrag 1435293)
Zitat:

Warum setzt du Parent überhaupt manuell?
Die Combo benötigt ein Parent oder? Sonst läufts nicht.

Es wird im Create inherited aufgerufen. Es ist also nicht erforderlich.
Klar sollte es auch manuell funktionieren. Aber warum an dieser Stelle? Ich sehe im Moment nicht die Notwendigkeit. Kann natürlich an mir liegen

EWeiss 25. Jun 2019 10:37

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Ich behaupte jetzt einfach mal das sein TFramePersonen kein TWinControl ist..
Und er erwartet das es trotzdem Funktionieren soll.

Zitat:

Es wird im Create inherited aufgerufen. Es ist also nicht erforderlich.
Kann ich nicht sagen dafür beschäftige ich mich Zuwenig mit der VCL.
Wenn ich ein Control unter Win32 erstelle und ich erwarte das es als Parent auf irgendwas liegt dann muss ich es mit SetParent exklusive drauflegen.

gruss

mkinzler 25. Jun 2019 10:39

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Ein Frame ist ein WinControl.

Getox 25. Jun 2019 10:41

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Zitat:

Zitat von Jasocul (Beitrag 1435292)
Warum setzt du Parent überhaupt manuell?

Ich setze den manuell, weil eben dieser Fehler kommt - nur dass dieses manuelle setzen keine Besserung brachte...

Zitat:

Zitat von EWeiss (Beitrag 1435293)
Warum
AOwner: TComponent und nicht direkt als TWinControl

Die Combo ist ein TWinControl.

[...]

Du musst aber sicherstellen das alle Controls auf denen du die Combo ablegst auch von Typ TWinControl abgeleitet werden.
Kein TWinControl dann geht's in die Hose.

gruss

Das mache ich, weil es in TCustomComboBox auch so ist. Wenn ich den Typ ändere, meckert Delphi, dass sich die Deklaration von der vorherigen unterscheidet.


Zitat:

Zitat von EWeiss (Beitrag 1435296)
Ich behaupte jetzt einfach mal das sein TFramePersonen kein TWinControl ist..
Und er erwartet das es trotzdem Funktionieren soll.

Ich habe aber auch ein leeres Projekt angelegt mit nur dieser Combobox auf dem Form und trotzdem kam der Fehler.

EWeiss 25. Jun 2019 10:41

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Zitat:

Zitat von mkinzler (Beitrag 1435297)
Ein Frame ist ein WinControl.

Dann will ich nichts gesagt haben.
Trotz alledem das hin und her zwischen TComponent und TWincontrol erschließt sich mir nicht wirklich.
Habe versucht zu helfen scheint aber nicht mein Thema zu sein.. Ist halt VCL.

gruss

Getox 25. Jun 2019 10:43

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Zitat:

Zitat von EWeiss (Beitrag 1435300)
Zitat:

Zitat von mkinzler (Beitrag 1435297)
Ein Frame ist ein WinControl.

Dann will ich nichts gesagt haben.
Trotz alledem das hin und her zwischen TComponent und TWincontrol erschließt sich mir nicht wirklich.

gruss

Der Parameter muss tComponent sein, weil es in der Elternklasse auch so ist und der Parent ist halt vom Typ tWinControl. Aber ich habe dieses Parent-setzen auch wieder auskommentiert. Das war auch nur ein Versuch diese Fehlermeldung in den griff zu bekommen. Diese kommt unabhängig von dieser Zeile.

EWeiss 25. Jun 2019 10:45

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Binde doch mal beim debuggen die VCL mit ein und versuche dann herauszufinden an was es liegt.
Sorry kann nicht weiter helfen.

gruss

Jasocul 25. Jun 2019 10:52

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Nimm mal alles mit deiner ObjectList aus der Komponente raus und versuche es dann nochmal.
Ich vemute, dass die Fehlermeldung nur ein Folgefehler ist.
Du setzt z.B. die Property im Destroy auf nil, obwohl ihr nie etwas zugewiesen wird.

Getox 25. Jun 2019 11:11

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Zitat:

Zitat von Jasocul (Beitrag 1435303)
Nimm mal alles mit deiner ObjectList aus der Komponente raus und versuche es dann nochmal.
Ich vemute, dass die Fehlermeldung nur ein Folgefehler ist.
Du setzt z.B. die Property im Destroy auf nil, obwohl ihr nie etwas zugewiesen wird.

Genau dieses "auf nil setzen" war schuld an dem Fehler! vielen vielen Dank!

Uwe Raabe 25. Jun 2019 11:24

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Der Fehler tritt beim
Delphi-Quellcode:
Items.Clear
in
Delphi-Quellcode:
setObjectList
wenn, wenn dieses im
Delphi-Quellcode:
Destroy
beim
Delphi-Quellcode:
objectList := nil
aufgerufen wird. Während des
Delphi-Quellcode:
Destroy
sind die Window-Handle schon weg und das
Delphi-Quellcode:
SendMessage
im
Delphi-Quellcode:
Clear
läuft ins Leere.

Jasocul 25. Jun 2019 11:31

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Etwas in der Art, wie Uwe es beschrieben, habe ich vermutet. Aber Uwe kennt die Details da besser. Deswegen wollte ich mich nicht zu weit aus dem Fenster lehnen. :wink:

Getox 25. Jun 2019 11:32

AW: abgeleitete Combobox: Element hat kein übergeordnetes Fenster
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1435307)
Der Fehler tritt beim
Delphi-Quellcode:
Items.Clear
in
Delphi-Quellcode:
setObjectList
wenn, wenn dieses im
Delphi-Quellcode:
Destroy
beim
Delphi-Quellcode:
objectList := nil
aufgerufen wird. Während des
Delphi-Quellcode:
Destroy
sind die Window-Handle schon weg und das
Delphi-Quellcode:
SendMessage
im
Delphi-Quellcode:
Clear
läuft ins Leere.

Ah okay. Danke für die Erklärung :D


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