Juhas napisał(a)
Zaraz.
Najpierw tworzysz frame'a:
frame:=TFrame.Create(owner);
frame.parent:=owner; //przeważnie, ale nie zawsze się tak uda
//potem tworzysz inne komponenty
panel:=TPanel.Create(frame);
panel.parent:=frame;
//i na koniec label:
myLabel:=TLabel.Create(panel);
myLabel.Parent:=panel;
kontrolki mają taki konstruktor jak CreateParented, co pewnie powoduje zastąpienie dwóch linii kodu jedną, ale osobiście nigdy tego nie używałem, więc nie wiem.
Jak będziesz miał tak napisany kod, jak wyżej przedstawiłem, to nie ma bata, musi działać.
Wiesz gdy tworze komponenty dynamicznie to wszystko jest ok, problemem jest TFrame i komponenty zdefiniowane w w dfm.
shell:=sh;
Application:=shell.GetApplication;
Screen:=shell.GetScreen;
panel:=TPanel.Create(shell.GetParent);
panel.ParentWindow:= shell.GetParent.Handle;
panel.Parent:=shell.GetParent;
panel.Align:=alClient;
panel.BevelOuter:=bvNone;
Frame:=TFrame2.CreateParented(panel.Handle);
Frame.Parent:=panel;
panel.Caption:='';
panel.Visible:=false;
Jeśli np tworze obiekt t frame tak to się wywala (kod w dll) shell.GetParent to TPanel.
"control has no parent window"
Ale gdy tworze komponent tak:
shell:=sh;
Application:=shell.GetApplication;
Screen:=shell.GetScreen;
panel:=TPanel.Create(shell.GetParent);
panel.ParentWindow:= shell.GetParent.Handle;
panel.Parent:=shell.GetParent;
panel.Align:=alClient;
panel.BevelOuter:=bvNone;
panel.DockSite:=true;
Form1:=TForm1.Create(nil);
form1.Frame21.ParentWindow:=panel.Handle;
form1.Frame21.Parent:=panel;
Frame:=form1.Frame21;
panel.Caption:='';
panel.Visible:=false;
To działa, musze po prostu tworzyc obiekt na oknie i go potem z niego przenosić.
Ciekawostą jest też to że np w pierwszym przypadku bez względu czy użyje CreateParented czy Create efekt jest ten sam. Kolejną zabwaną rzeczą jest to że gdy na tym TFrame znajduje się np tylko Memo to działa, ale jak już to memo wrzuce na panel to się wywala.
Miał ktoś taki przypadek ? a może jakoś inaczej da się to zrobić. (Niechce sie bawić w dokowanie okien)