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; |
AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
Und so?
Delphi-Quellcode:
inherited create(AOwner);
btn := TButton.Create(self); btnParent := self; |
AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
Hmm...
Zitat:
|
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.
|
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 |
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; |
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:
und nun sagt mir bitte mal, warum die TListBox rumzickt.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. Vielen Dank für Eure Mühen im Voraus Beste Grüße aus dem Odenwald mcinternet |
AW: Eigene Komponente:Element hat kein übergeordnetes Fenster
Schau mal, ob Dir hier etwas weiter hilft: https://www.delphipraxis.net/182160-...s-fenster.html
|
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. |
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 02:50 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