Erfreulicherweise habe ich doch noch eine Möglichkeit gefunden, das Objekt in mein Formular zu übernehmen, mit CreateParented geht es:
Delphi-Quellcode:
function GetWinControlFromClass (ClassName: ShortString; InStream: TMemoryStream; AnOwner: TControl): TControl; stdcall;
var
CRef: TPersistentClass;
AControl: TControl;
pn: TPanel;
begin
Result := NIL;
pn := Tpanel.CreateParented(TWinControl(AnOwner).handle); // That Rocks !!
CRef := GetClass(String (ClassName));
if CRef<>nil then
begin
AControl := TControl(TControlClass(CRef).Create(AnOwner));
try
AControl.Parent := pn;
ReadComponent (AControl, Instream);
//AControl.Parent := pn;
pn.BevelOuter := bvNone;
pn.Left := TWinControl (AControl).Left;
pn.Top := TWinControl (AControl).Top;
AControl.Left := 0;
AControl.Top := 0;
if ObjectHasProp (AControl, 'Width', tkInteger) then begin
pn.AutoSize := True;
end else begin
pn.Width := 32;
pn.Height := 32;
end;
pn.Visible := True;
AControl.Visible := True;
Result := TControl (pn);
except
end;
end;
end;
Auf der Aufrufseite darf und braucht keine Parentzuweisung mehr erfolgen, daher kommt es auch nicht mehr zum Asign (TFont) usw. und alles funktioniert wie gewünscht (kleine Einschränkung, für das Objekt funktioniert kein Align). Kann das zurückgegebene Panel dann in die Form oder z.B. in ein anderes Panel einfügen.
Einzige Sache, die mich gerade etwas irritiert: Es funktioniert mit TEdit, TButton, TListBox, usw., aber nicht mit TSpeedButton.
Das TSpeedbutton-Objekt wird ordnungsgemäß erzeugt, aber nicht angezeigt. Warum nur (TSpeedButton ist natürlich als Klasse in der
DLL registiert)?