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

Composants VCL Delphi Discussion :

comment jongler garder le meme chekbox apres un destroycomponent


Sujet :

Composants VCL Delphi

  1. #1
    Membre très actif
    Inscrit en
    Mars 2009
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2009
    Messages : 191
    Par défaut comment jongler garder le meme chekbox apres un destroycomponent
    voila, sur un flowpanel creer dynamiquement, je cree un tcheckbox dynamiquement, si je coche je tcheckbox, des tchekbox se creent dans le meme flowpanel.
    maintenant je ne vois plus trop, parce que si je decoche les autres tcheckbox devrait disparaitre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    nomflow.Name:= tcheckbox(sender).Parent.Name;//je declare nomflow:flowpanel, pour recuperer le nom du flowpanel
     
        premierchek:=tcheckbox(sender).Name;// variable tcheckbox recupere le nom de checkbox à garder
     
        tcheckbox(sender).Parent.DestroyComponents; detruit tous les composants du flowpanel en question
     
        nomchek:=tcheckbox.Create(); 
        nomchek.Parent:= nomflow;
        nomchek.Name:=premierchek;
        nomchek.Caption:=premierchek;
    ben ..bon ça marche pas, si vous une astuce suis preneur

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 52
    Par défaut
    DestroyComponents ne peut fonctionner que pour les composants qui ont pour Owner le FlowPanel que tu veux vider.
    Le problème est que l'on ne peut pas modifier ce Owner (readonly)
    Dans ton cas, passer par un DestroyComponents te contraint à recréer ta CheckBox car tu ne peux pas éviter qu'elle ne soit détruite avec toutes les autres.
    C'est dommage.
    D'autre part, il est important de bien faire tes Create(UnComposant) pour que la mémoire soit bien nettoyée quand UnComposant sera détruit, Create(nil) fera que jamais sa destruction n'interviendra, ta mémoire se poluera un peu plus à chaque fois (à moins de garder un pointeur dessus et de le libérer à la main, mais c'est une autre histoire).

    voici un exemple avec un Panel et des Boutons
    Je trouve cette manière plus appropriée
    Le panel contient 4 boutons, on click sur l'un deux pour arriver ici :
    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
    procedure TForm1.btn1Click(Sender: TObject);
    var
      vBtn : TButton;
      vPnl : TWinControl;
      i : Integer;
    begin
      vBtn := TButton(Sender);
      vPnl := vBtn.Parent;
      vBtn.Parent := nil; // sort le bouton du Panel 
      // détruit tous les autres
      for i:=vPnl.ControlCount-1 downto 0 do begin
        vPnl.Controls[i].Free;
      end;
      vBtn.Parent := vPnl; // remet le bouton dans le Panel
    end;

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 969
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 969
    Par défaut
    On peut changer le propriétaire avec la méthode InsertComponent

    Il y a beaucoup de façons de gérer ton problème:

    • Le 1er CheckBox a un propriétaire différent des suivants => Utilisation de DestroyComponents.
    • Le 1er CheckBox est aussi le 1er Control du parent => Boucle de libération downto 1,
    • Contrôle de l'instance : if Controls[i] <> nomchek then Controls[i].Free,
    • Contrôle du nom if Controls[i].Name <> 'Nom' then Controls[i].Free,
    • Utiliser la propriété Tag : 1 si le composant doit être détruit, sinon 0. if Controls[i].Tag = 1 then Controls[i].Free,
    • Ajouter les CheckBox suivants à un TObjectList => MyList.Clear.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 52
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    On peut changer le propriétaire avec la méthode InsertComponent
    noté, merci

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

Discussions similaires

  1. Comment ecrire sur la meme ligne avec la commane ECHO
    Par juflata dans le forum Windows
    Réponses: 3
    Dernier message: 24/11/2015, 10h06
  2. [WD-2013] Comment garder un champ QuickPart après une fusion
    Par dmarguet dans le forum Word
    Réponses: 1
    Dernier message: 12/06/2015, 19h50
  3. Comment garder la meme WanIP
    Par mat-tech dans le forum Hardware
    Réponses: 9
    Dernier message: 27/07/2006, 13h58
  4. Réponses: 4
    Dernier message: 18/01/2006, 18h04
  5. Comment ne pas rejouer une animation après un clic ?
    Par mmmmhhh dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 04/09/2002, 17h11

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