Autor Beitrag
JRegier
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Di 07.06.05 14:03 
Hallo, ich bin am Componenten Entwickeln und hab folgendes Problem!

Fehlermeldung: Element hat kein Übergeordnetes Fenster

Hier der Code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
TResizeControl = class(TCustomPanel)
    private
    FToolBar : TToolBar;
    FUpDownBtn : TSpeedButton;
    FCombo : TComboBox;
    
    protected

    public
    constructor Create(AOwner : TComponent); override;
    
    published
    end;

procedure Register;
....

constructor TResizeControl.Create(AOwner : TComponent);
begin
   inherited Create(AOwner);
   Parent := TWinControl(AOwner);     { Hier weiß ich nicht richtig,
                                        bei anderen Componenten die Ich entwickelt habe
                                        auch direkt hier den Parent gesetzt dann war die  
                                        Fehlermeldung weg aber die Componenten landeten
                                        immer in Form1 und nicht auf einer anderen Componente,                                          aber jetzt kommt die Fehlermeldung trotzdem}

   
   FToolBar := TToolBar.Create(Self);
   FToolBar.Parent := Self;

   FUpDownBtn := TSpeedButton.Create(FToolBar);
   FUpDownBtn.Glyph.LoadFromResourceName(HInstance, 'UP');
   FUpDownBtn.Parent := FToolBar;

   FCombo := TComboBox.Create(FToolBar);
   ....
   FCombo.Parent := FToolBar;
end;


Ich habe früher schon mal das hier im Forum angesprochen aber keine gescheite Antwort
bekommen!

Müsste ich ein property Parent machen und dan das SetParent überschreiben?
Und da alle Componenten.Parents setzen? Habe es auch versucht mit einem Ergebnis
Stappelüberlauf, wahrscheinlich rekursiver aufruf!
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Di 07.06.05 14:35 
Hallo,

anstatt in der Create, ist es besser, die Controls in der CreateWnd zu erzeugen (zumindest funktioniert dies bei meinen Komponenten problemlos). Da kannst Du dann auch den Parent in der Form MyControl.Parent:=Self; zuweisen.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Di 07.06.05 14:49 
user profile iconsmiegel hat folgendes geschrieben:
Hallo,

anstatt in der Create, ist es besser, die Controls in der CreateWnd zu erzeugen (zumindest funktioniert dies bei meinen Komponenten problemlos). Da kannst Du dann auch den Parent in der Form MyControl.Parent:=Self; zuweisen.


CrateWnd ist auch ein Constructor von TControl das man überschreiben muß?
einfach Create in CreateWnd umbenennen?
smiegel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Di 07.06.05 15:36 
Hallo,

Nein, CreateWnd ist ein Methode, die überschrieben werden kann. Sie wird beim Erstellen der Komponente automatisch aufgerufen. Näheres siehe Delphi-Hilfe.

_________________
Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Di 07.06.05 17:07 
user profile iconsmiegel hat folgendes geschrieben:
Hallo,

Nein, CreateWnd ist ein Methode, die überschrieben werden kann. Sie wird beim Erstellen der Komponente automatisch aufgerufen. Näheres siehe Delphi-Hilfe.


Ach ich habs versucht aber es kommt trotzdem Fehlermeldung! Die CreateWnd procedur
wird schon ausgeführt bevor der constructor ganz ausgeführt wurde! Hab ein bischen
rumexperimentiert, also wenn ich Items zur ComboBox hinzufüge zeigt er diese Fehler-
meldung Element hat kein Übergeordnetes Fenster! Davor hatte ich alles zusatzcomponenten
die ich auf dem CustomPanel anordne in CreateWnd erzeugt aber CreateWnd ruft sich selber
auf wenn ich den Parent der Componenten setze "Stappelüberlauf"! Wie macht man das den Richtig?

Ich will nicht an so eine Kleinigkeit doch ein ganzes Projekt scheitern lassen!
Ich sehe das Programm wie das werden soll und komme mit so eine Kleinigkeit nicht weiter!
Habe ja vorher so gemacht wie jetzt aber diese Fehlermeldung werde ich diesmal nicht
los wie vorher!
Mottor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Di 07.06.05 18:14 
Dein Problem ist hier: ...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
   FCombo := TComboBox.Create(FToolBar);
   ....  <-
   FCombo.Parent := FToolBar;

   FCombo := TComboBox.Create(FToolBar);
   FCombo.Items.Add('BlaBla');   <-  Error
   FCombo.Parent := FToolBar;


   FCombo := TComboBox.Create(FToolBar);
   FCombo.Parent := FToolBar;
   FCombo.Items.Add('BlaBla');   <-  No Error


Moderiert von user profile iconMotzi: Delphi-Tags hinzugefügt.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 07.06.05 18:51 
Es ist überhaupt schlechter Stil den Parent im Constructor auf den Owner zu setzen! Der Owner ist nicht umsonst vom Typ TComponent! Wenn die Komponente im Designer verwendet wird kümmert sich sowieso dieser darum, dass die Komponente den Parent zugewiesen bekommt, wenn die Komponente dynamisch erzeugt wird muss sich der Programmierer um das Setzen des Parents eben selbst kümmern - ist ja bei den VCL-Komponenten auch nicht anders!

Und was meinst du mit:
Zitat:
Müsste ich ein property Parent machen und dan das SetParent überschreiben? Und da alle Componenten.Parents setzen? Habe es auch versucht mit einem Ergebnis Stappelüberlauf, wahrscheinlich rekursiver aufruf!

:?!?: :nixweiss:

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Mi 08.06.05 08:35 
user profile iconMotzi hat folgendes geschrieben:
Es ist überhaupt schlechter Stil den Parent im Constructor auf den Owner zu setzen!


Ich hatte halt die Fehlermeldung Element hat kein übergeordnetes Fenster und
als ich den Parent auf den Owner gesetzt hatte schien das Problem gelöst zu sein!

user profile iconMotzi hat folgendes geschrieben:

Und was meinst du mit:
Zitat:
Müsste ich ein property Parent machen und dan das SetParent überschreiben? Und da alle Componenten.Parents setzen? Habe es auch versucht mit einem Ergebnis Stappelüberlauf, wahrscheinlich rekursiver aufruf!

:?!?: :nixweiss:


Aber das Problem ließ sich im anderen Falle so nicht lösen, also hab ich gedacht das man die Parents wo anders setzen müßte!

Der "Grundgedanke" war hier bei mir, daß wenn ich z.B. den Parent der TCustomPanel nicht setze im constructor und dann aber den anderen Componenten sage daß der Parent das TCustomPanel ist
das dies zu dieser Fehlermeldung führte!

user profile iconschmiegel hat folgendes geschrieben:
anstatt in der Create, ist es besser, die Controls in der CreateWnd zu erzeugen (zumindest funktioniert dies bei meinen Komponenten problemlos). Da kannst Du dann auch den Parent in der Form MyControl.Parent:=Self; zuweisen.


Dann habe ich in CreateWnd die Items zur ComboBox hinzugefügt, aber die CreateWnd Prozedur
wird ja schon aufgerufen bevor der constructor abgearbeitet wurde! "Zugriffsverletzung"
Also habe ich abgefragt ob Assigned(ComboBox) "Zugriffsverletzung weg" aber die ursprüngliche
Fehlermeldung kamm wieder: Element hat kein übergeordnetes Fenster

user profile iconMottor hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 FCombo := TComboBox.Create(FToolBar);   
   FCombo.Items.Add('BlaBla');   <-  Error   
   FCombo.Parent := FToolBar;   


   FCombo := TComboBox.Create(FToolBar);   
   FCombo.Parent := FToolBar;   
   FCombo.Items.Add('BlaBla');   <-  No Error


Also würde in diesem Fall nicht eine Fehlermeldung kommen? Auch wenn der Parent von
TCustomPanel noch nicht gesetzt wurde?
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mi 08.06.05 09:59 
Ok, poste am besten mal deinen gesamten Code (oder häng ihn an wenn er zu lang ist), und ich schau ihn mir mal an. Ich hab das Gefühl du hast ein paar grobe Fehler im Design.
Komponenten-Entwicklung ist leider nicht ganz einfach, man muss sich an gewisse "Regeln" halten die die VCL vorgibt. Dazu gehört unter anderem, dass es gewisse Zeitpunkte gibt wann man etwas tut und wann nicht. Und dazu gehört, dass man (im Normalfall) nicht im Constructor den Parent setzt! ;)

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Mottor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Mi 08.06.05 10:52 
FToolBar braucht Window :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
constructor TResizeControl.Create(AOwner : TComponent);
begin
   inherited ;
   FToolBar := TToolBar.Create(Self);
   FToolBar.Parent := Self;

   FUpDownBtn := TSpeedButton.Create(FToolBar);
   FCombo := TComboBox.Create(FToolBar);
end;

procedure TResizeControl.CreateWnd;
begin
  inherited;

   FUpDownBtn.Parent := FToolBar;
   FCombo.Parent := FToolBar;
   FUpDownBtn.Glyph.LoadFromFile('D:\Icons\CancelGlyph.bmp');
   FCombo.Items.Add('BlaBla');

end;
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Do 09.06.05 07:27 
user profile iconMottor hat folgendes geschrieben:
FToolBar braucht Window :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
constructor TResizeControl.Create(AOwner : TComponent);
begin
   inherited ;
   FToolBar := TToolBar.Create(Self);
   FToolBar.Parent := Self;

   FUpDownBtn := TSpeedButton.Create(FToolBar);
   FCombo := TComboBox.Create(FToolBar);
end;

procedure TResizeControl.CreateWnd;
begin
  inherited;

   FUpDownBtn.Parent := FToolBar;
   FCombo.Parent := FToolBar;
   FUpDownBtn.Glyph.LoadFromFile('D:\Icons\CancelGlyph.bmp');
   FCombo.Items.Add('BlaBla');

end;


Hallo, Sie haben hier einfach inherited; geschrieben. Ich hatte inherited Create(AOwner); geschrieben! Ist das gleiche?
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Do 09.06.05 09:41 
user profile iconJRegier hat folgendes geschrieben:
Hallo, Sie haben hier einfach inherited; geschrieben. Ich hatte inherited Create(AOwner); geschrieben! Ist das gleiche?

Ja.. wenn du nur inherited; ohne irgendwas schreibst, schaut der Compiler ob es in der Basisklasse eine Methode mit demselben Namen und derselben Parameterliste gibt, wie die Methode aus der heraus das inherited aufgerufen wird. Ist das nicht der Fall, so muss der Name der Methode und die zu übergebenen Parameter explizit hinter inherited augeführt werden. Man kann das zur besseren Lesbarkeit aber auch immer machen..

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
JRegier Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1268

Win XP Home, Prof, 2003 Server
D6 Enterprise
BeitragVerfasst: Do 09.06.05 09:54 
user profile iconMotzi hat folgendes geschrieben:

Gruß, Motzi


Gruß, JRegier :wink: