... 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 :
- 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 :
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 :
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.
Partager