Delphi-PRAXiS
Seite 1 von 2  1 2   

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 Eigene Komponente:Element hat kein übergeordnetes Fenster (https://www.delphipraxis.net/200745-eigene-komponente-element-hat-kein-uebergeordnetes-fenster.html)

mcinternet 21. Mai 2019 12:30

Eigene Komponente:Element hat kein übergeordnetes Fenster
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,

mal wieder was kniffeliges.

Ich habe eine Komponente (TDruckerPanel) gebaut, abgeleitet von TPanel.

Wenn ich diese auf eine Form ziehen will, dann kommt o.g. unrühmliche Fehlermeldung (siehe Bild im Anhang).

Wer hat da für mich mal nen Rat?

EDIT: Auch ein inherited create(AOwner) bringt nix.

Hier mal der Code der Komponente:

Code:
unit uTestPanel;

interface

   uses System.Classes, Vcl.ExtCtrls, Vcl.StdCtrls;


   Type
     TMyPanel = Class(TPanel)
   private
   //
     btn : TButton;
   public
     Constructor Create(AOwner : TComponent); Override;
     Destructor Destroy; Override;
   End;

implementation

uses System.SysUtils;

Constructor TMyPanel.Create(AOwner : TComponent);
begin
  inherited create(AOwner);
  btn := TButton.Create(AOwner);
end;

Destructor TMyPanel.Destroy;
begin
  FreeAndNil(btn);//
end;

DeddyH 21. Mai 2019 13:40

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
 
Und so?
Delphi-Quellcode:
inherited create(AOwner);
  btn := TButton.Create(self);
  btnParent := self;

HolgerX 21. Mai 2019 14:34

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
 
Hmm...

Zitat:

Zitat von mcinternet (Beitrag 1432699)
Code:
Destructor TMyPanel.Destroy;
begin
  FreeAndNil(btn);//
  inherited; // Und dies fehlte hier auch noch
end;

Und es fehlte das inherited im Destroy... ;)

DeddyH 21. Mai 2019 15:02

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
 
Stimmt. Aber den Konstruktor braucht man eh nicht, um den Button wieder freizugeben, dafür sorgt ja schon der Owner.

mcinternet 21. Mai 2019 15:03

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also, ich hab da auch nochmal einiges getestet.

Dieses TMyPanel war ja nur ein kleiner Teil des Ganzen.

es funktioniert mit: xyz := TPanel.Create(self);

ja, das inherited muss auch drin sein.

Interessant wird es aber an ganz anderer Stelle!

wenn man eine TListbox erzeugt: ListBox1.Create(self) - das funktioniert auch. Aaaaaaber!!! Nur wenn das Panel darunter groß genug ist! Ich habe das jetzt mal auf Hight 400 und Width 250 gesetzt.
Der nächste Punkt bei der TListbox, der einen Knall verursacht: ListBox1.ScrollWidth := .... knallt ebenfalls.
Dann noch ein Punkt: Läßt man die TListBox leer, dann klappt das auch soweit.
Füllt man sie aber:

ListBox1.Items := Printer.Printers; // Hier knallt es schon!

Das ist recht unschön. Wie meine Komponente jetzt in der IDE aussieht, siehe Anhang.

Beste Grüße

mcinternet

Uwe Raabe 21. Mai 2019 15:31

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
 
Eventuell hilft ein Aufruf von SetSubComponent:
Delphi-Quellcode:
Constructor TMyPanel.Create(AOwner : TComponent);
begin
  inherited create(AOwner);
  btn := TButton.Create(Self);
  btn.SetSubComponent(True);
  btn.Parent := Self;
end;

mcinternet 21. Mai 2019 16:02

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
 
@Uwe Raabe: das ".SetSubComponent(True);" brachte nix :roll:

Ich geb Euch hier mal ein bisschen code:

Code:


unit uDruckerPanel;

interface

  uses System.Classes, Vcl.ExtCtrls, Vcl.StdCtrls, AboutOwn;



  Type


    TDruckerPanel = Class(TPanel)
    private
      fLBDruckerAusWahl : TListbox;
      flblUeberschrift : TLabel;
      flblAnzeigen    : TLabel;
      flblAuswahl     : TLabel;
      fDrucker : String;
<snip>
.
.
.
.
.
.
.
  End;





implementation

//uses Printers;
uses System.SysUtils, VCL.Forms, System.IniFiles, VCL.Printers, VCL.Controls, Vcl.Graphics;

Procedure TDruckerPanel.Init;
begin
   
   <snip>
   height     := 400;
   width      := 250;
