Salut f_atma,
Voici un code qui répond au problème posé.
Ce n'est sans doute pas le meilleur code qui soit, mais il me parait logique et simple à comprendre.
Il met en pratique l'usage de quelques méthodes fournies par Pascal/Delphi très utiles pour traiter les chaînes, et qu'il faut absolument maîtriser. En particulier : Copy, Delete, Pos, Length, Concat... et il y en a d'autres.
Si tu étudies son fonctionnement, il t'aidera dans la progression de ton étude de Delphi/Pascal.
Si tu n'utilise pas Delphi mais Turbo Pascal ou autre appli console, il te faudra légèrement l'adapter au niveau de la saisie et de l'édition.
{ Attention : vérifie la mise en forme correcte de la date, mais pas sa validité !
Retourne également une chaîne contenant les chiffres de la date sans les séparateurs }
function FormatDateIsOK(const s: string; out DigitsOnly: string): Boolean;
const
DateSeparator = '/';
var
i: Integer;
begin
Result := False;
if Length(s) < 10 then Exit;
if (s[3] <> DateSeparator) or (s[6] <> DateSeparator) then Exit;
//if not DateIsValid(s) then Exit; // mais ça complique le code
DigitsOnly := s;
DigitsOnly := StringReplace(DigitsOnly, '/', '', [rfReplaceAll]);
if Length(DigitsOnly) < 8 then Exit;
for i := 1 to 8 do
begin
if not (DigitsOnly[i] in ['0'..'9']) then
begin
ShowMessage(DigitsOnly[i]);
Exit;
end;
end;
Result := True;
end;
{ Attention : la mise en forme de l'adresse EMail est vérifiée, mais pas sa validité }
function GetPassWord(EMail, BirthDate: string): string;
var
Part1, Part2, Part3, Part4: string;
PosAt: Integer; // position de '@'
UserName: string; // nom de l'utilisateur
DigitsOnly: string; // date de naissance sans les '/' (chiffres seuls)
i: Integer;
DigitsSum: Integer; // somme des chiffres de la date de naissance
begin
Result := '';
if Length(EMail) < 6 then Exit; // minimum = 3 char + '@' + 2 char
PosAt := Pos('@', EMail); // position de '@' dont on va se servir souvent
if PosAt < 4 then Exit; // il faut au moins 3 char avant '@'
if Length(EMail) - PosAt < 2 then Exit; // il faut au moins 2 char après '@'
if not FormatDateIsOK(BirthDate, DigitsOnly) then Exit;
Part1 := Copy(EMail, Pos('@', EMail) - 3, 3);
Delete(Part1, 2, 1);
Part2 := Copy(EMail, PosAt + 1, 2);
UserName := Copy(EMail, 1, PosAt - 1);
Part3 := IntToStr(Length(UserName));
DigitsSum := 0; // Initialisation
{ on va parcourir chaque caractère de la chaîne contenant les chiffres }
for i := 1 to 8 do
DigitsSum := DigitsSum + StrToInt(DigitsOnly[i]);
Part4 := IntToStr(DigitsSum);
Result := Concat(Part1, '-', Part2, '-', Part3, '-', Part4);
end;
A utiliser comme ceci :
var
EMail: string;
BirthDate: string;
PassWord: string;
begin
PassWord := GetPassWord(EMail, BirthDate);
end;
Et en prime la fonction qui vérifie la date mais qui complique à mon avis trop le code et qui plantera en design time s'il y a une erreur, donc à négliger pour l'instant :
function DateIsValid(sDate: string): Boolean;
begin
Result := True;
try
StrToDate(sDate);
except
Result := False;
end;
end;
Bon courage.
korgis
7 nov. 2017 à 07:57
Texte := Texte[1] + copy(Texte,3,99);
7 nov. 2017 à 08:13
7 nov. 2017 à 21:30
tu peux faire aussi:
var
test: string;
begin
test := Edit1.Text;
test := Copy(Edit1.Text, 1, Length(Edit1.Text) -2);
end;
ce qui est mieux que ma première solution
9 nov. 2017 à 08:29
9 nov. 2017 à 10:27
Toutes autres considérations mises à part...
La manière la plus simple de supprimer le 2ème caractère d'une chaîne est :
C'est net et définitif.