Dll contenant une TFrame [Résolu]

Messages postés
35
Date d'inscription
mardi 29 avril 2003
Dernière intervention
21 septembre 2005
- - Dernière réponse : Millenod
Messages postés
35
Date d'inscription
mardi 29 avril 2003
Dernière intervention
21 septembre 2005
- 17 déc. 2004 à 10:57
Bonjour,

J'ai stocké une TFrame dans une dll.
J'aimerais lors du chargement de celle-ci, récupérer la TFrame et l'afficher sur ma Form.

si quelqu'un sait comment faire, je vous en serait reconnaissant.
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
35
Date d'inscription
mardi 29 avril 2003
Dernière intervention
21 septembre 2005
3
Merci
Voila la solution :

Code de la DLL :
library Project1;

uses
  SysUtils,
  Classes,Forms,
  Unit2 in 'Unit2.pas' {Frame2: TFrame};

{$R *.res}

procedure CreateFrame(aOwner:TComponent;var Frame:TFrame); export;
begin
  Frame := TFrame2.Create(aOwner);
end;

exports CreateFrame;

begin
end.


Code de la TFrame (pour exemple) :
unit Unit2;

interface

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TFrame2 = class(TFrame)
    GroupBox1: TGroupBox;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

implementation

{$R *.dfm}

end.


Voici le code de l'appli qui charge la dll :

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure CreateFrame(aOwner:TComponent;var Frame:TFrame); external 'Project1.dll';

procedure TForm1.FormCreate(Sender: TObject);
var f     : TFrame;
begin
  CreateFrame(self,f);
  f.ParentFont := False;
  f.Parent := self;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var c     : TControl;
begin
  while ControlCount > 0 do
  begin
    c := Controls[0];
    c.Parent := nil;
    c.Free;
  end;
end;

end.


J'espère que cela vous sera utile.

Merci pour votre aide :)

Merci Millenod 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Millenod
Messages postés
871
Date d'inscription
dimanche 6 janvier 2002
Dernière intervention
3 novembre 2005
0
Merci
:question) :question) :question) :question)

Tu viens de valider, pas plus tard qu'hier, ta précédente question qui était exactement celle-ci !!

Si ton problème a changé depuis, explique... sinon je comprend pas l'intérêt du message...
Commenter la réponse de cs_Bestiol
Messages postés
35
Date d'inscription
mardi 29 avril 2003
Dernière intervention
21 septembre 2005
0
Merci
tu as raison c'est ma faute :(
j'ai validé un peu trop vite hier... et ce que je pensais pouvoir faire, n'a pas marché :(

le tutorial fourni est intéressant, mais peut être un peu compliqué (la méthode 2 avec les interfaces l'est vraiment).
n'existe-t-il pas une méthode plus simple, ou une autre voie à tester?
Commenter la réponse de Millenod
Messages postés
871
Date d'inscription
dimanche 6 janvier 2002
Dernière intervention
3 novembre 2005
0
Merci
Oui effectivement le tutoriel, et surtout la seconde méthode, est assez compliqué !

Malheureusement je n'y connais pas d'alternative...

Une autre voie serait de faire une gestion de création de frame :
ta dll fournit un descriptif de la position des contrôles etc, avec un ID pour chacun... Ton application crée les contrôles et à chaque nouveau contrôle elle appelle une nouvelle fonction de ta DLL en passant l'ID en cours, pour obtenir les propriétés à changer...

Ca, ça marcherait vu que toute la création se ferait côté application... La DLL ne fournit que les infos !

Par contre, c'est pas forcément très simple à coder ! (mais super intéressant ! :big) )

++
Bestiol.
Commenter la réponse de cs_Bestiol
Messages postés
35
Date d'inscription
mardi 29 avril 2003
Dernière intervention
21 septembre 2005
0
Merci
là tu me parle chinois :(

Autant je sais récupérer ce genre d'infos sous l'edi de delphi...
autant là, mon visage ressemble à un point d'interrogation.

j'avais vu des codes pour afficher une tform contenue dans une dll.
n'y a-t-il pas moyen de contourner l'appel de la tform?

Désolé, si mon élucubration fait sourrire les pro :
transformer la tform en tframe, et la stocker dans un emplacement pourvu à cet effet.

en tout cas merci pour ton aide.
je retourne à mes recherches.
Commenter la réponse de Millenod
Messages postés
871
Date d'inscription
dimanche 6 janvier 2002
Dernière intervention
3 novembre 2005
0
Merci
Si tu as un code qui crée "facilement" une TForm à partir d'une DLL, alors on est pas la loin de la solution pour les TFrame je pense ! ;)

Mon idée que tu prends pour du chinois est en gros la suivante :
-La DLL envoie un genre de fichier DFM à l'application -> liste des compos à créer, avec leur nom
-L'application crée les objets qui correspondent
-A chaque objet qu'elle crée, l'application interroge la DLL en lui donnant le nom de l'objet en cours, afin que la DLL lui renvoie les propriétés (taille, position, caption etc) de cet objet et que la frame puisse être terminée ! :big)
Commenter la réponse de cs_Bestiol
Messages postés
35
Date d'inscription
mardi 29 avril 2003
Dernière intervention
21 septembre 2005
0
Merci
à cette adresse tu trouveras le moyen de faire appel à une tform incluse dans une dll : http://delphipage.free.fr/dll.html

j'avais pensé faire ceci :

code dans la dll :
Function GetFrame : TFrame;
Var
  f : TFrame
Begin
  f := tFrame1.Create(nil);
  Result := f;
End;


ainsi, mon application devait récupérer la frame.
malheureusement celà ne marche pas, j'ai un message d'erreur TFont lors de la récupération de la frame.

Pour ton idée, elle est fort intéressante.
Malheureusement, je ne connais rien dans la programmation des composants visuels. rien que dessiner une zone rectangulaire sur une fiche, je ne sait pas faire....
Car si j'importe les composants, il va falloir que je les redimensionne.... (gros probleme).

D'après les tuto, il y avait la fonction LoadPackage qui peut être utile, ... mais je ne pense pas m'en servir.
quelles sont les autres fonctions pour accéder à des éléments stockés dans des libraries?
Commenter la réponse de Millenod
Messages postés
35
Date d'inscription
mardi 29 avril 2003
Dernière intervention
21 septembre 2005
0
Merci
j'ai un probleme : si je met un TListView sur la frame, et que je clck sur celle-ci via mon appli, j'obtiens le message suivant : 'EInvalidOperation" "le contrôle n'a pas de fenêtre parente".

si quelqu'n sait comment éviter ce bug :(
Commenter la réponse de Millenod

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.