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 :

Suppression dynamique de composants


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut Suppression dynamique de composants
    Bonjour,
    Je dispose d'une liste d'objets (affichés dans une listview) définis par leur nom, leur type MIME (audio/*, application/*, image/*, text/* ou video/*) et la taille du fichier associé à l'objet. En plus j'ai dans ma fiche un panel qui va me permettre d'exécuter le contenu de l'objet sélectionné en fonction du type.

    Par exemple pour un objet décrivant un fichier .TXT, je crée dynamiquement un TMemo dans mon panel et dans lequel je charge mon fichier .TXT. De même pour un fichier .JPG ou un .GIF, je crée un TImage, etc.

    Jusque là pas de problème, mais là où ça se corse, c'est comment faire pour supprimer le composant crée dynamiquement dans mon panel ? En effet je crains qu'il n'y aie des fuites de mémoires ou des petites choses indésirables dans ce genre à chaque fois que je vais cliquer sur un item de ma listview.

    Ci-dessous mon code lorsque je clique sur un objet de type "text/*"
    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
    // Attachment est l'objet qui contient un nom, un type, 
    // le fichier associé et la taille du fichier associé
    procedure TfmMain.SetContentText(a: Attachment); 
    var
      filename: String;
    begin
      filename := IntToStr(a.id) + '_' + a.filename;
     
      with TMemo.Create(panel) do begin
        Parent := panel;
        ScrollBars := ssVertical;
        Align := alClient;
        BorderStyle := bsNone;
        Lines.LoadFromFile(filename);
      end;
    end;

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    il faut garder la référence de ton objet créé dynamiquement.
    Si tu ne créés qu'un et un seul objet dynamiquement, sur le clic de ta listbox, tu pourrais garder cette référence (peu importe la classe), dans l'objet associé à l'item de ta liste, ainsi, tu peux libérer.

    Si tu n'a qu'un seul objet simultanément de créé, il faut juste créer une var. de type TControl (composant visuel), et l'affecter a ta derniere création.

    Tu peux ainsi faire un Control.Free indépendemment de la classe instanciée.
    Voir mieux, FreeAndNil( Control ), pour savoir si un objet a été instancié ou non.

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 925
    Points : 6 040
    Points
    6 040
    Par défaut
    Bah, utilise la méthode Free disponible pour tous les objets.

  4. #4
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 91
    Points
    91
    Par défaut
    J'ai résolu mon problème. Bon vous allez me dire c'est un peu brutal comme méthode mais au moins si jamais je dois créer plus d'un composant dans mon panel je n'aurais pas a revenir dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      for i:=panel.ControlCount-1 downto 0 do
        panel.Controls[i].Free;
    En gros je boucle sur les composants visuels de mon panel et je les Free.
    Merci pour vos réponses.
    ++

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

Discussions similaires

  1. [FLASH MX2004] Chargement dynamique de composant
    Par stailer dans le forum Flash
    Réponses: 4
    Dernier message: 08/07/2005, 00h40
  2. Déplacement dynamique de composants à l'exécution
    Par tekilx dans le forum Composants VCL
    Réponses: 8
    Dernier message: 05/07/2005, 10h46
  3. suppression d'un composant dans delphi 6
    Par hiko-seijuro dans le forum Composants VCL
    Réponses: 1
    Dernier message: 21/06/2005, 16h00
  4. Suppression dynamique des bases...
    Par elmagnifico dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/04/2005, 17h13
  5. Création dynamique de composants et destruction
    Par cpdump dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/01/2005, 17h57

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