Delphi: comment changer les contrôles parent dans Delphi?

J'étais créer une dll 2 différente et ils ont différents contrôles drived de TCustomPanel mais ce 2 contrôles a une même interface et cette interface possède une procédure setparent!

Telle est la question: lorsque je crée ces contrôles à partir d'une dll, je dois d'abord définir l'objet Parent des contrôles Form1 (aucun problème à partir d'ici!), lorsque je souhaite modifier le parent du contrôle (à partir de la dll), l'application peut définir le parent mais je ne peux plus voir le contrôle enfant :(

J'ai vérifié la position du contrôle enfant dans le nouveau parent (gauche et haut et Largeur et hauteur) sans problème. J'ai vérifié le nom de classe de l'objet parent, pas de problème aussi (il m'a montré le nouveau nom de la classe de contrôle parent)

J'ai vérifié les contrôles enfants et le nombre de contrôles du nouveau contrôle parent, tout va bien

mais je ne peux pas voir le contrôle à l'écran après avoir essayé de changer de parent!

Remarque: ces 2 contrôles (enfant et parent) provenant de dll différentes

Merci de votre aide

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;

Objet de classe dans une DLL de contrôle enfant

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;

Je viens d’essayer cela sous forme principale: j’ai ajouté TButton et TPanel au formulaire, puis j’ai exécuté le programme. Lorsque je clique sur le bouton, cela peut changer le parent d'objet TVLCVideo, mais je ne peux pas voir l'objet à l'écran :(

Button and Panel1 n'est pas un composant d'exécution, je les ai ajoutés à la fiche au moment de la conception!

c'est un événement bouton onclick:

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

Je n'ai reçu aucun message d'erreur du compilateur ou du runtime. Je ne peux tout simplement pas voir le contrôle TVLCVideo après avoir changé le parent :(

Et j'utilise Delphi 2010

1
Pourquoi utilisez-vous des DLL au lieu de packages?
ajouté l'auteur Joe White, source
Encore une fois, je vais demander: pourquoi utilisez-vous des DLL au lieu de packages? Lorsque vous utilisez des DLL, chaque DLL possède sa propre copie de la classe TWinControl (et tout le reste, jusqu'à TObject), de sorte que certaines choses ne fonctionneront pas très bien ensemble. Si vous utilisez des packages, vous obtenez la même modularité, mais tout utilise la même classe TWinControl. Le transtypage fonctionne donc correctement. Le chargement de module correspond aux paquets conçus . Si vous ne les utilisez pas, vous aurez des problèmes étranges. Je ne peux pas dire si les problèmes étranges que vous rencontrez sont dus au fait que vous n'utilisez pas de packages, mais ils pourraient très bien l'être.
ajouté l'auteur Joe White, source
Vous avez plus d'une instance de la VCL. Ça ne marche pas. Utilisez des packages ou écrivez une API de plug-in complète qui conserve le nombre de VCL à 1.
ajouté l'auteur David Heffernan, source
Bienvenue dans StackOverflow. Il est très difficile de répondre à une question pour laquelle vous n'avez fourni aucun code et votre description n'est pas très claire. S'il vous plaît rappelez-vous que nous n'avons aucune information sur votre problème autre que ce que vous nous dites, et que nous ne pouvons pas voir votre écran ou votre code à partir d'ici. La seule chose avec laquelle nous devons travailler est la question que vous posez; Si vous ne fournissez pas de détails clairs (ou au moins une description claire du problème et du code à lire), il est très difficile de vous aider à résoudre votre problème. :)
ajouté l'auteur Ken White, source
Parce que chaque contrôle ressemble à un module d'application principale. L’application principale est vide n’a aucun contrôle sur le formulaire. Il doit tout créer à partir de modules. Peut-être que je pourrai écrire un nouveau module à l'avenir (comme un plugin)
ajouté l'auteur relativ, source
Bonjour Ken, merci pour votre réponse. Pouvez-vous vérifier à nouveau?
ajouté l'auteur relativ, source

Il n'y a pas de réponses.

0