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 :

Melanger listbox


Sujet :

Composants VCL Delphi

Vue hybride

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut Melanger listbox
    Bonjour, j'ai beau chercher comment melanger une listbox, aucun mais aucun sujet la dessus. Alors je me suis dit soit c'est tous bete soit personne on en a jamais eu besoin. Bref si quelqu'un pourrai m'indiquer comment melanger une listbox

    Merci d'avance pour vos réponses

  2. #2
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 76
    Par défaut
    si par mélanger une listbox tu entends changer aléatoirement l'ordre des éléments, c'est pas très compliqué... je vois bien un truc dans le genre:
    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
     
    procedure Melanger();
    var
      S: TStringList;
      i: integer;
    begin
      Randomize();
      S := TStringList.Create();
      ListBox.BeginUpdate;
      try
        while ListBox.Items.Count > 0 do begin
          i := Floor(rand(ListBox.Items.Count + 1));
          S.Items.Add(ListBox.Items[i]);
          ListBox.Items.Delete(i);
        end;
          ListBox.Items.Assign(S);
      finally
        S.Free;
        ListBox.EndUpdate;
      end;
    end;
    C'est qu'un exemple fait de tête et pas testé par contre, mais tu peux utiliser un code dans l'esprit.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    OK merci de ta réponse je vais essayer

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    Bon j'ai tester le code il y a des erreurs je les ai toutes corrigé sauf une.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Floor(rand(ListBox.Items.Count + 1));
    Cette syntaxe ne lui plait pas. Voit-tu d'où sa peut venir ?

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    La fonction s'appele pas "Rand" mais "Random".

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    Le problème n'était pas la c'est Floor qui déconne apparament

  7. #7
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    A la place de "floor(x)" utilise "round(x-0.5)".

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    pour enlever 0,5 il faut mettre i en real ? SI oui je me rappelle pu comment reppasser i en int pour le reste sinon les types corresponde pas. C'est pas un truc dans le genre FloattoInt

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    Je me suis gourrer c'est au niveau de random que sa deconne avec le - 0,5

  10. #10
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    La fonction random donne un reel.
    Sinon, pour passer d'un réel X à un entier N, j'utilise N:=round(X) et pour l'inverse X:=N ;

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    OK, le programme ce lance mais dès que j'active la fonction elle bug et sa marche pas.
    Quelqu'un en a une qui marche ?

  12. #12
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    En fait, l'erreur vient de ce que Floor(rand(ListBox.Items.Count + 1))
    ou plutot (round(random(ListBox.Items.Count + 1)-0.5) peut donner ListBox.Items.Count et le max c'est ListBox.Items.Count-1, d'où un dépassement.
    Solution : Remplace -0.5 par -1.5.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 68
    Par défaut
    Nikel sa marche merci

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut
    Voila j aimerais bien faire la meme chose mais a chaque fosi que je lance le programme mon pc plante et je suis bon pour le reset. Voici le code que je met

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        ListBox1: TListBox;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ListBox1.Items.Add(Edit1.Text)
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      S: TStringList;
      i: integer;
    begin
      Randomize();
      S := TStringList.Create();
      ListBox1.Update;
      try
        while ListBox1.Items.Count > 0 do begin
          i := round(random(ListBox1.Items.Count + 1)-0.5);
          S.Add(ListBox1.Items[i]);
          ListBox1.Items.Delete(i);
        end;
          ListBox1.Items.Assign(S);
      finally
        S.Free;
        ListBox1.free;
      end;
    end;
     
    end.

  15. #15
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    L'instruction "ListBox1.free" supprime le composant ListBox. Pas logique ! Ca expliquerait un plantage si on clique sur un bouton ensuite.

  16. #16
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Et aussi,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    i := round(random(ListBox1.Items.Count + 1)-0.5);
    peut donner i=ListBox1.Items.Count ce qui est 1 de trop.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut
    oki merci de ta reponse mais c'est quoi l insctruction pour liberer l update de la lis box alors car a la base c'est listbox.endupdate mais ca existe pas

  18. #18
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour

    J'ai poas beien compris, mais pour efacer toutes les lignes de la listbox, c'est "listbox1.items.clear".

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

Discussions similaires

  1. DrawItem d'un listbox...
    Par scorpiwolf dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/06/2007, 15h50
  2. [Listbox] ScrollBar Horizontal
    Par haleem dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/04/2005, 07h53
  3. Recuper les items de ListBox d'une autre application [API?]
    Par Shamanisator dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 12h32
  4. [Canvas] Listbox, couleur et multiselect
    Par rbag dans le forum Composants VCL
    Réponses: 3
    Dernier message: 25/09/2002, 13h02
  5. Copier le texte d'un ListBox dans le clipboard.
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/08/2002, 08h20

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