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 :

Creation d'un composant de manière dynamique


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Par défaut Creation d'un composant de manière dynamique
    Bonjour à tous ! Mon premier poste sur le forum Delphi car je viens de m'y mettre après plusieurs années dans le monde Java.

    Je vous explique le soucis. J'ai un composant non visuel pour compresser décompresser des fichiers. Pour éviter de devoir le mettre dans plusieurs écran qui l'utilisent, je voulais avoir une classe qui à sa création va instancier ce composant, le rattacher à la fiche de provenance et gérer des méthodes utilitaires sur ce composant.

    Exemple :
    Ma Form :
    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
     
    type
      TfmRestaurer = class(TForm)
      ....
     
    private
        ZipManager: TZipManager;
     
    implementation
     
    TfmRestaurer.OnCreate(Sender: TObject);
    begin
        ZipManager := TZipManager.create(self);
    end;
    TfmRestaurer.OnBtClick(Sender: TObject);
    begin
        ZipManager.compresser;
    end;
     
    end.
    Ma classe TZipManager :
    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
     
    type
      TZipManager = class(TObject)
      private
         FZipComponent : TZipComponent;
      public
        procedure Compresser;
        constructor create(AOwner: TComponent);
    implementation
     
    constructor TZipManager.create (AOwner: TComponent);
    begin
      FZipComponent := TZipComponent.create(AOwner);
      FZipComponent.fichierACompresser := 'LeFichier';
    end;
     
    procedure TZipManager.Compresser;
    begin
      FZipComponent.compresser;
    end;
    Ce n'est qu'un exemple. Au constructeur, tout roule. Par contre quand j'appel ZipManager.Compresser ... ça plante sur FZipComponent.compresser; avec une erreur d'adressage memoire ...
    Un problème de référence je pense mais il me semblait qu'en Delphi on n'était qu'avec des pointeurs vers des objet dans un cas comme celui ci ?
    Ou alors comme le Composant appartient à une autre unitée ... alors il aime pas ?

    Bref, si quelqu'un à une idée ...

  2. #2
    Membre émérite Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    constructor TZipManager.create (AOwner: TComponent);
    begin
      inherited create;
      FZipComponent := TZipComponent.create(AOwner);
      FZipComponent.fichierACompresser := 'LeFichier';
    
    end;
    Comme tu as surchargé le constructeur, il ne faut pas oublier d'appeler le construteur original.
    D'ailleurs, il faudra aussi overrider le desctructeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    destructor TZipManager.Destroy;
    begin
       FZipComponent.free;
       inherited Destroy ;
    end;
    En fait je me demande, si c'est pas plus simple de faire une classe dérivée TZipManagerAffectedNameFile de TZipManager. Je vois pas m'interêt de le mettre dans un autre une classe.

  3. #3
    Membre confirmé
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Par défaut
    Merci, effectivement je n'avais pas appelé le constructeur de TObject mais ça ne résoud pas le problème ...
    Je ne vois pas trop ce que tu veux dire faire une classe dérivée de TZipManager, tu veux peut-être dire une classe dérivée de TZipComponent ?
    Je me demande si c'est pas que je ne remplis pas certains paramètre essentiels de mon composant, comme le nom par exemple !

  4. #4
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Salut,

    je voulais avoir une classe qui à sa création va instancier ce composant, le rattacher à la fiche de provenance et gérer des méthodes utilitaires sur ce composant
    pourquoi le rattacher à la fiche vu qu'il est non visuel?
    pourquoi ne pas directement instancier TZipComponent?

    ou alors créer un wrapper avec une interface pour bénéficier de la libération automatique de la mémoire...
    je ne comprend pas l'interet de la classe TZipManager, mais bon peut être que quelque chose méchappe.

  5. #5
    Membre émérite Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
      TZipManager = class(TObject)
      ...
    constructor TZipManager.create (AOwner: TComponent);
    begin
      inherited create;
      FZipComponent := TZipComponent.create(AOwner);
      FZipComponent.fichierACompresser := 'LeFichier';
    
    end;
    Tu utilises une classe TObject qui manipule un TComponent, c'est louche au niveau du constructeur que d'utiliser un autre TComponent en guise de classe chargé de sa destruction quand elle appartient à TZipManager.

    Je voulais dire TZipComponent au lieu deTZipManager

  6. #6
    Membre confirmé
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Par défaut
    Alors, pour donner l'utilité de mon TZipManager c'est surtout d'avoir des méthodes utilitaires qui s'appuient sur mon composant TZipComponent qui vont être réutilisées dans l'application.
    En fait, ce serrait pas un composant ça m'arrangerait presque J'avoue avoir du mal à comprendre l'intéret d'un composant non visuel. Pourquoi c'est un composant et pas une classe (Une dll ?); mais c'est ma déformation Java
    J'ai fais ça dans un TObject car comme justement je ne comptait pas trop manipuler mon objet comme un composant.

    Par contre, c'est bon, ça marche, c'est Kaféine qui m'a mis la puce à l'oreil. Effectivement comme c'est un composant non visuel je n'ai pas besoin de le rattacher à une fiche et ça simplifie tout. Moi je croyais qu'un composant devait être rattaché à une fiche.

    En tout cas, merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Creation du composant avec Paramètres dynamique.
    Par amallek dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 02/06/2014, 12h50
  2. [Débutant] Creation de Struct de manière dynamique ?
    Par Alonzo Mosely dans le forum C#
    Réponses: 3
    Dernier message: 05/04/2014, 16h07
  3. [ActiveX] Creation d'un composant dynamique
    Par xv-mnt dans le forum MFC
    Réponses: 5
    Dernier message: 28/01/2006, 18h22
  4. [COMPOSANT] Creation particuliere de composant.
    Par Clorish dans le forum Composants VCL
    Réponses: 11
    Dernier message: 25/06/2004, 11h54
  5. [VB6] creation de variable de type string dynamiquement
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 12/06/2003, 16h59

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