Bonjour à toutes et à tous,
Le problème que je rencontre n'existait pas alors que j'utilisais des versions précédentes de Lazarus. Je viens encore de le vérifier avec la version 1.6.4. Je n'ai plus la version 2.1.2 avec laquelle, il me semble que ça fonctionnait toujours. Aujourd’hui, avec la version 2.2.6 : ça bugue !
La procédure en question est la suivante :
et elle bugue lors de l'appel suivant :
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 function StringToDate(Dt, Frmt: string): TDateTime; {Transforme une chaîne représentant une date en date au format TDateTime. La chaîne "Frmt" représente le format de la date "Dt". "Frmt" doit comporter le même nombre de caractères que "Dt". Le caractère "D" est mis là où sont les caractères (2) représentant le jour, le caractère "M" est mis là où sont les caractères (2) représentant le mois et le caractère "Y" est mis là où sont les caractères (2 ou 4) représentant l'année. Tout autre caractère est mis en lieu et place des caractères de séparation, s'il y en a. Exemples : - 08/06/11 --> DD/MM/YY ou DD-MM-YY ou DDxMMyYY - 20110608 --> YYYYMMDD} var CY, i, MY, Y: Integer; SY, SM, SD: string; begin SY:= ''; SM:= ''; SD:= ''; for i:= 1 to Length(Frmt) do begin if Frmt[i] = 'Y' then SY:= SY+Dt[i] {Repérage des caractères de l'année} else if Frmt[i] = 'M' then SM:= SM+Dt[i] {Repérage des caractères du mois} else if Frmt[i] = 'D' then SD:= SD+Dt[i]; {Repérage des caractères du jour} end; Y:= StrToInt(SY); if (Y < 100) then {Si l'année est codée sur deux chiffres ...} begin MY:= (CurrentYear div 100)*100; CY:= CurrentYear-MY; {.. et que cette valeur est > à l'année courante, ..} if (Y > CY) then Y:= Y+MY-100 {... on se place au siècle précédent ...} else Y:= Y+MY; {sinon, on se place dans le siècle courant} end; Result:= EncodeDate(Y, StrToInt(SM), StrToInt(SD)); end;
C'est-à-dire lorsqu'elle est un paramètre passé à la fonction "DateTimeToString".
Code : Sélectionner tout - Visualiser dans une fenêtre à part DateTimeToString(S, FormatDateN, StringToDate(S, DateSep));{Remise au format dd/mm/yyyy}
A d'autres endroits de mon programme où j'utilise "StringToDate" directement, ça se passe bien.
Le problème, que je détecte en passant la souris sur une variable, est le suivant :
- Dans "DateTimeToString", "S vaut : "22/02/2024",
- Je fais F7 pour entrer dans "StringToDate" et "Dt" vaut : "22/02/24;219.00;222.50;218.70;221.50;551476"
- J'avance d'un pas (F7) et "Dt" passe à "nil" et donc logiquement la suite bugue.
Je ne comprends pas ce qui se passe. J'ai nettoyé et reconstruit le programme, j'ai essayé différents niveaux d'optimisation (0, 1, 2), le problème est le même.
Par ailleurs, même quand ça fonctionne, les infos du débogueur me laissent rêveur :
Result = 20/03/2014 alors que result est du type TDateTime !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Result = 20/03/2014 var Result: TDateTime E:\Lazarus\Projets_ChP\Gestion_Valeurs\GesUtils.pas(571,42)
Si vous avez une idée du problème ...
Cordialement.
Pierre.
Partager