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 :

Détruire un objet créé dynamiquement


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Par défaut Détruire un objet créé dynamiquement
    Bonjour ,

    J'ai un souci à propos de la destruction de plusieurs objets avec Delphi xe3. J'ai créé des tlabel dynamiquement dans une boucle selon les résultats de ma database
    et le problème est que quand je veux changer de résultats il faut que je les supprime et crée de nouveaux label. Mais s'ils sont créés dynamiquement, ils n'existent pas dans la "form", vous voyez ... Comment les détruire après un changement de résultat ?

    Voici mon code :

    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
     
    procedure TForm5.ComboBox1Change(Sender: TObject);
    var
    cat,tit:string;
    i,xxx,n:integer;
    begin
    self.RemoveComponent(tlabel);
     
    xxx:=85;
    n:=1;
     cat:=combobox1.Items.Text;
     self.ADOQuery1.Prepared:=true;
    self.ADOQuery1.SQL.Text:='select title form discution d inner join cathegorie c on d.id_cat=c.id_cat where'+cat+'=nom_cat';
    self.ADOQuery1.ExecSQL;
    for i:=0 to self.ADOQuery1.DataSetField.FieldCount-1  do
    begin
      with tlabel.Create(self) do
        begin
          Parent :=self;
     caption:=self.ADOQuery1.Fields.DataSet.Fields.ToString;
     top:=  xxx;
     left:=32;
     name:='lab'+ inttostr(n);
        end;
        self.ADOQuery1.Next;
        xxx:=xxx+10;
        n:=n+1;
    end;

    Merci.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par animalx123 Voir le message
    et le probleme est quand je veux changer de resultats il faut que je les suprime et cree de nouveaux label ,mais si il son cree dynamiquement ils existent pas dans la forme vous voyez ...
    Eh bien si, du moment qu'ils ont été créés et que leur propriétaire (Owner) est défini comme étant la fiche, il existent dans la fiche...
    TLabel descend d'un TControl. Si on parcourt la liste de des contrôles de la fiche (Self.Controls, Self étant une instance de TForm5), on va les retrouver ainsi que les autres contrôles dont la fiche est parente.

    Citation Envoyé par animalx123 Voir le message
    comment les detruire apres un changement de resultat
    Il faut déjà pouvoir les identifier de manière non ambiguë avant de pouvoir les supprimer. Cela doit être fait lors de la création, soit avec un nom qui indique leur création dynamique et qui n'est pas réutilisé par un autre label créé statiquement, ou ailleurs dynamiquement, soit avec un autre élément comme un tag (TLabel.Tag).

    Ensuite lorsqu'on veut supprimer ces labels créés dynamiquement, il faut parcourir la liste des contrôles de la fiche, identifier les contrôles, les détruire et les retirer de la liste. Le contrôle est également référencé en tant que composant dont la fiche est propriétaire (tlabel.Create(self)). il faut également le retirer de cette liste.

    Peu ou prou, cela donne :
    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
    var
     i: Integer;
     AControl: TControl;
    //...
      for i := self.ControlCount - 1 downto 0 do
      begin
        // Je considère que les contrôles créés dynamiquement ont été tagués avec la valeur 100 !
        // que leur Parent est Self  (Parent := Self)
        // que leur propriétaire est Self (Create(Self))
        if (Self.Controls[i] is TLabel) and (Self.Controls[i].Tag = 100) then
        begin
          AControl := Self.Controls[i];
     
          Self.RemoveControl(AControl);   // Parent := Self
          Self.RemoveComponent(AControl); // Create(Self)
          AControl.Free;
        end;
      end;
    Attention, je parcours la liste des contrôles, donc ce code n'est valide tant que les contrôles créés ont pour Parent et Owner le même contrôle.

  3. #3
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    Une autre solution qu'une j'utilise pas mal, c'est de stocker dans une TObjectList des pointeurs sur les objets qui m'intéressent (ici des label) pour pouvoir les retrouver plus tard.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  4. #4
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    Citation Envoyé par Lung Voir le message
    Une autre solution qu'une j'utilise pas mal, c'est de stocker dans une TObjectList des pointeurs sur les objets qui m'intéressent (ici des label) pour pouvoir les retrouver plus tard.
    Il me semble qu'il existe même un TComponentList qui gère aussi le retrait automatique si il reçoit une FreeNotification (Le fait de stocker des composants visuels peut être dangereux si on ne gère pas les FreeNotification)

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

Discussions similaires

  1. Création d'un alias dynamique sur delphi
    Par Ghilas1985 dans le forum Bases de données
    Réponses: 5
    Dernier message: 05/11/2009, 22h49
  2. addEventListener sur objet créé dynamiquement
    Par Jim_Nastiq dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/10/2009, 16h20
  3. Objet pile cree dynamiquement.
    Par Linu6 dans le forum C++
    Réponses: 1
    Dernier message: 25/02/2008, 14h22
  4. comment peut on animer un objet sur delphi?
    Par tchimou dans le forum Delphi
    Réponses: 5
    Dernier message: 11/05/2007, 23h53
  5. Réponses: 9
    Dernier message: 31/05/2006, 11h56

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