AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Eigene Komponente:Element hat kein übergeordnetes Fenster
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Komponente:Element hat kein übergeordnetes Fenster

Ein Thema von mcinternet · begonnen am 21. Mai 2019 · letzter Beitrag vom 22. Mai 2019
Antwort Antwort
Seite 1 von 2  1 2      
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#1

Eigene Komponente:Element hat kein übergeordnetes Fenster

  Alt 21. Mai 2019, 13:30
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;
Miniaturansicht angehängter Grafiken
unbenannt.png  
Jörg

Geändert von mcinternet (21. Mai 2019 um 13:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster

  Alt 21. Mai 2019, 14:40
Und so?
Delphi-Quellcode:
inherited create(AOwner);
  btn := TButton.Create(self);
  btnParent := self;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#3

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster

  Alt 21. Mai 2019, 15:34
Hmm...

Code:
Destructor TMyPanel.Destroy;
begin
  FreeAndNil(btn);//
  inherited; // Und dies fehlte hier auch noch
end;
Und es fehlte das inherited im Destroy...
(Ja ich Verwende Delphi 6 Pro und will NICHT wechseln!)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster

  Alt 21. Mai 2019, 16:02
Stimmt. Aber den Konstruktor braucht man eh nicht, um den Button wieder freizugeben, dafür sorgt ja schon der Owner.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster

  Alt 21. Mai 2019, 16:03
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
Miniaturansicht angehängter Grafiken
unbenannt.png  
Jörg
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#6

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster

  Alt 21. Mai 2019, 16:31
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster

  Alt 21. Mai 2019, 17:02
@Uwe Raabe: das ".SetSubComponent(True);" brachte nix

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
Jörg
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster

  Alt 21. Mai 2019, 17:47
Schau mal, ob Dir hier etwas weiter hilft: https://www.delphipraxis.net/182160-...s-fenster.html
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster

  Alt 21. Mai 2019, 19:32
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.
Heiko
  Mit Zitat antworten Zitat
jziersch

Registriert seit: 9. Okt 2003
Ort: München
251 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Eigene Komponente:Element hat kein übergeordnetes Fenster

  Alt 22. Mai 2019, 08:03
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;
WPCubed GmbH
Komponenten für Delphi:
WPTools, wPDF, WPViewPDF
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 Uhr.
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