Exemple simple de manipulation d'un TListBox

Présentation
Manipulation simple de Liste.
Téléchargement
Compatibilité
Windows
0  0 
Téléchargé 92 fois Voir le commentaire
Détails
Catégories : ListBox
Avatar de Hiacine GHAOUI
Membre chevronné
Voir tous les téléchargements de l'auteur
Licence : Autre
Date de mise en ligne : 2 février 2013




Avatar de Dr.Who Dr.Who - Membre éprouvé https://www.developpez.com
le 02/02/2013 à 15:55
... mmmm
ça manque de description :


- quoi, quand, pourquoi, de quel façon

-> Description -> exemple -> possibilité d'utilisation -> conclusion.

ça manque de rigueur :

- Project1.dpr, Unit1.Dfm, Unit1.Pas ... (.RES manquant, attention quand on utilise des ressources personnalisée)

-> DemoSynchroListbox.dpr -> Main.pas -> Main.dfm
et dans le code on retrouve la même chose :

Code : Sélectionner tout
- Form1, ListBox1, Button1 ...
Aucun commentaires dans la source...
Hors c'est principalement le plus important, même si la démonstration est évidente à niveau > débutant, c'est justement le débutant qui est visé par ce genre de tuto/exemple/tricks.
Toujours commenter au moins la partie démonstrative.

Il y à de plus quelques erreurs et bourdes dans l’exécution du schéma fonctionnel (aucuns contrôles, manque de robustesse, appel récursif hasardeux), il faudrait corriger en ce sens :

Code : Sélectionner tout
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
 
Procedure TForm1.ListBox1DblClick(Sender : TObject); 
Var 
  So, Sn : String; // Chaine originale, Nouvelle chaine 
  I : integer;     // ItemIndex de ListBox1 
  EI: boolean;     // Control de sortie InputBox 
  LSn, ISn: integer; // Taille de Sn et Index dans ListBox2 pour les controls de validité 
 
const 
  Extention = '.mp3'; // Extension des fichiers 
 
Begin 
  I := ListBox1.ItemIndex; 
 
  // Item sélectionné est bien valide 
  if I = -1 then 
    exit; 
 
  // So et Sn par défaut = nom de la piste dans ListBox1 
  So := ListBox1.Items[I]; 
  Sn := So; 
 
  // Renommer la piste -> par défaut = nom de la piste dans ListBox1 
  repeat 
    Sn := InputBox('Titre', 'Entrez le nom pour la piste : " '+So+' "', Sn); 
 
    // Un nom de fichier ce n'est pas n'importe quoi, 
    // pour éviter les erreur on doit contrôler 
    ISn := ListBox2.Items.IndexOf(changeFileExt(Sn, Extention)); 
 
    // Condition de sortie de la boucle 
    EI := ((ISn = I) or (ISn = -1)) and // ne doit pas être présent dans ListBox2 
          validFileName(changeFileExt(Sn, Extention));  // doit être un nom de fichier valide 
  until EI; 
 
  // "Synchro ListBox1 -> ListBox2" --------------------- 
    // Empêche la mise à jours immédiate de listBox2 
    ListBox2.Items.BeginUpdate; 
    try 
      // on met à jours les lignes manquantes 
      while (ListBox2.Count-1) < I do 
          ListBox2.Items.Add(''); 
 
      // on oublie pas de mettre à jours l'item que l'on à renommer. 
      ListBox2.Items[I] := changeFileExt(Sn, extention); 
    finally 
      // on rafraichis ListBox2 
      ListBox2.Items.EndUpdate; 
    end; 
  // fin de la synchro ----------------------------------- 
 
  // si on est sur le dernier élément on sort. 
  If I = ListBox1.Items.Count - 1 Then 
    exit; 
 
  // on sélectionne le prochain 
  ListBox1.ItemIndex := I + 1; 
 
{//--> 
 
Dans d'un traitement automatisé de lots on passera par une boucle (For/While) et donc pas un appel récursif 
à une fonction/méthode donc on ne rappel rien du tout pour pas tuer la Stack avec une liste trop longue comme 
une banque de samples ou la mpthèques complète de l'OSP. 
Bon c'est sur qu'avec les mp3 se Sena ou One direction y'aurait pas de quoi péter la stack avec du récursif. 
 
Idéalement, externaliser le code de cette méthode et placer la boucle de cette façon 
  while ListBox1.ItemsIndex < ListBox1.Items.Count-1 do 
  begin 
   // procedure traiterElement(aListSrc, aListDest: TStrings; aSrcIndex: integer; const aExtention: string); 
   traiterElement(ListBox1.Items, ListBox2.Items, ListBox1.ItemIndex, '.mp3'); 
  end; 
 
Et surtout sans avoir la possibilité de sortir de cet appel récursif ou boucle, inputbox ne fournissant 
pas de moyen d'indiquer que l'utilisateur veux arrêter le traitement. Il nous faudrait ici une InputBox personnalisée 
qui fournirais cette possibilité. 
 
<--//} 
End;
la fonction pour valider les noms de fichiers :

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
function validFileName(const aFileName: string): boolean; 
var X,L: integer; 
begin 
  L := Length(aFileName); 
  result := (L > 1) and (L < 128)); 
  if result then 
    for X := 1 to L do 
    begin 
      result := result and not (aFileName[X] in ['\','/','<','>','*',':','?','"']); 
      if not result then 
        break; 
    end; 
end;
Bon code et bonnes corrections.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.
Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -