Zitat von
IngoD7:
Was stimmt an meinen Lösungsvorschlägen (nimm mein letztes Posting dazu her) denn nicht?
Zitat von
IngoD7:
Zwei mögliche Fälle:
1.) Er weiß zur Laufzeit, wo das Teil zu liegen kommt.
Damit kann er z.B. meinen ersten (Owner=Parent, aber weniger gut) oder meinen letzen Vorschlag (Parent dem Konstruktor mit übergeben) benutzen. Der letzte Vorschlag kam später als Nachtrag und hat sich möglicherweise mit deinem Posting überschnitten.
Ok, was heißt denn wissen wo man zur Laufzeit zum liegen kommt? Ich meine nehmen wir deinen zweiten Vorschlag:
Zitat von
IngoD7:
Als letztes
könnte man auch einen Parent getrennt mit übergeben (so würde ich es wahrscheinlich machen):
Delphi-Quellcode:
X:=TMyClass.Create(Form1, Panel2);
...............
constructor TMyClass.Create(Compo:TComponent; WinC: TWinControl);
begin
inherited create(Compo);
parent:=WinC;
combo:=TCombobox.Create(self);
combo.Parent:=self;
end;
Wichtig für sein Problem ist nur, dass die Eigenschaft Parent
direkt beim Erzeugen belegt wird. Mehr wollte ich nicht ausdrücken.
Hier übergibst Du als Parent Panel2, ist ein Panel. Ok, wo ist die Garantie dafür, dass ein Panel eine Form als Parent hat? Wie sieht es denn bei folgendem Code aus:
Delphi-Quellcode:
var panel2: TPanel;
x: TMyClass;
begin
panel2 := TPanel.Create(Form1);
x := TMyClass.Create(Form1, Panel2);
...
end;
Hier ist doch alles so übergeben, wie Du es vorschlägst oder sehe ich das falsch? Na ja, genau hier dürfte es trotz allem krachen, weil es ebend für die Combobox immer noch kein übergeordnetes Fenster gibt. Wie Du siehst ist hier der spätere Parent schon erzeut, mit der Existenz eines Parents lässt sich das Problem also nicht lösen.
Zitat von
IngoD7:
2.) Der spätere Parent ist selbst vielleicht noch gar nicht erzeugt, wenn das Panel-Combo-Objekt erzeugt wird.
Dann übergebe ich "irgendeinen" Parent und setze Visible vom Panel-Combo-Objekt zunächst auf false.
Das könnte auch sogar der Konstruktor erledigen, indem er alle Komponenten der Applikation durchsucht und das erstbeste TForm, dass er findet, vorübergehend als Parent nimmt (bei Visible:=false).
Gut, wann setzt man visible wieder auf true? Nebenbei bemerkt auch die Sichtbarkeit ändert nichts am Problem, es wird der selbe Fehler ausgelöst.