où on passe une string contenant une date formatée d'une manière "speciale", et où on passe une string contenant le format a utilisé pour decoder cette date.
J'en ai besoin parce que je recoit un fichier ou les date sont formatée en YYYYMMDD (par exemple '19920519' pour le 19 mai 1992), et donc la fonction StrToDate ne fonctionne pas.
Etant donnée que le format de date peut changé, j'aimerais donc savoir si il existe une fonction telle que celle decrite çi-dessus.
Je sais pas si mes explications sont claires, mais si jamais vous avez une idée, je suis preneur!
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 12 janv. 2008 à 19:00
Bien vu, Cirec. C'est sans appel.
A noter que tous les Captions et Text de la VCL (Edit, Memo (Memo.Text et Memo.Lines[x]), Label, Button, etc...) que j'ai testés produisent le même effet. Ils rajoutent donc automatiquement un caractère (#0, ou bien #13#10 ?) à la fin...
Ça me laisse perplexe.
D := Pr;
// Comme D a été déclaré en tant que string Delphi fait
// une copie du PChar dans la chaine D soit '78'#0
//
// Pr
// |
// V
// '12345678'#0
//
Pr^ := #0;
// Là on réduit sauvagement la taille du PChar originel
// Pr
// |
// V
// '123456'#0'8'#0
//
// Et on s'apperçoit que le bout '8'#0 est en quelque sorte perdu
// Ce qui je suppose pose dans certaines conditions des problèmes
// de désallocations et/ou des exceptions.
Il faut être très très prudent avec la manipulation directe des PChar. Les programmeurs en C connaissent d'ailleurs très bien les nombreux problèmes que ceux ci posent.
N.B. Pour info j'aurais plutôt ecris la fonction ainsi :
type
TDatePtr = ^TDate ;
TDate = packed record
Y : array[0..3] of char ;
M,D : array[0..1] of char ;
end ;
Function ReverseDateT(Const Str : String): String;
Var
P : PChar;
Date : TDatePtr absolute P ;
Begin
P := PChar(Str);
Result := Format('%.2s/%.2s/%.4s', [Date.D, Date.M, Date.Y]);
End;
Cordialement. <hr />"L'imagination est plus importante que le savoir." Albert Einstein
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 12 janv. 2008 à 21:14
@WhiteHippo :
Merci pour ces explications mais je savais ce que cela allait "provoquer"
d'ailleurs c'est l'effet souhaité dans ce cas bien précis.
Mais ceci n'explique pas le problème évoqué plus haut !!!!
Par contre ton approche me plait bien je dois avouer que je n'y avais pas pensé pourtant j'utilise souvent "l'astuce" du ABSOLUTE
@Japee :
J'ai pas bien compris le "encore plus fort" ou c'est nouveau mon PC qui est hanté
je trouve ceci plus "spectaculaire":
procedure TForm1.Button1Click(Sender: TObject);
Var s : String;
begin
S := '1992' + #0 + '0518';
Button1.Caption := S;
ShowMessage(Button1.Caption);
// encore plus fort! :
Label1.Caption := IntToStr(Length(s));
end;
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 12 janv. 2008 à 21:21
@Cirec :
Par "encore plus fort", je voulais dire qu'en appelant ShowMessage, tu t'attends à passer par l'API, donc à ce que ta chaîne soit convertie en C, donc tronquée à l'endroit du "#0".
Alors qu'en l'attribuant à un "caption" ou autre "text", on ne manque pas d'être surpris...
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 12 janv. 2008 à 21:28
il n'y a rien d'extraordinaire dans cela ...
cela prouve juste que les Caption, Text et autres soit disant String sont en fait des PChar
Par contre ce qui est étonnant c'est que (sur le problème cité plus haut) le simple fait de réaffecter la variable String avec sa propre valeur empêche ce fameux bug
Et comme ça c'est encore plus bizarre !!!!
Var aStr1 : String = '19921905';
procedure TForm1.Button5Click(Sender: TObject);
begin
ShowMessage(IntToStr(Length(aStr1)));
aStr1 := aStr1 ;
Label1.Caption := ReverseDateT(aStr1);
ShowMessage(IntToStr(Length(aStr1)));
end;
on ne peut donc pas dire que Delphi rajoute un zéro terminal dans ce cas précis
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 12 janv. 2008 à 21:32
Mais elle est troqué chez moi, dans les deux cas j'obtiens 1992
avec ce code :
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Caption := '1992' + #0 + '0518';
ShowMessage(Button1.Caption);
// encore plus fort! :
Label1.Caption := Button1.Caption;
end;
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 13 janv. 2008 à 21:19
1 065 121 mecs, ah quand même ?
Et quasiment pas une fille...
Faut dire qu'on a une tellement grande gueule (surtout certains, suivez mon regard), que je comprends qu'elles se fassent discrètes.
Ma conclusion, elle tient en quelques mots.
Delphi nous fournit un type de chaîne facile à manier, souple, performant, que le monde entier (et surtout les autres langages de programmation) nous envie : AnsiString.
A moins d'y être obligés, ou d'être un peu maso, je ne vois pas ce qui nous pousserait à utiliser PChar. Sauf à vouloir fréquenter l'api windows, ou autre dll codée en C...
Mais maso, on l'est tous un peu sur delphifr, sinon on passerait pas notre temps à se torturer les neurones. On se servirait de la VCL sans chercher à comprendre et puis c'est tout !
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 13 janv. 2008 à 23:40
C'était un "mecs" générique, bien sûr... :)))
Il est quand même difficile de ne pas se frotter de temps en temps à l'API Windows ou
aux DLL. Mieux vaut comprendre PChar, tout comme les pointeurs d'ailleurs.
Il faut reconnaître que Delphi nous fait la vie belle avec tout ça. Peut-être un peu trop question "ouverture d'esprit".
La description complète du format interne de ces chaînes n'est pas documentée par Borland, qui se reserve le droit de modifier ce format interne dans les versions à venir.
Comme le suggérait Whitehippo, gare au débordement d'intervalle et à la corruption mémoire avec PChar!
Et le jour où on commence à utiliser WideString avec l'Unicode, on se sent un peu handicapé.
M'enfin, Delphi c'est quand même super... et vous êtes là!!!