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 :

effacer des composants crée dynamiquement


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Par défaut effacer des composants crée dynamiquement
    BOnjour,

    Je vous écris pour vous demander une aide pour supprimer des composants.

    Rappel:
    Lors de mon programme, quand je clique sur un champ de listbox je crée des TLabel en fonction de paramêtre:

    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
    Offset := 0;
    NbPas := 0;
    WHILE NbPas < ListboxMP.Count DO
       BEGIN
           WITH TLabel.Create(Self) DO
              BEGIN
                  V:= StrToInt(ListBoxPN.Items[NbPas]);
                  W := round(0.000315*V + 30);
                  Parent:= TabSheet7;
                  Left:= W;
                  Font.Color := ClWhite ;
                  Font.Style := [fsBold];
                  Color := ClNavy ;
                  Top:=25+Offset;
                  Height:=13;
                  Width:=155;
                  Autosize:=false;
                  Layout:=tlCenter;
                  WordWrap:=True;
                  Name:='TestPas'+ IntToStr(NbPas+1);
                  Caption:= ListBoxMP.Items[NbPas]+ ' : ' + ListBoxPN.Items[NbPas] + ' Km';
                  NbPas := NbPas+1;
                  Offset := Offset + 16;
                  OnMouseMove :=  DeplacerLabel;
               END;
         END;
    Cepdnant je ne peux recliquer directement sur un autre champ car il me dira que les TLabel existe deja (Name: TestPas1,....)

    Donc je souhaite d'abord effacer d'éventuelles Label avant d'en créer!

    Voila le HIC! je ne sais pas comment faire et la onction TLabel.Delete(Self) n'existe pas!
    Quelqu'un aurait une petite idée????

    merki

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 88
    Par défaut
    Juste une petite suggestion :

    à chaque création d'un label, tu ajoutes son NAME dans une StringList,
    et avant de créer ton label, tu vérifies qu'il n'existe pas déjà dans ta StringList.

    Et sans passer par une StringList intermédiaire :

    Si tu veux absolument le supprimer avant de le recréer, tu fais une boucle sur les contrôles de ta fenêtre en cherchant un label dont le nom est 'TestPas'+ IntToStr(NbPas+1) puis tu le supprimes avec Free.

  3. #3
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut


    Il faut utiliser la méthode Free.

    Exemple :
    Tout est expliqué dans l'aide de DELPHI.



  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 88
    Par défaut
    Voici un exemple à intercaler dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       BEGIN
           for I := ComponentCount -1 downto 0 do
               if Components[I] is TLabel then
                  if TLabel(Components[I]).Name='TestPas'+ IntToStr(NbPas+1)
                     then TLabel(Components[I]).Free;
     
           WITH TLabel.Create(Self) DO
              BEGIN
    j'utilise une boucle for...downto car dans le cas d'une suppression de label, ComponentCount est décrémenté automatiquement et tu obtiendrais une erreur d'indice avec une boucle for...to

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Par défaut
    j'ai écrit un truc comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Offset := 0;
    NbPas := 0;
    WITH TLabel DO
    BEGIN
      WHILE NbPas < ListboxMP.Count DO
        BEGIN
         Name:='TestPas'+ IntToStr(NbPas+1);
         Free;
         NbPas := NbPas+1;
        END;
    END;
    est ce bon,?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Par défaut
    excusez moi j'avais pas vu vos réponses

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    du fait qu'il est mis un paramettre dans son create il n'est pas obligé de les detruire manuellement .
    à la fermeture de la fenettre il seront tous detruit automatiquement
    sinon pour detruir un simple tabel utilise
    la fonction findcomponent une fois trouver l'instance tu fait un free

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function Maform.DetruitLabel(Name : String) : Boolean;
    var
      lb : Tlabel
    begin
       Result := False;
       lb :=  Tlabel (FindComponent(Name));
       if assigned (lb) Then
       begin
          Freeandnil(lb);
          Result := True;
       end;  
    end;
    @+ Phil

  8. #8
    Membre éclairé Avatar de Soulama
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 619
    Par défaut
    Salut,
    si tu crée un compo come sui:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       lblObj:= TLabel.Create(Self);
    le programme soccupe de leffacement du label ala fin, alor ta pa besoin de leffacer explicitement, parcontre si tu fais lblObj:= TLabel.Create(nil);
    faut explicitement faire un FreeAndNil(lblObj) a un Moment donné(OnDestroy Event par example).

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/07/2007, 09h42
  2. Action sur des boutons crées dynamiquement
    Par barthelus76 dans le forum SWT/JFace
    Réponses: 13
    Dernier message: 28/06/2007, 20h32
  3. suppression des images créées dynamiquement
    Par bhahmed dans le forum C++Builder
    Réponses: 3
    Dernier message: 10/09/2006, 21h37
  4. déplacement des Timage créées dynamiquement
    Par bhahmed dans le forum C++Builder
    Réponses: 18
    Dernier message: 22/08/2006, 16h02
  5. Composant crée dynamiquement & Access in invalid memory
    Par Sunchaser dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/02/2005, 01h03

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