begin process at 2010 07 30 10:07:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Date & Heure

 > TIMESERVER V1.0.3

TIMESERVER V1.0.3


 Information sur la source

Note :
Aucune note
Catégorie :Date & Heure Classé sous :horloge atomique, heure, date Niveau :Débutant Date de création :08/03/2010 Date de mise à jour :11/03/2010 16:03:11 Vu / téléchargé :1 367 / 173

Auteur : Christophe67

Ecrire un message privé
Site perso
Commentaire sur cette source (21)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Un programme ridiculement simple par rapport au service qu'il rend !
Se connecte à des serveurs de temps de type strate2 ( liste sur http://www.cru.fr/services/ntp/serveurs_francais ) et vous retourne la date et l'heure d'une horloge atomique.
Vous permet également de synchroniser votre PC avec l'heure atomique.
Projet basé sur le super article suivant : ftp://ftp-developpez.com/svaillant/delphi_datetime /svaillant-datetime.pdf

Source

  • Version : 1.0.3
  • Date : 08 Mars 2010
  • Micro Projet 03 - On utilise un composant Indy (TidSNTP) pour se connecter à un
  • serveur de temps de type strate 2 pour récupérer la date et l'heure provenant
  • d'une horloge atomique. Le composant bug dans les versions 6 et moins de Delphi,
  • pour y remédier il faut avoir au moins la version 9.0 des composants Indy. Il
  • faut avoir les droits d'administrateur pour changer l'heure et la date du PC.
  • ===============================================================================}
  • unit f_main;
  • interface
  • uses
  • Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  • Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,
  • IdSNTP, ExtCtrls;
  • type
  • TTimeServ = class(TForm)
  • SNTP: TIdSNTP;
  • ListeServeur: TListBox;
  • ServeurNameBox: TGroupBox;
  • LabServeur: TLabel;
  • LocalBox: TGroupBox;
  • LabDateLocale: TLabel;
  • LabHeureLocale: TLabel;
  • ServeurBox: TGroupBox;
  • LabDateServeur: TLabel;
  • LabHeureServeur: TLabel;
  • BtnSysTime: TButton;
  • Timer: TTimer;
  • procedure FormCreate(Sender: TObject);
  • procedure ListeServeurClick(Sender: TObject);
  • procedure TimerTimer(Sender: TObject);
  • procedure BtnSysTimeClick(Sender: TObject);
  • private
  • { Déclarations privées }
  • public
  • { Déclarations publiques }
  • end;
  • var
  • TimeServ: TTimeServ;
  • implementation
  • {$R *.dfm}
  • {$R 'Resources\UAC_Manifest.RES'} // Pour avoir les droits d'administrateur
  • procedure TTimeServ.ListeServeurClick(Sender: TObject);
  • begin
  • // On affiche le nom du serveur sélectionné
  • LabServeur.Caption := ListeServeur.Items[ListeServeur.ItemIndex];
  • // On déclare le nom du serveur au composant TidSNTP
  • SNTP.Host := ListeServeur.Items[ListeServeur.ItemIndex];
  • end;
  • // Interval = 100 donc on va exécuter cette routine 10 fois par seconde
  • procedure TTimeServ.TimerTimer(Sender: TObject);
  • var Date1 : TDateTime;
  • begin
  • // L'instant présent
  • Date1 := Now;
  • // On affiche la date locale
  • LabDateLocale.Caption := DateToStr(Date1);
  • // On affiche l'heure locale
  • LabHeureLocale.Caption := TimeToStr(Date1);
  • // On affiche la date du serveur de temps
  • LabDateServeur.Caption := DateToStr(SNTP.DateTime);
  • // On affiche l'heure du serveur de temps
  • LabHeureServeur.Caption := TimeToStr(SNTP.DateTime);
  • end;
  • procedure TTimeServ.BtnSysTimeClick(Sender: TObject);
  • var SysTime : TSystemTime;
  • begin
  • // On utilise une fonction interne du composant pour changer l'heure locale
  • SNTP.SyncTime;
  • end;
  • procedure TTimeServ.FormCreate(Sender: TObject);
  • begin
  • // Teste si "servers.txt" est présent dans le répertoire courant
  • if not FileExists(GetCurrentDir+'\servers.txt') then
  • begin
  • // Si le fichier n'existe pas dans notre répertoire, on le signale
  • ShowMessage('le fichier "servers.txt" n''est pas dans le répertoire');
  • // Et on met fin à l'application
  • Application.Terminate;
  • end
  • else
  • begin
  • // On charge la liste des serveurs depuis le répertoire courant
  • ListeServeur.Items.LoadFromFile(GetCurrentDir+'\servers.txt');
  • // On sélectionne le premier serveur de la liste
  • ListeServeur.ItemIndex := 0;
  • // On affiche le nom du serveur sélectionné
  • LabServeur.Caption := ListeServeur.Items[ListeServeur.ItemIndex];
  • // On déclare le nom du serveur au composant TidSNTP
  • SNTP.Host := ListeServeur.Items[ListeServeur.ItemIndex];
  • SNTP.Active := True;
  • end;
  • end;
  • end.
