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

Lazarus Pascal Discussion :

Supprimer élément d'un tableau d'objets [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 61
    Points
    61
    Par défaut Supprimer élément d'un tableau d'objets
    Bonjour,

    Je suis en train de réaliser un petit outil et j'ai un soucis pour supprimer un élément d'un tableau d'objets... Je m'explique :

    J'ai un TPageControl ou je veux ajouter dynamiquement des TTabSheet, jusque la ça va, mais dans ces TTabSheet j'y ajoute un TFrame (TFraTech), ce qui veut dire que chaque TTabSheet est parent d'un TFraTech...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure TFrmMain.TlbAjouterClick(Sender: TObject);
    var i : integer;
    begin
         PCzones.AddTabSheet;
         i := PCzones.PageCount-1;
     
         setlength(TTech,PCzones.PageCount);
         Ttech[i] := TFraTech.Create(PCzones.Pages[i]);
         ttech[i].Parent := PCzones.Pages[i];
         TTech[i].Align:=alClient;
         PCzones.Pages[i].Caption:='Zone ' + IntToStr(PCzones.PageCount);
    end;
    Pour l'ajout ça fonctionne, je n'ai pas de soucis, mais comment je peux permettre à l'utilisateur de supprimer une page ? Je dois certainement déplacer un objet TFraTech en faisant TTech[i] := TTech[i]+1 et supprimer le TTabSheet mais ça ne fonctionne pas...
    Quelqu'un pourrait il m'aider avec un bout de code pour supprimer et le ttabsheet et le TFraTech qui lui est associé ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 875
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 875
    Points : 15 293
    Points
    15 293
    Par défaut
    Bonjour,
    Citation Envoyé par Manusm Voir le message
    mais ça ne fonctionne pas...
    ça ne fonctionne pas n'est pas un message d'erreur valide pour qu'on comprenne ce qui se passe ou pas -- Là, on peut juste supposer qu'il ne se passe rien, mais "supposer" n'a jamais fait avancer le schmilblik.

    Par ailleurs, c'est gentil de nous montrer le code qui fonctionne, mais celui qui ne fonctionne pas aurait été aussi intéressant, sinon plus...

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 61
    Points
    61
    Par défaut
    Pardon tu as raison, je me prends tellement la tete dessus que j'ai oublié de rentrer dans le detail...

    Voici le code pour supprimer un TTabSheet et du coup un élément du tableau :

    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
     
    //Suppression des pages
    procedure TFrmMain.TlbSupprimerClick(Sender: TObject);
    var idx : integer;
    begin
         if pczones.PageCount <= 1 then exit;
         idx := pczones.ActivePageIndex;
         SupprimerZone(idx);
         pczones.Pages[idx].Destroy;
     
    end;
     
    procedure TFrmMain.SupprimerZone(index : integer);
    var i : integer;
    begin
         if (index = pczones.PageCount-1) then
            TTech[index].Destroy
         else
         begin
              for i := index to pczones.PageCount-2 do
                  TTech[i] := TTech[i+1];
              TTech[i+1].Destroy;
         end;
         setlength(TTech,pczones.PageCount-1);
    end;
    et voici le message d'erreur :
    Nom : Erreur.png
Affichages : 385
Taille : 7,7 Ko

    Je pense que du coup j'essaye de supprimer un objet qui n'est plus accessible...

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    D'après ton code, l'objet TTabSheet est propriétaire de l'objet TFrame (TFraTech.Create(PCzones.Pages[i])), si tu supprimes le TabSheet, le TFrame contenu sera automatiquement supprimé. Si la seule finalité du tableau TTech est la gestion du cycle de vie des TFrame, il est alors sans doute inutile.

    ATTENTION: Ne pas utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pczones.Pages[idx].Destroy;
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pczones.Pages[idx].Free;
    Le destroy ne sert qu'à préciser les règles de destruction de l'objet mais a un usage interne.

    Cdlt

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 61
    Points
    61
    Par défaut
    Oui je pense que tu as raison il doit etre inutile, mais comme j'ai un objet TFrame qui se répète autant de fois qu'il y a de pages sur le TPageControl je me suis dis que c'etait la meilleure idée... Connais tu une autre façon de faire ?

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 61
    Points
    61
    Par défaut
    Ou peut etre enlever le tableau et faire un objet hérité d'un TTabSheet ?

  7. #7
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Re-salut

    Je pense que l'intérêt du tableau est de donner un accès direct et permanent au TFrame. Le problème est qu'il doit refléter les TabSheet englobants au cours de leur cycle de vie.
    Une liste de TFrame (TList ou sa version générique TFPGList) serait sans doute plus simple à gérer car les insertions et suppressions sont gérées directement.

    Tu emploies un TFrame dans chacune de tes TTabSheets, ce qui me laisse penser qu'ils ont des similitudes. Ma question est : est-ce que tous tes TTabSheets ont la même structure (composants identiques, configurés et positionnés identiquement) ou est-ce que les pages peuvent être différentes ?

    Si les pages sont identiques, le remplacement du TPageControl par un TTabControl pourrait être envisagé, cela consommerait moins de ressources et tu n'aurais en réel plus qu'un seul composant TFrame à gérer.

    Mais revenons à ton code que je viens d'examiner plus précisément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TFrmMain.SupprimerZone(index : integer);
    var i : integer;
    begin
         if (index = pczones.PageCount-1) then
            TTech[index].Destroy
         else
         begin
              for i := index to pczones.PageCount-2 do
                  TTech[i] := TTech[i+1];
              TTech[i+1].Destroy;
         end;
         setlength(TTech,pczones.PageCount-1);
    end;
    au vu de la dernière instruction, tu appelles SupprimerZone après suppression de page. Auquel cas du fait de la propriété du TTabSheet sur le TFrame, le TFrame a déjà été libéré et sa référence dans TTech est devenue invalide. La correction consiste donc déjà à éliminer les instructions TTech[nnn].Destroy;. L'autre souci est que dans ce cas de figure, pczones.PageCount est déjà à jour (suite à la suppression du TTabSheet), en avance sur l'état du tableau (1 élément de plus), il faut donc aller jusqu'à pczones.PageCount-1 pour bien atteindre tous les éléments du tableau. Ton code deviendrait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TFrmMain.SupprimerZone(index : integer);
    var i : integer;
    begin
      for i := index to pczones.PageCount-1 do
        TTech[i] := TTech[i+1];
       setlength(TTech,pczones.PageCount-1);
    end;
    Supposant que l'index est celui du TTabSheet avant suppression. Si c'est le dernier TTabSheet, la boucle for n'est pas parcourue et on se recadre bien sur les pages.

    Cdlt

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 87
    Points : 61
    Points
    61
    Par défaut
    Merci pour cette réponse et tes conseils !

    Je vais effectivement plutôt utiliser un TTabControl mais ta solution fonctionne !

    Bonne journée

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

Discussions similaires

  1. Supprimer élément d'un tableau
    Par totot dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 01/11/2014, 13h03
  2. Supprimer élément d'un tableau
    Par cougar5 dans le forum Langage
    Réponses: 16
    Dernier message: 07/04/2011, 22h36
  3. Réponses: 2
    Dernier message: 09/04/2008, 11h42
  4. Supprimer éléments d'un tableau
    Par liline150 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 02/09/2007, 14h51
  5. Supprimer un élément d'un tableau
    Par CaptainChoc dans le forum Langage
    Réponses: 15
    Dernier message: 23/12/2002, 23h14

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