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

Delphi Discussion :

Problème de classe avec un package ?


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut Problème de classe avec un package ?
    Bonjour,

    J'ai soucis avec une application et un package.

    Voici le code de mon applicatif principal :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
     
    unit MPrincipale;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, Menus, ActnPopup, ImgList, StdCtrls, Buttons, IniFiles,
      MGSurf;
     
    type
      TFPrincipale = class(TForm)
        TrayIcon1: TTrayIcon;
        PopupActionBar1: TPopupActionBar;
        ImageList1: TImageList;
        Quitter1: TMenuItem;
        Aproposde1: TMenuItem;
        N1: TMenuItem;
        Shape1: TShape;
        LNom: TLabel;
        LVersion: TLabel;
        Image1: TImage;
        SBOK: TSpeedButton;
        LBModules: TListBox;
        procedure FormCreate(Sender: TObject);
        procedure Quitter1Click(Sender: TObject);
        procedure SBOKClick(Sender: TObject);
        procedure Aproposde1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
         procedure Log(Information:string);
      end;
     
    var
         FPrincipale         : TFPrincipale;
         GCenterAutonome     : boolean;
         GSurfHandle         : HMODULE;
         GSurfClass          : TPersistentClass;
         GSurfModule         : TGSurf;
     
    implementation
     
    {$R *.dfm}
     
    procedure TFPrincipale.Log(Information:string);
    var
         FichierLog     : TextFile;
         FichierNom     : string;
    begin
         if not DirectoryExists(ExtractFilePath(Application.ExeName)+'Logs') then CreateDir(ExtractFilePath(Application.ExeName)+'Logs');
         FichierNom := ExtractFilePath(Application.ExeName) + 'Logs\' + FormatDateTime('yyyy-mm-dd".txt"', Now);
         AssignFile(FichierLog,FichierNom);
         if not FileExists(FichierNom) then
              Rewrite(FichierLog)
         else
              Append(FichierLog);
         WriteLn(FichierLog,FormatDateTime('hh:nn:ss',Now) + ' -> ' + Information);
         CloseFile(FichierLog);
    end;
     
    procedure TFPrincipale.Quitter1Click(Sender: TObject);
    begin
         try
              Application.Terminate;
         except
              on E : Exception do
              begin
                   Log(E.Message);
                   MessageDlg(E.Message, mtError, [mbOK], 0);
                   Application.Terminate;
              end;
         end;
    end;
     
    procedure TFPrincipale.SBOKClick(Sender: TObject);
    begin
         try
              Visible := false;
         except
              on E : Exception do
              begin
                   Log(E.Message);
                   MessageDlg(E.Message, mtError, [mbOK], 0);
              end;
         end;
    end;
     
    procedure TFPrincipale.Aproposde1Click(Sender: TObject);
    begin
         try
              Visible := true;
         except
              on E : Exception do
              begin
                   Log(E.Message);
                   MessageDlg(E.Message, mtError, [mbOK], 0);
              end;
         end;
    end;
     
    procedure TFPrincipale.FormCreate(Sender: TObject);
    var
         Ini            : TIniFile;
    begin
         try
              // Lecture du fichier GCenter.ini
              Ini := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
                   GCenterAutonome := Ini.ReadBool('GCenter','Autonome',true);
              Ini.Free;
     
              // Chargement du module GSurf
              GSurfHandle := LoadPackage(ExtractFilePath(Application.ExeName) + 'Modules\GSurf.bpl');
              if GSurfHandle <> 0 then
              begin
                   GSurfClass := GetClass('TGSurf');
                   if GSurfClass <> nil then
                   begin
                        GSurfModule := TComponentClass(GSurfClass).Create(Application) as TGSurf;
                        LBModules.Items.Add('GSurf : ' + GSurfModule.GSurfVersion);
                   end;
              end;
     
              TrayIcon1.Visible := true;
         except
              on E : Exception do
              begin
                   Log(E.Message);
                   MessageDlg(E.Message, mtError, [mbOK], 0);
                   Application.Terminate;
              end;
         end;
    end;
     
    procedure TFPrincipale.FormDestroy(Sender: TObject);
    begin
         try
              if GSurfHandle <> 0 then UnloadPackage(GSurfHandle);
         except
              on E : Exception do
              begin
                   Log(E.Message);
                   MessageDlg(E.Message, mtError, [mbOK], 0);
                   Application.Terminate;
              end;
         end;
    end;
     
    end.
    Le code de mon package :
    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
     
    unit MGSurf;
     
    interface
     
    uses
         Classes, GpHTTPProxy;
     
    type
         TGSurf = class(TComponent)
              private
                   GSurfHTTP      : TGpHttpProxy;
                   GSurfHTTPS     : TGpHttpProxy;
              public
                   GSurfVersion   : string;
                   constructor Create(AOwner:TComponent);
         end;
     
    implementation
     
    constructor TGSurf.Create(AOwner:TComponent);
    begin
         inherited Create(AOwner);
         GSurfVersion := '2007.19.01';
         GSurfHTTP := TGpHttpProxy.Create(AOwner);
         GSurfHTTPS := TGpHttpProxy.Create(AOwner);
    end;
     
    initialization
         RegisterClass(TGSurf);
     
    finalization
         UnRegisterClass(TGSurf);
     
    end.
    Et mon erreur :
    14:02:42 -> Une classe nommée TGSurf existe déjà
    Comment dois-je faire ?

    Merci,
    ZiP

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Par défaut
    Slt ZIP
    Le compilateur te renvoie l'erreur sur ton package ou ton unité MPrincipale?

    A ce que je vois tu utilise les TGpHttpProxy basés sur ICS.
    Quelle version de ICS tu utilise?
    Et est ce que le HTTPS fonctionne?
    Car moi je l'avais essayé il y a quelques temps (1 an ou 2 je ne sais plus) pour faire une sorte de filtre internet (pas un simple contrôle parental mais un projet un peu plus "professionel" pour entreprises / petites structures) en FreeWare et par manque de temps je n'ai pas terminé le projet. Et je n'arrivais pas à faire fonctionner le HTTPS.

    De plus un petit conseil :
    Fait attention aux variables déclarées en Globale car ici je pense que tu n'en a pas besoins, tu peux mettre dans ta TFPrincipale en membre GCenterAutonome et GSurfModule
    et déclarer GSurfHandle + GSurfClass uniquement en variable locale dans ta fonction de chargement ou aussi éventuellement en membre de ta classe suivant comment tu libère ton package.
    Bref les variables globales sont à éviter sauf cas exceptionnel.
    Voilà pour le petit conseil.

  3. #3
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 472
    Par défaut
    Bonsoir,

    L'erreur se produit au moment ou j'appelle LoadPackage dans mon programme principal GCenter.

    En ce qui concerne la version ICS, j'utilise la v5. Je n'ai pas encore testé le HTTPS, le HTTP fonctionne.

    C'est une application professionnelle qui s'appelle GCenter. Il est prévu pour celles-ci entre autres un module appelé GSurf qui sera un proxy HTTP/HTTPS et FTP.

    Pour les variables, elles sont en globales pour mon UnloadPackage mais celui-ci est-il vraiment utile ?

    Merci,
    ZiP

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Par défaut
    Le unloadPackage est utile car tu doit libérer tout ce que tu créé dynamiquement n'ayant pas de "Parent" de renseigné. Ici c'est le cas.
    Par contre pour tes variables globales je pense que tu peux les placer comme champs dans ta classe TFPrincipale soit en private, protected ou public. Les variables globales sont vraiement à éviter (un principe de la POO) sauf cas particulier et ici apparament ce n'est pas le cas.

    En ce qui concerne le problème rencontré, tout m'a l'air correcte à première vue, juste une dernière question avant de rechercher un peu plus : c'est lors de la compil que tu as le message ou lors de l'execution?

    A+

  5. #5
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonsoir,

    C'est à l'exécution sur le LoadPackage que j'ai cette erreur.

    En fait, je cherche à faire une application qui utilise des plugins, ici des package *.bpl, et je souhaite lorsque le package, GSurf par exemple, est chargé, ajouter des items au menu de mon GCenter ainsi que le nom et la version du module chargé.

    Mais je débute avec l'utilisation des packages dynamiques et c'est pas super simple pour moi

    Merci pour ton aide qui me fait progresser,
    ZiP

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Par défaut
    Dans ton package ajoute Override sur ton constructeur car tu surcharge la classe TComponent :
    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
    unit GSurf;
     
    interface
     
    uses
         Classes,dialogs;
     
    type
         TGSurf = class(TComponent)
              private
                   GSurfHTTP      : TGpHttpProxy;
                   GSurfHTTPS     : TGpHttpProxy;
              public
                   GSurfVersion   : string;               
                   constructor Create(AOwner:TComponent); override;//Ajout du Override car surcharge de TComponent
         end;
     
     
     
    implementation
     
    constructor TGSurf.Create(AOwner:TComponent);
    begin
         inherited Create(AOwner);
         showmessage ('aa');
         GSurfVersion := '2007.19.01';
         GSurfHTTP := TGpHttpProxy.Create(AOwner);
         GSurfHTTPS := TGpHttpProxy.Create(AOwner);
    end;
     
    initialization
         RegisterClass(TGSurf);
     
    finalization
        UnRegisterClass(TGSurf);
     
    end.

    De plus fait attentio à ce que le package soit en Runtime seul et pas en DesignTime.

    Enfin voici quelques corrections sur ta fiche principale :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, Menus, ActnPopup, ImgList, StdCtrls, Buttons, IniFiles,
      GSurf;
     
    type
      TFPrincipale = class(TForm)
        TrayIcon1: TTrayIcon;
        PopupActionBar1: TPopupActionBar;
        ImageList1: TImageList;
        Quitter1: TMenuItem;
        Aproposde1: TMenuItem;
        N1: TMenuItem;
        LBModules: TListBox;
        SBOK: TSpeedButton;
        procedure FormCreate(Sender: TObject);
        procedure Quitter1Click(Sender: TObject);
        procedure SBOKClick(Sender: TObject);
        procedure Aproposde1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
     
         //Déclaration des Objets en Champs de l'objet TFPrincipale
         GCenterAutonome     : boolean;
         GSurfHandle         : HMODULE;
         GSurfClass          : TPersistentClass;
         GSurfModule         : TGSurf;
     
         procedure Log(Information:string);
      end;
     
    var
         FPrincipale         : TFPrincipale;
     
    implementation
     
    {$R *.dfm}
     
    procedure TFPrincipale.Log(Information:string);
    var
         FichierLog     : TextFile;
         FichierNom     : string;
    begin
         if not DirectoryExists(ExtractFilePath(Application.ExeName)+'Logs') then CreateDir(ExtractFilePath(Application.ExeName)+'Logs');
         FichierNom := ExtractFilePath(Application.ExeName) + 'Logs\' + FormatDateTime('yyyy-mm-dd".txt"', Now);
         AssignFile(FichierLog,FichierNom);
         if not FileExists(FichierNom) then
              Rewrite(FichierLog)
         else
              Append(FichierLog);
         WriteLn(FichierLog,FormatDateTime('hh:nn:ss',Now) + ' -> ' + Information);
         CloseFile(FichierLog);
    end;
     
    procedure TFPrincipale.Quitter1Click(Sender: TObject);
    begin
         try
              Application.Terminate;
         except
              on E : Exception do
              begin
                   Log(E.Message);
                   MessageDlg(E.Message, mtError, [mbOK], 0);
                   Application.Terminate;
              end;
         end;
    end;
     
    procedure TFPrincipale.SBOKClick(Sender: TObject);
    begin
         try
              Visible := false;
         except
              on E : Exception do
              begin
                   Log(E.Message);
                   MessageDlg(E.Message, mtError, [mbOK], 0);
              end;
         end;
    end;
     
    procedure TFPrincipale.Aproposde1Click(Sender: TObject);
    begin
         try
              Visible := true;
         except
              on E : Exception do
              begin
                   Log(E.Message);
                   MessageDlg(E.Message, mtError, [mbOK], 0);
              end;
         end;
    end;
     
    procedure TFPrincipale.FormCreate(Sender: TObject);
    var
         Ini            : TIniFile;
    begin
         try
               Lecture du fichier GCenter.ini
              Ini := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini'));
                   GCenterAutonome := Ini.ReadBool('GCenter','Autonome',true);
              Ini.Free;
     
              // Chargement du module GSurf
              GSurfHandle := LoadPackage(ExtractFilePath(Application.ExeName) + 'Modules\GSurf1.bpl');
              if GSurfHandle <> 0 then
              begin
                   GSurfClass := GetClass('TGSurf');
                   if GSurfClass <> nil then
                   begin
                       GSurfModule := TComponentClass(GSurfClass).Create(Application) as TGSurf ;
                        LBModules.Items.Add('GSurf : ' + GSurfModule.GSurfVersion);
                   end;
              end;
     
              TrayIcon1.Visible := true;
         except
              on E : Exception do
              begin
                   Log(E.Message);
                   MessageDlg(E.Message, mtError, [mbOK], 0);
                   Application.Terminate;
              end;
         end;
    end;
     
    procedure TFPrincipale.FormDestroy(Sender: TObject);
    begin
         try
              if GSurfHandle <> 0 then
              begin
                //Mettre le pointeur GSurf à nil.
                if Assigned (GSurfModule) then
                  GSurfModule := nil;
                UnloadPackage(GSurfHandle);
     
              end;
         except
              on E : Exception do
              begin
                   Log(E.Message);
                   MessageDlg(E.Message, mtError, [mbOK], 0);
                   Application.Terminate;
              end;
         end;
    end;
    J'ai retiré les variables globales pour les placer comme des champs et lorsque tu décharge le package, il faut aussi détruite ton objet créé dynamiquement.

    Voilà.
    Essaye comme cela, de mon côté ca fonctionne.
    Tien moi au courant sur le système de filtrage internet car cela me donne envie de reprendre ce projet.

    Tu peut aussi manipuler les plug-in par le système d'interfaces car ici dans ton cas tu sais que tu va utiliser un TGSurf alors que normalement avec un plug-in tu ne connais pas la classe que tu manipule mais jusque le contrat minimum qu'elle doit remplir.
    Voici un lien avec l'utilisation des interfaces :
    http://sjrd.developpez.com/delphi/tutoriel/compoplugin/

    A+

  7. #7
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour,

    J'ai effectué les modifications données mais le problème persiste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    11:55:57 -> Une classe nommée TGSurf existe déjà
    11:55:59 -> Handle de package incorrect
    De toute manière, je ne procède pas comme il faut...
    Je ne respecte pas le bon fonctionnement d'un vrai plugin !

    J'ai besoin d'une confirmation... Je veux développer un programme principal utilisant des plugins sous forme de package (*.bpl). Une fois chargé, je souhaite que le package ajoute à mon TPopupMenu un item permettant d'acceder aux options de mon module. Je veux également pouvoir récupérer le nom et la version du module contenu dans une variable dans celui-ci.

    Pour celà, dois-je utiliser ?
    1. Utilisation des paquets Borland
    2. Utilisation des interfaces


    Sinon, dès que j'ai résolu ce problème de plugin, j'attaque le développement du module GSurf et te tien au courant de son bon fonctionnement.

    Merci pour vos conseils,
    ZiP

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 48
    Par défaut
    Tu peut bien sur utiliser les paquets comme borland le fait, le problème c'est que tu est obligé de connaitre la classe qui est dans ton plug-in. Donc si demain tu recréé un plug-in, il te faut remodifier ton executable pour l'intégrer dans le plug-in.
    Il est donc préférable d'utiliser la 2ieme méthode avec une interface.
    Tous tes plug-in implémenteront cette interface et ton programme principal passera par cette interface pour lancer les plug-in. C'est peut-être un peu compliqué mais une fois mis en place tu va gagner bcp de temps si tu doit ajouter des plug-in par la suite à ton appli. Tu peut même créer un objet qui sera charger de lancer tes plug-in et de les intégrer à ton menu. Ce sera donc ton objet qui passera par l'interface pour utiliser les plug-in et pour ton programme se sera transparant.
    Inspire toi tu tutoriel, je ne l'ai pas testé mais il est pas mal détaillé et doit fonctionner. Ce tutoriel est bien entendu à adapter à tes besoins (si tu veut ajouter une icone à ton menu, un évènement sur le clic...).

    Sinon de te fournit le code corrigé qui fonctionne chez moi, teste le de ton côté. J'ai mis en commentaire certains élèments pour uniquement tester le chargement du package.
    A+
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Problème génération .class avec Tomcat 5.5 sous Windows 7!
    Par mumu27 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 18/02/2010, 14h00
  2. Problèmes de classe avec const
    Par Invité4 dans le forum C++
    Réponses: 3
    Dernier message: 09/04/2009, 00h41
  3. problème de classe avec windev
    Par hamdi amine dans le forum WinDev
    Réponses: 1
    Dernier message: 28/05/2008, 07h18
  4. Problème de dépassement avec le package Listing
    Par Faith's Fall dans le forum Mise en forme
    Réponses: 2
    Dernier message: 04/08/2007, 18h44
  5. Problème de classe avec PHP 5 ?
    Par MaTHieU_ dans le forum Langage
    Réponses: 9
    Dernier message: 15/07/2006, 11h36

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