Version     : 1.0.3
Date        : 08 Mars 2010

Micro Projet 03 - On utilise un composant Indy (TidSNTP) pour se connecter à un
serveur de temps de type strate 2 pour récupérer la date et l'heure provenant
d'une horloge atomique. Le composant bug dans les versions 6 et moins de Delphi,
pour y remédier il faut avoir au moins la version 9.0 des composants Indy. Il
faut avoir les droits d'administrateur pour changer l'heure et la date du PC.
===============================================================================}
unit f_main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,
  IdSNTP, ExtCtrls;

type
  TTimeServ = class(TForm)
    SNTP: TIdSNTP;
    ListeServeur: TListBox;
    ServeurNameBox: TGroupBox;
    LabServeur: TLabel;
    LocalBox: TGroupBox;
    LabDateLocale: TLabel;
    LabHeureLocale: TLabel;
    ServeurBox: TGroupBox;
    LabDateServeur: TLabel;
    LabHeureServeur: TLabel;
    BtnSysTime: TButton;
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure ListeServeurClick(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure BtnSysTimeClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  TimeServ: TTimeServ;

implementation

{$R *.dfm}
{$R 'Resources\UAC_Manifest.RES'} // Pour avoir les droits d'administrateur

procedure TTimeServ.ListeServeurClick(Sender: TObject);
begin
// On affiche le nom du serveur sélectionné
 LabServeur.Caption := ListeServeur.Items[ListeServeur.ItemIndex];
// On déclare le nom du serveur au composant TidSNTP
 SNTP.Host := ListeServeur.Items[ListeServeur.ItemIndex];
end;

// Interval = 100 donc on  va exécuter cette routine 10 fois par seconde
procedure TTimeServ.TimerTimer(Sender: TObject);
var Date1 : TDateTime;
begin
// L'instant présent
 Date1 := Now;
// On affiche la date locale
 LabDateLocale.Caption := DateToStr(Date1);
// On affiche l'heure locale
 LabHeureLocale.Caption := TimeToStr(Date1);
// On affiche la date du serveur de temps
 LabDateServeur.Caption := DateToStr(SNTP.DateTime);
// On affiche l'heure du serveur de temps
 LabHeureServeur.Caption := TimeToStr(SNTP.DateTime);
end;

procedure TTimeServ.BtnSysTimeClick(Sender: TObject);
var SysTime : TSystemTime;
begin
// On utilise une fonction interne du composant pour changer l'heure locale
 SNTP.SyncTime;
end;

procedure TTimeServ.FormCreate(Sender: TObject);
begin
// Teste si "servers.txt" est présent dans le répertoire courant
if not FileExists(GetCurrentDir+'\servers.txt') then
 begin
// Si le fichier n'existe pas dans notre répertoire, on le signale
   ShowMessage('le fichier "servers.txt" n''est pas dans le répertoire');
// Et on met fin à l'application
   Application.Terminate;
 end
else
 begin
// On charge la liste des serveurs depuis le répertoire courant
  ListeServeur.Items.LoadFromFile(GetCurrentDir+'\servers.txt');
// On sélectionne le premier serveur de la liste
  ListeServeur.ItemIndex := 0;
// On affiche le nom du serveur sélectionné
  LabServeur.Caption := ListeServeur.Items[ListeServeur.ItemIndex];
// On déclare le nom du serveur au composant TidSNTP
  SNTP.Host := ListeServeur.Items[ListeServeur.ItemIndex];
  SNTP.Active := True;
 end;
end;

end.

 Conclusion

Toujours à l'heure juste maintenant :)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

08 mars 2010 22:22:25 :
Ajout du fichier des serveurs
08 mars 2010 22:41:34 :
Correction d'un bug
10 mars 2010 12:04:15 :
Correction du code
11 mars 2010 16:03:11 :
Utilisation d'une fonction interne au TidSNTP pour modifier l'heure.

 Sources du même auteur

Source avec Zip Source avec une capture CHRONOS V1.0.0
Source avec Zip Source avec une capture JOYSTICK V1.0.0
Source avec Zip Source avec une capture PAQUES 1.0.0
Source avec Zip Source avec une capture EUROM V1.0.0
Source avec Zip Source avec une capture PIPOTRON V1.4.2

 Sources de la même categorie

Source avec Zip Source avec une capture PAQUES 1.0.0 par Christophe67
Source avec Zip Source avec une capture DATE_HEURE par Christophe67
Source avec Zip Source avec une capture DECOMPTEUR AVEC ENREGISTREMENT DES OPTIONS par michaelminelli1
Source avec Zip Source avec une capture MODIFIER LES DATES DE CRÉATION, DE MODIFICATION ET DE DERNIE... par ni69
Source avec Zip Source avec une capture UN CHRONOS SIMPLE AVEC UN COMPOSENT LABEL ANIMÉ par jackalunion

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MODIFIER LES DATES DE CRÉATION, DE MODIFICATION ET DE DERNIE... par ni69
Source avec Zip Source avec une capture UN CHRONOS SIMPLE AVEC UN COMPOSENT LABEL ANIMÉ par jackalunion
Source avec Zip COMPOSANT BOUTON TYPE VA-ET-VIENT POUR DATE ET HEURE AVEC FO... par Paounet
Source avec Zip TEXTENDEDDATETIME, COMPOSANT NON-VISUEL DE DATE ET HEURE MUL... par f0xi
MODIFIER L'HORLOGE DU SYSTÈME D'EXPLOITATION par grandvizir

Commentaires et avis

Commentaire de Christophe67 le 08/03/2010 21:31:02

Bon ... y'a un bug , çà fonctionne très bien quand je compile et teste à partir de Delphi mais pas en dehors.
Désolé j'ai posté trop vite je vais corriger çà. En plus j'ai oublié de mettre la liste des serveurs.
Mea culpa, trop pressé.

Commentaire de Christophe67 le 08/03/2010 22:24:06

Trouvé, il faut cocher la propriété "Exécuter ce programme en tant qu'administrateur".
Mais toujours un bug, rajoute +1h à l'heure locale.

Commentaire de Christophe67 le 08/03/2010 22:43:12

C'est bon, c'est corrigé.
En fait j'ai lu dans un article qu'il fallait utiliser "SetSystemTime" alors qu'en fait c'est mieux "SetLocalTime".
Désolé pour le dérangement.

Salutations

Commentaire de Caribensila le 09/03/2010 04:36:55

«On synchronise notre PC avec l'horloge atomique au millionnième de seconde»...

Est-ce vraiment possible ?

Commentaire de Christophe67 le 09/03/2010 10:22:02

En théorie oui, puisque la précision d'une horloge atomique est de l'ordre du millionième de seconde par an en + ou en - .
En pratique non, si l'on tiens compte des pertes de charge lors des transferts entre "horloge atomique -> serveur strate 1 -> serveur strate 2 -> PC -> Programme -> Heure système" on a bien dû perdre quelques centaines de millisecondes. mais disons que c'est le réglage le plus précis.

Salutations.

Commentaire de Delphiprog le 09/03/2010 19:32:21 administrateur CS

Deux remarques ...

1/- Je déconseille vivement d'utiliser ce type de code :
// On affiche son nom et on le valide
ListeServeurClick(nil);

Pourquoi ?
Dans un grand projet, on est souvent amené à transtyper le paramètre sender reçu en argument. Si un développer passe nil comme valeur, c'est la cata et on a droit à une belle violation d'accès !
La solution ?
Dans l'évènement click de l'objet Listserveur, on appelle une méthode (en général déclarée de portée privée). Cette même méthode devient alors accessible dans FormCreate et il suffira de l'appeler.
Dans ce code, qui tient sur une page écran, ce n'est pas critique. Sur des projets de grande envergure, ça peut devenir problématique surtout si on travaille en équipe de développement.

2/- Deuxième remarque :
Eviter l'employer de Application.Terminate, surtout quand on utilise des ensembles de données car, dans ce cas, ils ne seront pas fermés et les éventuels verrous de table ou d'enregistrement pas libérés. Un simple appel à la méthode Close, en revanche, permettra de sortir proprement.

Pour le reste, je finirai en faisant remarque qu'il n'est pas utile de déclarer la variable TimeServ dans la partie interface puisqu'elle devient alors modifiable par une autre unité. Sa place serait plus appropriée dans la partie implementation.

Dis Christophe, tu penses continuer à publier un code par jour ?

Commentaire de Christophe67 le 10/03/2010 12:09:52

Merci Delphiprog,

Code corrigé mais bien que je vois ce que tu veux dire pour le "ListeServeurClick(nil);", j'ai préféré faire un doublon à la place plutôt que diffuser un code incorrect.
Pour le code par jour cela dépend de mon avancée, comme je suis en période de découverte les idées fusent mais c'est surtout car j'avais besoin de ce programme et que les seules versions proposées étaient soient payantes (je suis accroc du freeware), soient avec des fenêtres de pubs.

Salutations.

Commentaire de Christophe67 le 10/03/2010 12:50:45

Par contre j'en profite pour parler d'une erreur que je ne sais pas corriger.
Si on supprime le fichiers "serveurs.txt" et qu'on lance le programme il s'ouvre en chaîne une fenêtre m'indiquant une erreur #10054, c'est très disgracieux et embêtant.
J'ai pensé que c'était dû au composant qui n'a pas de host déclaré dans ses propriétés, j'ai essayé de corriger en placant la valeur "Active" du compo à false lors du FormCreate et la mettre à "true" plus loin mais malgré la boîte de dialogue signalant l'absence du fichier, le programme semble s'exécuter quand même. Comment corriger ou traiter l'erreur ?

Commentaire de Caribensila le 10/03/2010 14:34:32

if not FileExists('serveurs.txt') then begin
  ShowMessage('blabla');
  Exit; end
else begin
...
end;

Commentaire de Christophe67 le 10/03/2010 15:17:19

Merci,

J'y avais pensé mais je pensais qu'on pouvait s'en affranchir avec try ... except puisque la routine était dérivée sur le ShowMessage puis Close;

Commentaire de Caribensila le 11/03/2010 00:56:40

Perso, dans une petite application telle que celle-là je ne mettrais pas de fichier mais je coderais les liens vers les serveurs en dur.
Mais bon! C'est un choix...

Autre chose qui me turlupine, et au risque de paraître lourd...   :)

Comment fait-on pour synchroniser 2 horloges très distantes ?
Je pense au vaiseau qui ira un jour sur Mars avec des humains à bord. Je pense que l'horloge embarquée devra être inpeccablement synchronisée avec les ordinateurs de suivi sur terre.

Y'a-t'il un truc ?

Commentaire de Christophe67 le 11/03/2010 09:42:35

Le choix du fichier c'est pour permettre à l'utilisateur d'ajouter ou modifier la liste, en effet beaucoup de serveurs type strate2 ne sont pas en accès libres. Ceux que j'ai mis le sont mais ca pourrait changer.

Salutations.

Commentaire de Christophe67 le 11/03/2010 14:35:52

Re,

bon j'ai essayé ceci :

Tout d'abord le composant TidSNTP est mis à Active = False

procedure TTimeServ.FormCreate(Sender: TObject);
begin
if not FileExists(GetCurrentDir+'\servers.txt') then
begin
   ShowMessage('le fichier "servers.txt" n''est pas dans le répertoire');
   Close;  <-- j'ai aussi essayé avec Exit
end
else
begin
  ListeServeur.Items.LoadFromFile(GetCurrentDir+'\servers.txt');
  ListeServeur.ItemIndex := 0;
  LabServeur.Caption := ListeServeur.Items[ListeServeur.ItemIndex];
  SNTP.Host := ListeServeur.Items[ListeServeur.ItemIndex];
  SNTP.Active := True;
end;
end;

J'ai toujours mon erreur socket #10054.
J'arrive à passer outre si je force un serveur en inscrivant son nom directement dans les propriétés (Host => ntp.imag.fr )mais ce que je ne comprends pas c'est que le programme affiche le fichier manquant et s'exécute comme si tout allait bien alors qu'après ShowMessage il rencontre Close qui devrait mettre fin à l'application.

Commentaire de Christophe67 le 11/03/2010 16:10:36

v 1.0.3 fonctionne comme je le souhaite.

Plus la peine de perdre des millisecondes à transformer la structure TDateTime en TSystemTime et d'utiliser SetLocalTime, en effet il existe une fonction interne au composant qui fait déjà cela : SNTP.SyncTime;
Contrairement aux conseils donnés je n'ai plus de problèmes en réutilisant Application.Terminate au lieu de Close;

Je passe à autre chose, j'ai perdu trop de temps sur ce micro-projet.

Commentaire de MAURICIO le 12/03/2010 10:32:23

Pour la petite histoire, ton code m' a rappelé un bug de la Playstation3 en Février de cette année:
cette dernière se croyait le 29 Février au lieu du 1er Mars (année pas bisextile du tout!).
Le résultat est qu' elle n' avait pas son horloge "synchronisée" avec celle du Serveur de jeu en réseau (appelé Playstation Network) et donc, pas moyen de lancer une partie réseau.

Voilà, c' est tout :)

A+

PS: c' est bien ce citer ces sources ...

Commentaire de Bacterius le 14/03/2010 02:50:47

"Je passe à autre chose, j'ai perdu trop de temps sur ce micro-projet."
o_O' à la chaîne

De toute façon, tu ne peux pas synchroniser "exactement" le temps, car :
- l'horloge atomique a une très grande précision, mais ton ordinateur n'en a qu'une très faible (à la seconde ou peut-être milliseconde)
- il faut prendre en compte le ping depuis ton ordinateur jusqu'au serveur, et au retour. Bref le temps sera faux de quelques millisecondes (voire secondes si l'internet est lent).

Cordialement, Bacterius !

Commentaire de Caribensila le 14/03/2010 04:29:56

@Mauricio
«Pour la petite histoire, ton code m' a rappelé un bug de la Playstation3 en Février de cette année...»

Ca doit être le tsunami du bug de l'an 2000.   lol

@Bacterius
Après recherches, il semble bien que la solution pour synchroniser deux horloges distantes existera bientôt grâce au CERN et à Einstein.

@@Christophe67
Je peux me tromper, mais il me semble que ton application sera obsolète bien avant les sites que tu utilises.

Commentaire de Bacterius le 14/03/2010 04:36:35

@Cari : ah, intéressant, je vais regarder ça de plus près quand j'aurai un peu de temps libre :)

Cordialement, Bacterius !

Commentaire de chesnetda le 15/03/2010 10:25:47

Bonjour Christophe67,
Je crois que l'explication à ton soucis de Close/Terminate est simplement qu'on ne peux pas demander à une From de se fermer "normalement" alors qu'elle est en train d'être créé. Terminate provoque un arrêt brutal de l'application (une sorte de "Halt") et n'est pas soumis aux contraintes que Close.
Cordialement

Commentaire de Bacterius le 15/03/2010 10:39:08

Salut,
effectivement, si la fenêtre est en cours de création elle ne peut techniquement pas encore être détruite et libérée. Cependant, Terminate ne constitue pas un "Halt" à proprement parler car il ne tue pas le processus directement. Il s'occupe de libérer tout ce qui peut l'être (fenêtres du projet, composants, objets en variable globale), appelle les API windows qu'il faut et ensuite seulement termine le processus. Pour effectuer un Halt (pas de libération de mémoire, on termine net le processus, on peut utiliser la commande Halt ou bien l'API ExitProcess. Mais c'est violent et recommandé que dans les cas extrêmes (par exemple une application en trop mauvais état, qui si elle continue causerait des dommages irréparables sur le disque).

Cordialement, Bacterius !

Commentaire de chesnetda le 15/03/2010 10:57:31

C'est pour cela que j'ai parlé "d'une sorte de "Halt" et pas de "halt" ;-)
Puisqu'on rentre dans les détails, L'aide de Delphi7 indique " Appelez Terminate pour terminer par programme l'exécution d'une application. En appelant Terminate au lieu de libérer l'objet application, vous permettez à l'application de s'arrêter d'une manière plus ordonnée." et la version anglaise précise "Terminate calls the Windows API PostQuitMessage function to perform an orderly shutdown of the application. Terminate is not immediate. Terminate is called automatically on a WM_QUIT message and when the main form closes."
@Christophe67: il me semble avoir déjà lu sur ce site un (ou des ?) débat(s) sur le thème Terminate/Close, si tu veux en savoir plus.
Cordialement

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

date et heure d'un fichier [ par JCLK ] salut à tousJe voudrais savoir comment récupérer la date et l'heure de modification d'un fichier.merci beaucoup Gestion l'heure et date en client et serverur [ par scorpion103 ] Salut!!J?aimerais savoir comment travailler avec NMTime NMDayTime pour connaître l?heure et la date sur mon serveur et pour synchronisé (heure, da prob de conversion de date [ par patof ] je voudrai mettre a jour l heure du pc avec l heure du serveur intranet, mais ce que je récupère est une string de la forme : "Monday, April 14, 2003 datetime et sybase [ par ohmonbateau ] bonjour, j'essaie de transférer une date(format datetime) d'une db sybase ASE vers un champ datetime d'une db Sybase ASA. J'utilise ADO et je travail Plannifier une action de mon application [ par josserand ] Bonjour !!J'ai besoin de votre aide :Je dois envoyer un mail à une date et heure donnée.Donc mon application est lancée, date et heure d'envoie saisie DateToStr [ par mathieu57100 ] bonjour, dans mon appli, j'envoie un email (avec IdMessage et IdSMTP) dans lequel je veux afficher la date et l'heure...IdMessage.Body.Add('Le ' + Dat date et heure [ par guigui265 ] bonjourJe voudrait savoir comment afficher dans un label la date et l'heure en temps r&#233;el.merci Date et heure...; [ par XgaletteX ] &nbsp;Bonjour,&nbsp;&nbsp;Je dois sauvegarder des fichiers, en pr&#233;cisant dans leur nom la date et l'heure de cr&#233;ation, le pb c'est que lorsq Date et heure...; [ par XgaletteX ] &nbsp;Bonjour,&nbsp;&nbsp;Je dois sauvegarder des fichiers, en pr&#233;cisant dans leur nom la date et l'heure de cr&#233;ation, le pb c'est que lorsq DateTimePicker [ par selma-elec ] Bonjour,je voudrais abec un DateTimePicker pouvoir saisir une date ansi que l'heure.J'ai bien mis KIND = DTKTimeet Format = dd/MM/yyyy hh:mm.Pas de pr


Nos sponsors


Sondage...

CalendriCode

Juillet 2010
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales