Toon posts:

[Delphi] Error: Control has no parent window

Pagina: 1
Acties:
  • 465 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een object gebaseerd op TCustomControl met verder geen functies.

Ik krijg steeds de foutmelding: Control has no parent window

Wat doe ik verkeerd?

  • jopiek
  • Registratie: September 2000
  • Laatst online: 21-08 19:56

jopiek

Tja... 'ns ff denken.

Op donderdag 13 september 2001 16:31 schreef tokkie het volgende:
Ik heb een object gebaseerd op TCustomControl met verder geen functies.

Ik krijg steeds de foutmelding: Control has no parent window

Wat doe ik verkeerd?
lijkt me een duidelijke melding! gewoon een parent toevoegen.

maak - als je dat nog niet had - een constructor die de default constructor override

bij public

constructor TMyCustomControl.Create(Sender :TObject)
begin
inherited Create(sender);
self.parent := sender; //bijv
end;

nu roep je vanuit het form waar je dit ding aanmaakt de create methode aan self als sender...

Cogito Ergo Credo


Verwijderd

Op donderdag 13 september 2001 16:48 schreef jopiek het volgende:

maak - als je dat nog niet had - een constructor die de default constructor override

[..]

nu roep je vanuit het form waar je dit ding aanmaakt de create methode aan self als sender...
Volgens mij werkt het (officieel) eigenlijk niet helemaal zo. Tenminste de componenten van Delphi zelf assignen de Parent niet in de constructor. De "Sender" die je meegeeft aan de constructor wordt de Owner van het component, dat is het component dat verantwoordelijk is voor het verwijderen van het component. De Parent is een echt Windows-window (TWinControl) dat verantwoordelijk is voor het tekenen en het doorgeven van messages en zo. Als je een Form hebt met daarop een Panel, dat op zijn beurt weer een Label bevat, is het Form de Owner van het Label, en het Panel de Parent. Als je een Form maakt in de IDE van Delphi gaat dat allemaal automatisch, maar als je componenten run-time aanmaakt, moet je zelf de Parent zetten. De constructor van dat component is daar dus eigenlijk niet voor bedoeld.

Om een control (bijvoorbeeld een label) runtime aan te maken, moet je het volgende doen:
code:
1
2
3
4
5
6
procedure TMyForm.Blabla;
var ALabel: TLabel;
begin
  ALabel := TLabel.Create(Self);  // de owner is dus het form
  ALabel.Parent := Self;  // de parent is ook het form
end;

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 04-09 14:38

curry684

left part of the evil twins

Op donderdag 13 september 2001 16:31 schreef tokkie het volgende:
Ik heb een object gebaseerd op TCustomControl met verder geen functies.

Ik krijg steeds de foutmelding: Control has no parent window

Wat doe ik verkeerd?
Je moet als je een component dynamisch alloceert de Parent zetten voordat je 'actieve' properties zoals Enabled en Visible gaat veranderen, of Show erop aanroept (specifiek Show veroorzaakt deze knaller). Dit mag je dus ook niet in de constructor van je TCustomControl derivant doen.

En inderdaad de Owner is HEEL ERG IETS ANDERS dan de Parent, en het is heel slechte praktijk om ze per definitie gelijk te trekken.

Professionele website nodig?