end;

Procedure TDruckerPanel.WriteDruckerName(sDrucker : String);
Begin
   fDrucker := sDrucker; //
   flblAuswahl.Caption := fDrucker;
End;

Procedure TDruckerPanel.WriteDruckerNummer(sNr : Integer);
Begin
  fDruckerNummer := sNr; //
  Printer.PrinterIndex := sNr;
End;



Procedure TDruckerPanel.Show;
begin
 inherited;
  fLBDruckerAusWahl.Show;

  Application.ProcessMessages;
end;

Constructor TDruckerPanel.Create(AOwner : TComponent);
  var x   : integer;
  var ini : TIniFile;
begin
  inherited create(AOwner);
  Init;

  ParentFont := false;
  ParentColor := false;
  color := clMoneyGreen;

  fPanTop := TPanel.Create(self);
  fPanTop.Parent := self;
  fpanTop.Height := 25;
  fPanTop.Align := alTop;
  fPanTop.ParentColor := false;
  fPanTop.color := clMoneyGreen;

  fPanBottom := TPanel.Create(self);
  fPanBottom.Parent := self;
  fPanBottom.Height := 25;
  fPanBottom.Align := alBottom;

  fPanMid := TPanel.Create(self);
  fPanMid.Parent := self;
  fPanMid.Align := alClient;


  flblUeberschrift := TLabel.Create(self);
  flblUeberschrift.Parent := fPanTop;
  flblUeberschrift.Left := 20;
  flblUeberschrift.Top := 5;
  flblUeberschrift.Caption := 'Druckerauswahl';
  flblUeberschrift.ParentFont := false;
  flblUeberschrift.Font.Size := 10;


  fLBDruckerAusWahl := TListbox.Create(self);
  fLBDruckerAusWahl.SetSubComponent(True); // Brachte nix - ist drin - stört nicht
  fLBDruckerAusWahl.Parent := fPanMid;
  fLBDruckerAusWahl.Align := alClient;
  fLBDruckerAusWahl.ParentFont := false;
  fLBDruckerAusWahl.Font.Size := 8;

  flblAnzeigen := TLabel.Create(self);
  flblAnzeigen.Parent := fPanBottom;
  flblAnzeigen.Top := 5;
  flblAnzeigen.Left := 14;
  flblAnzeigen.Caption := 'Auswahl:';
  flblAnzeigen.ParentFont := false;
  flblAnzeigen.Font.Size := 10;

  flblAuswahl := TLabel.Create(self);
  flblAuswahl.Parent := fPanBottom;
  flblAuswahl.Top := flblAnzeigen.Top;
  flblAuswahl.Left := 73;
  flblAuswahl.ParentFont := false;
  flblAuswahl.Font.Size := 10;


   // Alles hab hier muss in der IDE ausgeblendet werden,
   // sonst knallt es!
  //------------------
  if not (CsDesigning in ComponentState) then
  begin
    fLBDruckerAusWahl.Items := Printer.Printers;
    fLBDruckerAusWahl.ItemIndex := Printer.PrinterIndex;
   <snip>
    application.ProcessMessages;
  end;
end;



Destructor TDruckerPanel.Destroy;
begin

  freeandnil(flblAuswahl);
  freeandnil(flblAnzeigen);
  freeandnil(fLBDruckerAusWahl);
  freeandnil(flblUeberschrift);
  FreeAndNil(fPanMid);
  FreeAndNil(fPanBottom);
  FreeAndNil(fPanTop);
  inherited;
end;

end.
und nun sagt mir bitte mal, warum die TListBox rumzickt.

Vielen Dank für Eure Mühen im Voraus


Beste Grüße aus dem Odenwald

mcinternet

stahli 21. Mai 2019 16:47

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
 
Schau mal, ob Dir hier etwas weiter hilft: https://www.delphipraxis.net/182160-...s-fenster.html

hoika 21. Mai 2019 18:32

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
 
Hallo,
ich würde mal Loaded in die Diskussion reinwerfen.

Ich denke, im Constructor sind die Fenster-Handles (die darunterliegenden Windows-Fenster) noch gar nicht erzeugt.

jziersch 22. Mai 2019 07:03

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
 
Do kannst Sachen die ein erzeugtes Window Handle erfordern später machen in der prozedur CreateWnd

procedure TDruckerPanel.CreateWnd;
begin
inherited;
fLBDruckerAusWahl.Items := Printer.Printers;
fLBDruckerAusWahl.ItemIndex := Printer.PrinterIndex;
// Nein, das nicht: application.ProcessMessages;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf