IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

TForm dans une DLL avec utilisation d'Interface


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 8
    Points
    8
    Par défaut TForm dans une DLL avec utilisation d'Interface
    J'ai repris le tutorial de sjrd pour créer des plugins graphiques le composant que j'utilise comme base pour mes plugins est un TForm parce que ainsi je peux créer mes plugins en designe dans delphi comme pour une forme classique delphi.

    Tout ceci fonctionne très bien mis à part quand je place mon plugin dans une scrollbox là la les scrollbars disparaisse quand je suis en bout de course...

    Quelqu'un peux m'aider

    http://sjrd.developpez.com/delphi/de...s/compoplugin/

    Voici le code de l'interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    unit PluginIntf;
     
    interface
    uses
      Classes,
      Forms;
     
    type
      IPlugin = interface
      ['{11B9838C-CD8E-4F6C-BDF8-8774A671E825}']
        function GetComponent : TForm;stdcall;
        property Component : TForm read GetComponent;
      end;
     
    TCreatePlugin=function(AOwner:TComponent) : IPlugin;stdcall;
     
    implementation
     
    end.
    La classe qui me charge le plugin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    unit PluginClass;
     
    interface
    uses
      Windows,
      Classes,
      PluginIntf;
     
    type
    TPlugin = class
      private
      FHandle : THandle;
      FCreate : TCreatePlugin;
      FPlugin : IPlugin;
     
      public
      Constructor Create(AOwner:TComponent;Filename : String);
      Destructor  Destroy;override;
      property Instance : IPlugin read FPlugin write FPlugin;
    end;
     
    implementation
     
    { TPlugin }
     
    constructor TPlugin.Create(AOwner:TComponent;Filename: String);
    begin
      Filename := Filename + '.dll';
      FHandle := LoadLibrary(PChar(Filename));
      if FHandle <> 0 then
      begin
        FCreate := GetProcAddress(FHandle,'CreatePlugin');
        if @FCreate <> nil then
        begin
          FPlugin := FCreate(AOwner);
        end;
      end;
    end;
     
    destructor TPlugin.Destroy;
    begin
      FPlugin := nil;
      if FHandle <> 0 then
        FreeLibrary(FHandle);
    end;
     
     
    end.
    La forme sur laquelle le plugin va etre placé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    unit Unit1;
     
    interface
     
    uses
      Windows,
      Messages,
      SysUtils,
      Variants,
      Classes,
      Graphics,
      Controls,
      Forms,
      Dialogs,
     
      PluginClass,
      PluginIntf, StdCtrls;
     
    type
      TForm1 = class(TForm)
        ScrollBox1: TScrollBox;
        procedure FormDestroy(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        Plug : TPlugin;
      end;
     
    var Form1: TForm1;
     
    implementation
    {$R *.dfm}
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      if Plug <> nil then with Plug.Instance.Component do
      begin
        ParentWindow := 0;
        Windows.SetParent(Handle, 0);
      end;
      Plug.Instance := nil;
      Plug.Destroy;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Plug := TPlugin.Create(Self,'Project2');
      Plug.Instance.Component.Parent := ScrollBox1;
      with Plug.Instance.Component do
      begin
        ParentWindow := ScrollBox1.Handle;
        Windows.SetParent(Handle,ScrollBox1.Handle);
        Left := 0;
        Top := 0;
        Visible := True;
      end;
    end;
     
    end.

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Peut tu nous montrer le code de ta form declaré dans le code de la Dll ?

    De plus je ne comprends pas trop l'utilité dans ton cas d'un "GetComponent" et d'un "Component" dans l'implementation de ton interface.

    Il faut savoir que la transmission de variables Classes d'une Dll a un exe n'ets pas possible sans risques.
    Bon maintenant j'ai pas fait des tests tres poussés la dessus, aussi si quelqu'un peut confirmer .. ca serait bien


    Voici ma gestion habituelle de pluggin :

    DLL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Type
      IPlugin = Interface
         Procedure Launch; stdCall;
      End;
     
      TDLLForm = Class(TForm, IPluggin)
      [..]
      End;
     
    Function GetPlugin : IPlugin; StdCall;
    Begin
    Result := TDLLForm.Create(Nil);
    End;    
     
    Exports
      GetPlugin;
    Exe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Type
      TPlugin = Class
      Private
        DllHandle : THandle;
        Pluggin : IPluggin;
      [...]
      End;
     
    Var GetPluggin : Function : IPluggin;
     
    Constructor TPluggin.Create(ADllFilename : String);
    Begin
    Self.DllHanlde := LoadLibrary(ADllFilename);
    If Self.DllHandle = 0 Then Exit;
    GetPluggin := GetProcAddress(Self.DllHandle, 'GetPluggin');
    If Assigned(GetPluggin) Then Self.Pluggin := GetPluggin;
    End;
    Voila

    Pour ce qui est de l'affectation d'un parent, tu devra passer par les API Windows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Type
      IPluggin = Interface
        Procedure SetPArentPluggin(ParentHandle : THandle);
      [...]
      End;
     
    Procedure TDLLForm.SetPArentPluggin(PArentHandle : THandle);
    Begin
    Windows.SetPArent(Self.Handle, ParentHandle);
    End;
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    code de la dll

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    library Project2;
    uses
      SysUtils,
      Forms,
      Classes,
      PluginIntf in 'PluginIntf.pas',
      Unit3 in 'Unit3.pas' {Form3};
     
    {$R *.res}
     
     
    function CreatePlugin(AOwner:TComponent) : IPlugin;stdcall;
    begin
      Result := TPlugTester.Create(AOwner);
    end;
     
    exports
      CreatePlugin;
     
    begin
    end.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
     
    unit Unit3;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,PluginIntf, StdCtrls;
     
    type
     
     
      TForm3 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
     
      end;
     
      TPlugTester = class(TInterfacedObject,IPlugin)
        FForm3 : TForm3;
        constructor Create(AOwner:TComponent);
        destructor  Destroy;override;
        function GetComponent : TForm;stdcall;
        property Component : TForm read GetComponent;
      end;
    implementation
     
    {$R *.dfm}
     
    { TForm3 }
     
    procedure TForm3.Button1Click(Sender: TObject);
    begin
      Memo1.Lines.Add(DateTimeToStr(Now))
    end;
     
    { TPlugTester }
     
    constructor TPlugTester.Create(AOwner:TComponent);
    begin
      FForm3 := TForm3.Create(AOwner);
    end;
     
    destructor TPlugTester.Destroy;
    begin
      FForm3.Destroy;
      inherited;
    end;
     
    function TPlugTester.GetComponent: TForm;
    begin
      Result := FForm3;
    end;
     
    end.

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    BOn moi je detecte deja 2/3 petites erreurs ou codege inutil :

    La classe TPlugTest n'est pas necessaire car TForm Derrive deja d'une classe Implementant IInterface donc possede deja les fonctions necessaire a la manipulation sous forme d'interface.

    Je declarerais donc ma form comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Type
      TMaForm = Class(TForm, IMonInterface)
      [...]
      end;
    Ensuite transmettre un "Owner" n'est pas possible car c'est une variable de type TComponent.
    D'une part on ne peut pas passer des objets en parametres (sinon pourquoi se casser la tete a implementer des interfaces alors qu'une classe parente suffirait avec d'eventuelles methdoes abstract )
    D'autre part, la definition de classe est specifique au language de programation. Donc une classe Delphi n'est pas codee de la meme maniere qu'une classe C++ donc dans le pire des cas, si on arrive a trouver une astuce pour transmettre des classes, cela rendrait la Dll "liée" a son langage de prog, ce qui est contraire a la philisophie des Dlls.

    Ensuite, le Owner n'a pour interet que de definir lun objet parent responsable de la destructio nde tous ses fils losqu'on le libere. Or il est interdit de liberer une Interface, car un systeme de compteur est mis en place via les methdoes de IInterface. Chaques avvectation de "Nil" a une instance d'interface decremente un compteur et lorsque ce dernier arrive a 0, l'objet phisque qui se cache derriere l'interface est detruit.

    Fait un assai : Affiche un message dasn OnDestroy de ta form et tu verra que mme avec un owner = nil, ta form passera par cette variable quand on fermera l'application ou qu'on met a nil l'instance IPluggin.

    Voila quelques conseils de plus pour te lancer dans cette dure tache qui es la generation de pluggins graphiques (perso ca fait 6 mois que je bosse dessus :/)
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    merci pour tes conseils je testerais ça ce soir

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    j'ai fais les modifs que tu m'a indiqué sur l'interface et la dll mais quand je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    procedure TForm3.SetParentPlugin(ParentHandle: THandle);
    begin
      Windows.SetParent(Self.Handle, ParentHandle);
    end;
    et quand j'inspecte mon instance de TForm3 après quelle soit passé dans cette procedure je m'aperçois qu'elle a une propriéte parent nil et l'instance de TForm3 ne s'affiche pas sur ma forme principale

  7. #7
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Le fait que la proprietee Parent = Nil est normale vu qu'on ne passe plus par le systeme de gestion des parent de Borland mais par le systeme Windows.

    Le fait qu'elle ne s'affiche pas n'est pas normal .... verifie peut etre que la prop visible est a True ....

    Sinon je ne vois pas pkoi ca ne passerais pas. Verifie aussi que tu execute bien cette procedure, que ParentWindows est bien MaFormPrincipale.Handle et que l'objet TForm3 est bien crée (ie l'interface <> nil)
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    ok, c'est bon si je mets Visible à true apres que je passe le parent par contre quand je mets ma forme dans une scrollbox la scrollbox ne scroll pas. Est ce que tu as une solution.

    Dois je utiliser une TFrame plutot ?

  9. #9
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Je viens seulement d'arriver
    Citation Envoyé par guedelmalin
    Dois je utiliser une TFrame plutot ?
    Oui c'est fait pour ça : pourquoi se casser la tête à vouloir insérer une form dans une scroll box alors que les frames sont faits exactement pour ce pour quoi tu avais choisi de faire une fiche (à savoir pouvoir le construire dans l'EDI).

    À mon avis c'est le fait que ce soit une fiche qui l'embête justement
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  10. #10
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Dois je utiliser une TFrame plutot ?
    Effectivement ... mais personnellement je ne supporte pas la manipulation Designtime des TFrames incotpores dans un programme. Il deviens tres vite brouillon.

    Moi je preconise plutot une unitee a part dans laquelel on derrive une classe de TPanel (voir meme de TCustomPabel) avec BevelInner/Outter a bvNone.

    Ensuite, les composants sont crees dans le constructeur, initialisé dans le SetParent Surchargé a l'aide de Constantes pour permettre une modification rapide de l'ageancement des composants (Chacun d'entre eux etant positionné relativement a leurs voisons et/ou parents, valeurs definies par toute uen floppe de constantes).

    Ca n'a pas l'avantage de pouvoir etre developpé en mode DesignTime comme les form ou les frames mais ca a l'avantage enorme d'etre 100x plus propre, avec possibilité d'etre integré dans l'ide comme composant
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Mais il me faut absolument la possibilité de concevoir ces plugins graphiquement, j'ai trop de composants graphique à poser dessus pour le faire dans le code comme Clorish.

    Ca fait plus d'un an que je fais des plugins graphique sans Designtime et j'en ai marre à chaque fois que je dois faire des modifs ça me prend vraiment trop de temps et en plus c'est dtrès difficile pour les autres qui veulent relire mon code.

  12. #12
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    T'inquiètes, c'est juste une habitude de Clorish : si tu veux utiliser des frames, y'a pas de problème, ça marche aussi bien.

    @Clorish : je vois quand même pas en quoi ce serait pas propre
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  13. #13
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Dans ce cas, moi je prefere les TForm aux TFrames.
    Mais de toutee facon ton probleme viens plus du fait que ta forme est incluse dans ta fiche principale via SetPArent de windows, donc la scrollbox ne possede aucune reference a cette TForm dans son parent. donc ne se met aps a jour en en tenant compte.

    C'est le probleme sur lequel je bosse depuis des lustres. Les dlls n'acceptant pas les transpissions de classes, nous devosn apsser par les API Windows pour manipuler certaines fonctionnalites que Borland gere a notre place habituelement. Ca entraine certains "bugs" du genre du tiens.

    Sinon la solutions la meilleur reste de gerer les pluggin avec les paquets d'executions. La tu peux transmettre des classes en parametres, recuperer des variable de types classes pour une gestion generiques de creation de classe d'apres celles qui sont dans le paquet.

    Bref ce sont des "Dlls Ameliores" mais par voie de fait "lié" a Delphi.
    Autre inconvenient, tout logiciel compile en utilisant des paquets d'execution supprime de son exe TOUS les paquets d'execution ... VCL et RTL Compris (plus les eventuels Base de donnes, Indy et autres paquets installés dans l'ide pour utiliser des compos particuliers).

    Il te faudra donc fournir en plus de tes Paquets "Pluggin" les paquets systemes contenant les composants de base de ton application (RTL et VCL en tete).

    A toi de voir ce qui te plait le plus
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  14. #14
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    @Clorish : je vois quand même pas en quoi ce serait pas propre
    Simplement parce que quand tu double clique sur un TFrame en mode conception apres integration, ca te genere un evenelent sur la TForm incluant le TFrame, pour inserer ton code et fait ensuite appel a l'evenement onclick du bouton en question (genre heritage avec inherited) et ca m'a toujours enevé

    Dans son cas je ne sais pas si ca se produira mais perso j'aime pas le concept des TFrames


    Facon Come dit plus hat. ... TFrame ou TFrom le probleme sera le meme, ca viens de la gestion par Dll et non du type d'heritage
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/03/2012, 15h01
  2. Réponses: 5
    Dernier message: 11/03/2011, 11h59
  3. gestion des TForm dans une DLL
    Par a_lincoln54 dans le forum C++
    Réponses: 0
    Dernier message: 06/04/2008, 18h15
  4. TForm dans une DLL
    Par dgeodp dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2008, 19h12
  5. TForm dans une dll appelée dynamiquement
    Par declencher dans le forum Delphi
    Réponses: 2
    Dernier message: 22/12/2006, 11h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo