Bonsoir à tous
J'ai deux TList de structures ( les types et variables sont plus bas). Et, lors d'une comparaison en boucle, j'ai ce message d'erreur :
Classique. Oui, mais où ?? Avec le débogueur, j'ai localisé la fonction d'où provient l'erreur. Mais à l'intérieur de cette fonction : où est le bug ? J'ai débogué des heures durant avec un fichier LOG, et des fichiers listant les valeurs des variables, etc. Il me faudrait fixer un point d'arrêt conditionnel sur l'erreur : http://docwiki.embarcadero.com/RADSt...d%27arr%C3%AAt
Malheureusement, XE7 me le refuse (la commande apparaît en grisé dans le menu). Pourquoi ? Je ne sais pas.
Voici les types et variables :
La procédure "pilote", qui commande tout le processus :
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 Type Infos_F = record Nom_Cplt_F : array [0..255] of char; Nom_Court_F : array [0..255] of char; Date_Der_Modif : TDateTime; end; Var Lst_Infos_F : TList; // Pr essais et non utilisée ici Lst_Infos_F_Source : TList; Lst_Infos_F_Dest : TList; Idx_Lst_Source : integer; // Index des TList Idx_Lst_Dest : integer; Ptr_Infos_Fic : ^Infos_F; // Ptr sur une structure de type Infos_F Date_Der_Acces : TDAteTime; Date_F_Trouve_Ds_Lst_Infos_F_Dest : TDateTime; Rep_Source : string; Rep_Dest : string; Lst_F_Ds_Source : TStringList; // StringList chargeant le répertoire source Lst_F_Ds_Dest : TStringList; // StringList chargeant le répertoire dest
Et la fonction coupable :
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 Procedure Pilote_Simulation_Copie; begin // CHARGER DS LES TStringList LES DEUX REPERTOIRES A COMPARER Charger_Rep_Source; Charger_Rep_Dest; // CREER LES TLIST Lst_Infos_F_Source et Lst_Infos_F_Dest Creer_Liste_Infos_F_Source; Creer_Liste_Infos_F_Dest; // LIBERER LES TsTringList DEVENUES INUTILES --------------------------- if ASSIGNED (Lst_F_Ds_Source) then Lst_F_Ds_Source.Free; if ASSIGNED (Lst_F_Ds_Dest) then Lst_F_Ds_Dest.Free; // Jusque là, aucun problème { SUPPRIMER DE Lst_Infos_F_Source LES FICHIERS N'EXISTANT PAS DANS Lst_Infos_F_Dest et ce AVEC LA MEME AROBERSCENCE : ils sont deja sauvegardés, on n'y touche pas } Boucle_Purger_TList_Source_Des_F_Existant_Ds_TList_Dest; // C'est là que la bât blesse !! // etc... end;
Bon. Mon code n'est pas des plus élégants ni des plus optimisés Mais c'est à venir. Et surtout, j'aime me relire facilement. Si ça continue, je vais devoir y aller avec les pavés, les itérations et les flèches.
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 Procedure Boucle_Purger_TList_Source_Des_F_Existant_Ds_TList_Dest; Var i : integer; Nom_F_Source_Sans_Drive : string; Nom_Cplt_F_Ds_TList : string; Nom_Cplt_Sans_Drive : string; begin { - Pointer le premier élément de Lst_Infos_F_Dest. - Cet élément existe-t-il dans l'un des items de Lst_Infos_F_Source ? -> SI OUI : supprimer l'item ds Lst_Infos_F_Source - Fichier ds Lst_Infos_F_Source est PLUS RECENT que son corrolaire ds Lst_Infos_F_Dest ? -> SI OUI : ne pas supprimer l'item : c'est un fichier à copier -> SI NON : supprimer l'item de Lst_Infos_F_Source - Faire la même chose pour tous les items de la Lst_Infos_F_Source (sans dépasser le Nb d'items de Lst_Infos_F_Dest) } for i := 0 To Lst_Infos_F_Source.Count -1 do begin Idx_Lst_Source := i; if i <= Lst_Infos_F_Dest.Count then // Ne pas dépasser la limite de Lst_Infos_F_Dest begin Ptr_Infos_Fic := Lst_Infos_F_Source.Items[i]; // Pointer l'item ds Lst_Infos_F_Source Nom_Cplt_F_Ds_TList := Ptr_Infos_Fic.Nom_Cplt_F; // Correct (vérifié) Nom_Cplt_Sans_Drive := Nom_F_Sans_Drive(Nom_Cplt_F_Ds_TList); // Correct (vérifié) // Chercher un item corrolaire ds Lst_Infos_F_Dest (corrolaire = même nom de fichier, même arborescence) Idx_Lst_Source := i; // Idx_Lst_Source, var globale, a la même valeur que Idx_Local_TList_Source (locale) if Item_Existe_Ds_Lst_Infos_F_Dest(Nom_Cplt_Sans_Drive) = True then // La Fn va utiliser Idx_Lst_Source, d'où l'affectation ligne précédente begin if F_Source_Plus_Recent_Que_F_Dest(Ptr_Infos_Fic.Date_Der_Modif, Date_F_Trouve_Ds_Lst_Infos_F_Dest) = False then begin Lst_Infos_F_Source.Delete(Idx_Lst_Source); // Eliminer cet item de Lst_Infos_F_Source Dispose(Lst_Infos_F_Source.Items[Idx_Lst_Source]); // Libérer la mémoire qu'il occupait end; end Else // Pas d'item corrolaire : on garde l'item ds Lst_Infos_F_Source, puisque l'on va copier le fichier begin // Rien. end; end; // If Idx_Local_TList_Source < Lst_Infos_F_Dest.Count end; end;
Où est-ce que je me plante comme ça ?
Merci
Partager