| Autor |
Beitrag |
JRegier
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: 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:
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); 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
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: 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 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Di 07.06.05 14:49
smiegel 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
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: 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 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Di 07.06.05 17:07
smiegel 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
      
Beiträge: 19
|
Verfasst: Di 07.06.05 18:14
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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! |

_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
JRegier 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Mi 08.06.05 08:35
Motzi 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!
Motzi 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! |
 |
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!
schmiegel 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
Mottor hat folgendes geschrieben: |
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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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
      
Beiträge: 19
|
Verfasst: Mi 08.06.05 10:52
FToolBar braucht Window :
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 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Do 09.06.05 07:27
Mottor hat folgendes geschrieben: | FToolBar braucht Window :
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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 09.06.05 09:41
JRegier 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 
      
Beiträge: 1268
Win XP Home, Prof, 2003 Server
D6 Enterprise
|
Verfasst: Do 09.06.05 09:54
Motzi hat folgendes geschrieben: |
Gruß, Motzi |
Gruß, JRegier 
|
|