Delphi: Wie ändert man die Steuerelemente in Delphi?

Ich habe eine 2 verschiedene DLL erstellt und sie haben verschiedene Steuerelemente von TCustomPanel gesteuert, aber diese 2 Steuerelemente haben eine gleiche Schnittstelle und diese Schnittstelle besitzen ein Setparent-Verfahren!

Das ist die Frage: Wenn ich diese Steuerelemente aus DLL erstellen, muss ich Eltern des Steuerelements Form1 zuerst festlegen (Kein Problem von hier!), Wenn ich Eltern des Steuerelements (von der DLL) ändern möchte, kann die Anwendung festlegen Elternteil, aber ich kann die Kinderkontrolle nicht mehr sehen :(

Ich habe die Position der Kindersicherung in neuen Eltern (links und oben und Breite und Höhe) kein Problem überprüft. Ich habe den Klassennamen des Elternobjekts überprüft, auch kein Problem (er zeigt mir den neuen übergeordneten Kontrollklassennamen)

Ich überprüfte die Kindersteuerung und die Kontrollzahl der neuen Elternkontrolle, alles ist gut

aber ich kann das Steuerelement auf dem Bildschirm nicht sehen, nachdem ich versucht habe, Eltern zu wechseln!

Hinweis: Diese 2 Steuerelemente (Kind und Eltern) stammen aus verschiedenen DLLs

Danke für Ihre Hilfe

Code

PIMediaComponent = ^IMediaComponent;
  PIPluginList    = ^IPluginList;
  IMediaComponent = interface
    ['{59C0BBCE-3185-4DF5-B8F2-9DAC8324D092}']
    function Invoke(method: PAnsiChar; p: array of TValue): TValue;
    function getObjectName(): PAnsiChar;
    function getObjectID(): integer;
    function getControl(): TWinControl;
    procedure setObjectID(id: integer);
    procedure setPositions(X,Y,W,H : integer);
    procedure assign_media(__file: PDataItem);
    procedure assing_events(__name: PAnsiChar; var event: pointer);
    procedure playmedia();
    procedure stopmedia();
    procedure setParent(p: TWinControl);
    procedure remove;
  End;

  IPluginList = interface
    ['{2CE6855D-165D-4381-9784-DAFEC9A7BBA9}']
    procedure RemovePlugin(PluginName: PAnsiChar);
    function ExecutePlugin(PluginName: PAnsiChar): Boolean;
    function getObject(ObjectName: PAnsiChar; ObjectID: integer = 0): IMediaComponent;
  end;

Klassenobjekt in der Child-Control-DLL

TVLCVideo = class(TVLCBase, IMediaComponent)
  private
    FObjectID     : integer;
    file_info     : PDataItem;
    FOnFinished   : TNotifyEvent;
    FOnStarted    : TNotifyEvent;
    procedure OnFinishProc(Sender: TObject);
    procedure OnStartProc(Sender: TObject);
  protected
    { Protected declarations }
  public
    function Invoke(method: PAnsiChar; p: array of TValue): TValue;
    procedure assign_media(__file: PDataItem);
    procedure assing_events(__name: PAnsiChar; var event: pointer);
    procedure playmedia();
    procedure stopmedia();
    procedure setParent(p: TWinControl);
    function getObjectName(): PAnsiChar;
    function getObjectID(): integer;
    procedure setObjectID(id: integer);
    procedure setPositions(X,Y,W,H : integer);
    function getControl(): TWinControl;
    procedure remove;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property OnFinished: TNotifyEvent read FOnFinished write FOnFinished;
    property OnStarted: TNotifyEvent read FOnStarted write FOnStarted;
  end;

procedure TVLCVideo.setParent(p: TWinControl);
var
  sName : string;
  vIntf: IMediaComponent;
  vParams: array[0..0] of TValue;
begin
 // Self.ParentWindow := p.Handle;
    Self.Parent := p;
    Self.FParentWindow   := p.Handle;

    if Supports(Self.Parent, IMediaComponent, vIntf) then
    begin
      sName := pchar(getObjectName());
      vParams[0] := TValue.FromVariant(sName);
      vIntf.Invoke('GetActiveComponent', vParams);
    end;
end;

Ich probiere das nur in der Hauptform aus: Ich habe TButton und TPanel in das Formular eingefügt und dann das Programm ausgeführt. Wenn ich auf die Schaltfläche klicke, kann das Elternobjekt TVLCVideo-Objekt geändert werden, aber ich kann das Objekt nicht auf dem Bildschirm sehen :(

Button und Panel1 ist keine Laufzeitkomponente, ich habe sie zur Entwurfszeit dem Formular hinzugefügt!

Dies ist Button onclick-Ereignis:

Procedure TControllerMain.BtnOnClick(Sender: TObject);
begin
    Plugins.getObject('VIDEOPLAYER',0).setParent(view.Panel1);
    Plugins.getObject('VIDEOPLAYER',0).setPositions(0,0, 200, 200);
end;

Ich habe keine Fehlermeldung vom Compiler oder von der Laufzeit erhalten. Ich kann das TVLCVideo-Steuerelement nach dem Ändern des Elterns nicht sehen :(

Und ich benutze Delphi 2010

1
Warum verwenden Sie DLLs anstelle von Paketen?
hinzugefügt der Autor Joe White, Quelle
Auch hier werde ich fragen: Warum verwenden Sie DLLs anstelle von Paketen? Wenn Sie DLLs verwenden, hat jede DLL ihre eigene Kopie der TWinControl-Klasse (und alles andere bis hinunter zu TObject), so dass einige Dinge nicht sehr gut zusammen funktionieren. Wenn Sie Pakete verwenden, erhalten Sie die gleiche Modularität, aber alles verwendet die gleiche TWinControl-Klasse, so dass Typumwandlung funktioniert. Für das Laden von Modulen wurden Pakete entwickelt, für die entworfen wurde . Wenn Sie sie nicht benutzen, werden Sie seltsame Probleme haben. Ich kann nicht sagen, ob die seltsamen Probleme, die du hast, sind, weil du keine Pakete verwendest, aber sie könnten sehr gut sein.
hinzugefügt der Autor Joe White, Quelle
Sie haben mehr als eine Instanz der VCL. Das funktioniert nicht. Verwenden Sie Pakete oder schreiben Sie eine vollständige Plugin-API, die die VCL-Anzahl auf 1 festlegt.
hinzugefügt der Autor David Heffernan, Quelle
Willkommen bei StackOverflow. Es ist wirklich schwierig, eine Frage zu beantworten, bei der Sie keinen Code angegeben haben und Ihre Beschreibung nicht sehr klar ist. Bitte denken Sie daran, dass wir keine Informationen zu Ihrem Problem haben, außer dem, was Sie uns mitteilen, und dass wir Ihren Bildschirm oder Code von hier aus nicht sehen können. Das Einzige, woran wir arbeiten müssen, ist die Frage, die Sie stellen. Wenn Sie keine klaren Details (oder zumindest eine klare Beschreibung des Problems und etwas Code zum Lesen) bereitstellen, ist es sehr schwer, Ihnen zu helfen, Ihr Problem zu lösen. :)
hinzugefügt der Autor Ken White, Quelle
Weil jedes Steuerelement wie ein Modul der Hauptanwendung ist. Die Hauptanwendung ist leer. Sie haben keine Kontrolle über das Formular. Er muss alles Laufzeit von Modulen erstellen. Vielleicht kann ich in Zukunft ein neues Modul schreiben (zB als Plugin)
hinzugefügt der Autor relativ, Quelle
Hallo Ken, danke für deine Antwort. Kannst du es noch einmal überprüfen?
hinzugefügt der Autor relativ, Quelle