Dll contenant une TFrame

Résolu
Millenod Messages postés 34 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 21 septembre 2005 - 23 nov. 2004 à 10:11
Millenod Messages postés 34 Date d'inscription mardi 29 avril 2003 Statut Membre 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.

8 réponses

Millenod Messages postés 34 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 21 septembre 2005
17 déc. 2004 à 09:21
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 :)
3
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
23 nov. 2004 à 11:44
: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...
0
Millenod Messages postés 34 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 21 septembre 2005
23 nov. 2004 à 12:25
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?
0
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
23 nov. 2004 à 12:39
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Millenod Messages postés 34 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 21 septembre 2005
23 nov. 2004 à 17:17
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.
0
cs_Bestiol Messages postés 833 Date d'inscription dimanche 6 janvier 2002 Statut Membre Dernière intervention 3 novembre 2005 1
23 nov. 2004 à 17:30
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)
0
Millenod Messages postés 34 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 21 septembre 2005
23 nov. 2004 à 18:09
à 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?
0
Millenod Messages postés 34 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 21 septembre 2005
17 déc. 2004 à 10:57
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 :(
0
Rejoignez-nous