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écouper une StringList en plusieurs StringList ?


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut Découper une StringList en plusieurs StringList ?
    Bonjour à tous,

    Je cherche à découper une StringList en plusieurs parties.
    Découper la liste en 2 parties est facile, j'utilise ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for I := SL1.Count - 1 downto (SL1.Count div 2) do
    begin
      SL2.Insert(0, SL1[I]);
      SL1.Delete(I);
    end;
    Mais imaginons que le nombre de parts soit dynamique (SpinEdit par exemple), comment procéder ?

    Je suis un peu perdu...
    Merci par avance

    Beny

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 560
    Points : 25 156
    Points
    25 156
    Par défaut
    Il n'y a pas grand chose qui change !
    Un SpinEdit configuré pour aller de 0 à Count qui indique le nombre de part à conserver

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for I := SL1.Count - 1 downto SpinEdit.Value do
    begin
      SL2.Insert(0, SL1[I]);
      SL1.Delete(I);
    end;
    ou un nombre de part à éliminer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for I := SL1.Count - 1 downto SL1.Count - SpinEdit.Value  do
    begin
      SL2.Insert(0, SL1[I]);
      SL1.Delete(I);
    end;

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut
    Merci pour ta réponse, je me suis mal exprimé en fait.

    Car découper la liste en plusieurs parties ne pose pas de problèmes, mais la répartition en plusieurs StringList elle me pose problème...
    Cela demande aussi la création d'un nombre dynamique de StringList égal à la valeur du SpinEdit.

    Je ne sais pas si je suis très clair...

    J'ai commencé cela de cette manière, mais après...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i := SL1.Count - 1 downto (SL1.Count div SpinEdit1.Value) do
      begin
        SL2.Insert(0, SL1[i]);
        SL1.Delete(i);
      end;
    Beny

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 560
    Points : 25 156
    Points
    25 156
    Par défaut
    Ah, le SpinEdit indique le nombre de liste de 1 à n donc !
    Ah oui, ça change tout !

    Effectivement, il te faut donc créer autant le liste que nécessaire !

    Voyons le cas en 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      MoveCount :=  (SL1.Count div SpinEdit1.Value);
      for i := SL1.Count - 1 downto SL1.Count - MoveCount  do
      begin
        SL2.Insert(0, SL1[i]);
        SL1.Delete(i);
      end;
     
      for i :=  SL1.Count - MoveCount - 1 downto SL1.Count - 2 * MoveCount  do
      begin
        SL3.Insert(0, SL1[i]);
        SL1.Delete(i);
      end;
    En Etudiant, ce code on peut donc dégager un algo, plus général (c'est la phase d'analyse qui t'a manqué)
    C'est souvent plus simple de pondre un code à itération fixe, de regarder ce qui reste pareil et ce qui change pour le re-pondre en itération indéterminée
    On peut donc l'écrire dans une autre boucle !

    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
     
    var
      SLL := array of TStringList;
    begin
      MoveCount :=  (SL1.Count div SpinEdit1.Value);
      SetLength(SLL, SpinEdit1.Value);
      SLL[0] := SL1;
      for k := 1 to SpinEdit1.Value - 1 do
      begin
        SLL[k] := TStringList.Create();
        for i := SL1.Count -  ((k-1) * MoveCount) - 1 downto SL1.Count - (k * MoveCount)  do
        begin
          SLL[k].Insert(0, SL1[i]);
          SL1.Delete(i);
        end;
      end;
    Bon avec un while, on pourrait avoir un algo plus élégant !

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut
    Merci beaucoup pour ces explication

    Bizarre mais ma procédure me retourne 1 ligne, puis 2, puis 3, puis 4, ... :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i, k: integer;
      SLL: array of TStringList;
      MoveCount: integer;
      SL1: TStringList;
    begin
      SL1 := TStringList.Create;
      SL1.Assign(ListBox1.Items);
     
      MoveCount := (SL1.Count div SpinEdit1.Value);
      SetLength(SLL, SpinEdit1.Value);
      SLL[0] := SL1;
     
      for k := 1 to SpinEdit1.Value - 1 do
      begin
        SLL[k] := TStringList.Create();
        for i := SL1.Count - ((k - 1) * MoveCount) - 1 downto SL1.Count -
          (k * MoveCount) do
        begin
          SLL[k].Insert(0, SL1[i]);
          SL1.Delete(i);
          ShowMessage(SLL[k].Text);
        end;
      end;
    end;
    Beny

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    noubli pas que SL1.Count utilisé dans la boucle interne sera modifier car tu utilise SL1.delete[i], mieux supprimer les ligne à la fin, ou utilisé une constante=SL1.Count

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 108
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par edam Voir le message
    noubli pas que SL1.Count utilisé dans la boucle interne sera modifier car tu utilise SL1.delete[i], mieux supprimer les ligne à la fin, ou utilisé une constante=SL1.Count
    Ah oui, merci
    Quelques boucles qui s’entrelassent et je me perd !

    Je vais 'checker' tout ça.

    Beny

Discussions similaires

  1. [XL-2003] Découper une cellule en plusieurs
    Par nicolasfo dans le forum Excel
    Réponses: 5
    Dernier message: 23/06/2011, 14h48
  2. [AC-2003] Découper une table en plusieurs tables VBA.
    Par Tinien dans le forum VBA Access
    Réponses: 6
    Dernier message: 07/12/2009, 09h48
  3. [Video] Découper une vidéo en plusieurs parties
    Par chris223 dans le forum Multimédia
    Réponses: 1
    Dernier message: 16/06/2008, 17h38
  4. Découper une classe en plusieurs fichiers de code
    Par Christophe_ dans le forum Visual Studio
    Réponses: 1
    Dernier message: 21/06/2007, 20h54
  5. Réponses: 2
    Dernier message: 07/09/2006, 12h17

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