IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Comportement TTimer en enabled !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut Comportement TTimer en enabled !
    Bonjour à toutes et à tous,

    Dans le module déjà décrit, j'utilise un TButton pour la connexion qui met un TTimer.enabled := true.

    La procédure de ce TTimer doit vérifier si la nouvelle IP est la même que l'ancienne (IP contenue dans le champ de deux TEdit) et si pas l'envoyer par émail ou sur site au format *.html.

    A ce stade c'est ok pour l'exécution de la différence.

    Seul problème est que après le changement d'IP, le TTimer continue d'envoyer suivant sa fréquence soit toutes les "300000" ms, les informations alors que le contenu des deux TEdit sont revenus identiques.

    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
    procedure TFServer.TConnectTimer(Sender: TObject);
    var
    lastIp,IpActual:string;
    
    F: TextFile;
    result : Integer;
    
    begin
    
      lastIP:=IPServer.Text; //on récupère l'IP en cours
      IpActual:=GetLocalIp;  //on va chercher le nouvel IP
    
      if lastIP<>IPServer.Text then begin
    
       try
      //*******si différent on le réécrit et on l'envoie
    
       WriteTxt;
    
      Connect_State_Ed.Text:='Ip sauvegardée !';
    
      If Mail_Transmition(Exp_Ed.Text,Dest_Ed.Text,SMTP_Ed.Text, 'Votre IP actuel au '+datetostr(date)+ ' est http://' + IPServer.Text)
      then Connect_State_Ed.Text:='Mail Envoyé !';
    
      if RBsite.Checked then begin
      FTransfert.BconnecterClick(Sender);
      Connect_State_Ed.Text:='Site Connecté !';
    
      FTransfert.BenvoyerClick(Sender);
      Connect_State_Ed.Text:='IP Envoyée sur le site !';
    
      end
    
      finally
    
      FTransfert.BDeconnecterClick(Sender);
      Connect_State_Ed.Text:='Site Déconnecté !';
    
    end;
    end;
    if lastIP=IPServer.Text then Tconnect.enabled := false; //Je pensais rajouter ceci !
    end;

    Avez vous une idée ?

    A moins que à la fin de la procédure "Writetext", je testerai d'ici 96H puisque c'est le temps du changement d'IP sur la BBox2.

    @+,

    Cincap

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Je n'ai pas bien compris ton problème, le Timer tourne en rond tant que Enabled est à true !
    Si tu ne veux QU'UN SEUL OnTimer, il faut l'arrêter !

    Est-ce que le Timer doit toujours tourner et parfois envoyé un mail,
    si oui, laisse Enabled à True
    si non, passe effectivement Enabled à False pour arrêter le Test

    Tu devrais mieux indenter ton code, il est pénible à lire !

    Qui change IPServer.Text ?
    Est-ce BconnecterClick qui le fait ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ ShaiLeTroll, bonjour,

    Tu devrais mieux indenter ton code, il est pénible à lire !
    Qu'entend tu par indenter, au niveau code ou indication de ce qu'il fait ?

    Sinon pour répondre à ta question, dès la mise en veille de l'application "Surveillance par Caméras", le TTimer est à enabled = true comme cela il peut checker si l'IP est modifiée et si oui, la procédure Writetext retranscrit le résultat.

    En fin de compte c'est dans cette procedure, que j'ai rajouté la mise à jour du TEdit qui sert à la comparaison ancien/new.

    Qui change IPServer.Text ?
    Est-ce BconnecterClick qui le fait ?
    Non, il permet le TTimer de démarrer !

    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
     
    procedure TFServer.ServeurClick(Sender: TObject);
    begin
      IdHTTPServer1.Active:=true;
      if IdHTTPServer1.Active then
      begin
        connectbut.Enabled:=false;
        HTTP_State_Ed.Text:='Connecté !';
        DisconnectBut.Enabled:=true;
        LocalTest.Enabled:=true;
        LocalIp.Enabled:= false;
        bweb.Enabled:=true;
     
        Connect_State_Ed.Text:='Connection ouverte aves succès !'; //On prévient que tout est réussit
     
        //*******récupération de l'IP et mise en route des services
        timer2timer(sender);
        timer2.Enabled:=true;
     
        bweb.Hint := 'Test en direct sur Internet avec votre IP actuelle qui est : ' + ipserver.Text;
        localtest.Hint := 'Test en local sur Internet avec votre IP actuelle qui est : http://127.0.0.1';
     
      end;
    end;
    C'est dans la procedure du TTimer que la différence se fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    begin
     
      lastIP:=IPServer.Text; //on récupère l'IP en cours
      IpActual:=GetLocalIp;  //on va chercher le nouvel IP
     
     //IpActual est remplace par IPServer2.text pour test
     
     if IPServer2.text<>IPServer.Text then begin
     
       try
     
    ..............
    Je ne sais tester que dans 96H, je vous tiendrai au courant.

    @+,

    Cincap

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par cincap Voir le message
    Qu'entend tu par indenter, au niveau code ou indication de ce qu'il fait ?
    Définition :
    Indenter : l'indentation consiste en l'ajout de tabulations ou d'espaces dans un fichier, pour une meilleure lecture et compréhension du code.
    Commenter : Éclaircissements, observations et remarques sur un code pour en faciliter l’intelligence.

    Si tu n'as pas le vocabulaire informatique minimum, on va avoir des difficultés

    Exemple avec ton code :

    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
    procedure TFServer.TConnectTimer(Sender: TObject);
    var
      lastIp, IpActual: string;
      F: TextFile;
    begin
      lastIP := IPServer.Text; //on récupère l'IP en cours
      IpActual := GetLocalIp();  //on va chercher le nouvel IP
     
      if lastIP <> IPServer.Text then
      begin
        try
          //*******si différent on le réécrit et on l'envoie
          WriteTxt();
     
          Connect_State_Ed.Text := 'Ip sauvegardée !';
     
          If Mail_Transmition(Exp_Ed.Text, Dest_Ed.Text, SMTP_Ed.Text, 
            'Votre IP actuel au ' + datetostr(date) + ' est http://' + IPServer.Text) then
            Connect_State_Ed.Text := 'Mail Envoyé !';
     
          if RBsite.Checked then
          begin
            FTransfert.BconnecterClick(Sender);
            Connect_State_Ed.Text := 'Site Connecté !';
     
            FTransfert.BenvoyerClick(Sender);
            Connect_State_Ed.Text:='IP Envoyée sur le site !';
          end;
     
        finally
          FTransfert.BDeconnecterClick(Sender);
          Connect_State_Ed.Text := 'Site Déconnecté !';
        end;
      end;
     
      if lastIP = IPServer.Text then 
        Tconnect.enabled := false; //Je pensais rajouter ceci !
    end;
    Citation Envoyé par cincap Voir le message
    Sinon pour répondre à ta question...
    Si cela répond à une de mes questions, je ne sais pas à laquelle et tu sembles faire des trucs bien compliqués pour pas grand chose !

    En général, l'utilisation massive de TTimer est le signe d'erreur de conception !
    A part retarder des traitements, je pense à un OnChange au bout d'un délai de frappe clavier par exemple comme le fait le TTreeView

    Après, il faut veiller à en utiliser le moins que possible au profit de classes métier séparés de l'IHM utilisable en thread avec une robutesse absolue du code !

    Pause Déjeuner, je lirais la suite plus tard ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ ShaiLeTroll, merci pour les conseils, mais comment veus tu savoir sans TTimer et dès que ton module est en veille, l'Ip du moment puisqu'il change toutes les 96H, donc à la 1ère exécution, je vérifie l'IP et je le place dans les 2 TEdit, je pars à l'étranger avec cet IP en vue de me connecter et le TTimer vérifie qu'il ne change pas, dès une différence, il me l'envoi par mail ou sur site.

    Et ce n'est que la, qu'il continue à m'envoyer des mails malgré la nouvelle IP.

    Donc, après la réécriture du changement,je dois m'assurer que le contenu des 2 TEdit doit être pareil.

    Si cela répond à une de mes questions, je ne sais pas à laquelle et tu sembles faire des trucs bien compliqués pour pas grand chose !
    Ta question :

    Qui change IPServer.Text ?
    Est-ce BconnecterClick qui le fait ?
    Ma réponse :

    Non, il permet le TTimer de démarrer !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    begin
     
      lastIP:=IPServer.Text; //on récupère l'IP en cours
      IpActual:=GetLocalIp;  //on va chercher le nouvel IP
     
     //IpActual est remplace par IPServer2.text pour test
     
     if IPServer2.text<>IPServer.Text then begin
     
       try
     
    ..............
    Je vais tester après 96H puisque l'Ip a été modifiée ce jour vers 04H.

    @+,

    Cincap

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par cincap Voir le message
    @ ShaiLeTroll, merci pour les conseils, mais comment veus tu savoir sans TTimer et dès que ton module est en veille, l'Ip du moment puisqu'il change toutes les 96H, donc à la 1ère exécution, je vérifie l'IP et je le place dans les 2 TEdit, je pars à l'étranger avec cet IP en vue de me connecter et le TTimer vérifie qu'il ne change pas, dès une différence, il me l'envoi par mail ou sur site.
    Pour savoir si un module ne fait rien si cela que désigne "est en veille", tu as l'event OnIdle

    Pourquoi ne pas avoir utiliser NotifyIpInterfaceChange (NT 6.x) ou NotifyAddrChange (NT 5.x) dans un thread ?
    ton thread lit l'IP via GetIpAddrTable (faq), puis se bloque via WaitForSingleObject, qui attendra le changement d'IP !
    Tout cela en boucle !



    Sinon, tu as une problématique complexe que l'on ne peut pas deviner !
    Personnellement, je n'utilise les IP que si elles sont fixes !
    Si il y a un changement cyclique, je passe par un DnsQuery et au lieu de stocker une IP dans la conf, je stocke une URL.
    Ainsi l'URL reste la même, c'est un équivalent de DynDNS qui se charge du reste

    Citation Envoyé par cincap Voir le message
    Et ce n'est que la, qu'il continue à m'envoyer des mails malgré la nouvelle IP.
    Il te suffit de stocker la nouvelle IP dans IPServer.Text au moment du TTimer
    ensuite, il continue à tourner jusqu'à l'obtention d'une nouvelle IP !
    D'où ma remarque
    Citation Envoyé par ShaiLeTroll Voir le message
    Qui change IPServer.Text ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          If Mail_Transmition(Exp_Ed.Text, Dest_Ed.Text, SMTP_Ed.Text, 
            'Votre IP actuel au ' + datetostr(date) + ' est http://' + IpActual) then
          begin
            IPServer.Text := IpActual; // Ainsi on utilisera une nouvelle référence pour la comparaison
            Connect_State_Ed.Text := 'Mail Envoyé !';
          end;
    D'ailleurs ton mail envoyait IPServer.Text et non IpActual, je l'ai corrigé dans le code ci-dessus, tu risquais d'envoyer la vieille IP et non la nouvelle !

    Utiliser un TEdit pour stocker à long terme ce genre de donnée, ce n'est pas terrible

    Surtout que tu te mélange dans tes variables, suffit de lire le premier code

    Citation Envoyé par cincap Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
      lastIP:=IPServer.Text; //on récupère l'IP en cours
      IpActual:=GetLocalIp;  //on va chercher le nouvel IP
     
      if lastIP<>IPServer.Text then begin
    Comme lastIP reçoit IPServer.Text le <> était toujours faux !


    En plus, tu n'es pas à l’abri que ton programme s'arrête (coupure de courant, plantage ...)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ ShaiLeTroll, je suis de loin l'expert que tu es mon ami, je suis aussi sous D6 donc avec mes faibles connaissances, je me débrouille et aussi avec vos meilleurs conseils donnés sans retenues.

    Je vais revoir la possibilité de modifier tout cela sur ce vieux programme.

    Maintenant comme tu dis si il y a une panne de courant, le portable sera sur batterie et pour le reste tant pis.

    Merci à toi,

    @+,

    Cincap

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ ShaiLeTroll, je n'arrive pas à exploiter cette procedure dans mon TEdit:

    " Procedure GetIPAdresses(Result:TStrings);"


    Je n'ai certainement pas tout compris car des erreurs sur Tstring et Tcaption.

    @+,

    Cincap

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    TCaption c'est juste une String (Ansi ou Unicode)
    TStrings c'est comme une TStringList donc un Tableau de String

    Au fait, tu récupères l'IP local du poste mais tu évoquais "partir à l'étranger" ne te faut-il pas l'IP publique ?
    L'IP publique n'est pas forcément l'IP du Serveur si celui est derrière un routeur ou une Box
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ ShaiLeTroll, je pensais que c'était clair suivant ma demande principale et mes autres topic entre l'Ip public et local, forcément pour questionner le routeur depuis l'étrange, il faut l'ip public et avec une Webcam sur Usb il n'y a pas besoin de renseigner le port aprè l'Ip puisque c'est le routeur qui s'en charge mais pour une autre Caméra Wifi, il faut rajouter à l'adresse soit ":8080" ou un autre port pour que cela fonctionne, dommage que m'on logiciel ne reconnait pas ce genre de caméra alors qu'il reconnait celle placée sur le port Usb à moins que cela soit faisable en Delphi.

    Ceci étant dit, je pensais que la procédure que tu m'as suggérée était pour l'Ip publique.

    @+,

    Cincap

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par cincap Voir le message
    @ ShaiLeTroll, je pensais que c'était clair suivant ma demande principale et mes autres topic entre l'Ip public et local,
    Il y a bcp de sujet sur le forum, on ne peut pas se souvenir de tout !

    Citation Envoyé par cincap Voir le message
    forcément pour questionner le routeur depuis l'étrange, il faut l'ip public
    Depuis l'étranger, oui c'est obligatoire


    Citation Envoyé par cincap Voir le message
    pour une autre Caméra Wifi
    J'utilise des caméras AXIS en IP via leur ActiveX, il suffit de fournir l'URL
    J'ai intégré différentes marques de caméras et DVR, il y a toujours un SDK, par contre, je n'ai pas bossé avec des WebCam car cela ne correspond à pas au métier

    Citation Envoyé par cincap Voir le message
    Ceci étant dit, je pensais que la procédure que tu m'as suggérée était pour l'Ip publique
    Tu as évoqué le premier "GetLocalIp" si c'est celle de la faq LocalIP cela fourni l'IP en LAN pas en WAN !

    j'ai utilisé un code similaire à GetIPAdresses sur des machines avec plusieurs cartes réseaux pour récupérer l'IP dans le LAN de l'entreprise et l'IP dans le mini-LAN d'un robot (isolé pour éviter les soucis)


    Il te faut utiliser le API de ton routeur pour connaitre son IP publique,


    Soit tu bidouilles via un site genre MonIP.Org
    Ou alors tu poursuits avec effectivement ton autre sujet : Adresse Ip Publique derrière un routeur !

    Et dans ce cas, fait une fonction GetPublicIP ou GetIpExterne mais pas GetLocalIp sinon tu nous embrouilles !
    Je ne t'aurais pas proposé NotifyAddrChange qui n'aurait je pense aucun effet sur une IP publiques !

    Et je renouvelle, choisi plutôt DynDNS, c'est justement conçu pour les serveurs à IP changeante !
    Ton programme au lieu d'envoyer un mail informe DynDNS du changement d'IP, ainsi de l'extérieur tu utiliser une URL

    Tu as même des logiciels tout prêt comme ddclient
    Il est même possible que ta BBox2 propose une mise à jour d'un DynDNS !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Merci pour les infos,

    Pour l'ip publique je fais ceci :

    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
     
    //__________ Récupérer l'IP publique
     
     url := 'http://dynupdate.no-ip.com/ip.php';
     IdHTTP1 := TIdHTTP.Create(nil);
     Try 
     Try
     
     IPServer.text := IdHTTP1.Get(url);
     Except 
     IPServer.text := '';
     End ; 
     Finally 
     FreeAndNil(IdHTTP1);
     End;
    @+,

    Cincap

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    J'ai revérifié la procédure de lecture, la procédure d'écriture et c'est ok

    Par contre avec celle du timer qui permet ce checker la nouvelle IP, malgré la même IP dans chaque Tedit, l'émail est chaque fois envoyé !

    Je loupe quelque chose ou mon code n'est pas logique :

    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
     
    procedure TFServer.Timer2Timer(Sender: TObject);
    var
    lastIp,IpActual:string;
     
    F: TextFile;
    result : Integer;
     
    begin
     
     GetLocalIp;  //Affiche l'IP dans IPServer.Text
     
     //Si différent de l'ancien qui est affiché dans IPServer2.Text on écrit puis on envoie
     if IPServer.Text<>IPServer2.Text then writetxt ;
     
     Mip.Lines.LoadFromFile(chappli +'cincapIp.html');
     
     stmp := Copy(FServer.MIp.Lines[9], Pos('>',FServer.MIp.Lines[9]) + 1, Length(FServer.MIp.Lines[9]));
     
     //Met à jour IPServer2.Text avec l'IP actuel
     IPServer2.text := stmp;
     
     try
     
      if RBsite.Checked then begin
     
      Connect_State_Ed.Text:='Site Connecté !';
     
      FTransfert.BconnecterClick(Sender);
     
      Connect_State_Ed.Text:='IP Envoyée sur le site !';
     
      FTransfert.BenvoyerClick(Sender) ;
     
      Connect_State_Ed.Text:='IP Envoyée sur le site !';
     
     if Mail_Transmition(Exp_Ed.Text,Dest_Ed.Text,SMTP_Ed.Text, 'Votre IP actuel au '+datetostr(date)+ ' est http://' + IPServer.text)
     then IPServer.Text := IPServer2.Text ;// Ainsi on utilisera une nouvelle référence pour la comparaison
     
     Connect_State_Ed.Text:='Mail Envoyé !' ;
     
      end;
     end
     
      finally  
     
    end;
    end;
    Y a t'il un moyen d'y remédier ?

    Peut être aussi une synchronisation entre GetLocalIP (Local et public suivant choix !) et

    @+,

    Cincap

  14. #14
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if IPServer.Text<>IPServer2.Text then ...
    IPServer2.text := stmp;
    Quand les contenus semblent similaires, la longueur des 2 chaînes l'est-elle aussi ? N'y a-t-il pas d'espace en plus d'un côté ? On peut les éliminer par Trim() avant de comparer ou d'affecter.

    Si une chaîne est plus longue que l'autre, on peut aussi tenter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Pos(IPServer.Text, IPServer2.Text) >0 then ...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  15. #15
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ tourlourou, merci d'avoir suggéré le principe,

    Quand les contenus semblent similaires, la longueur des 2 chaînes l'est-elle aussi ? N'y a-t-il pas d'espace en plus d'un côté ? On peut les éliminer par Trim() avant de comparer ou d'affecter.
    Les 2 champs des TEdit sont identiques à l'exécution de la fiche, même nombre (ancien/nouveau avant de checker si new Ip) !

    Pour le moment en phase de test, cela à l'air de fonctionner en remettant de l'ordre dans l'exécution des taches du TTimer, car avec les copy/coller on n'oublies des choses.

    Si problèmes, j'essayerai de faire un check IP toutes les 96H puisque c'est le délai en général que Belgacom modifie l'Ip du modem, maintenant je ne sais pas si un TTimer qui est lancé à l'exécution pourrai se relancer après 96H.

    @+,

    Cincap

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par cincap Voir le message
    (...) Je loupe quelque chose ou mon code n'est pas logique :
    Mouais, doit y avoir quelque chose de ce goût-là...

    Citation Envoyé par cincap Voir le message
    (...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      //Si différent de l'ancien qui est affiché dans IPServer2.Text on écrit puis on envoie
      if IPServer.Text<>IPServer2.Text then writetxt ;
      // et si pas différent on ne fait pas "writetxt" mais on fait quand même tout ce qui suit...
    Et si tu mettais la fonction d'envoi dans une procédure séparée, on y verrait (et toi aussi) plus clair.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  17. #17
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Jipété, merci de ta réponse,

    //Si différent de l'ancien qui est affiché dans IPServer2.Text on écrit puis on envoie
    if IPServer.Text<>IPServer2.Text then writetxt ;
    // et si pas différent on ne fait pas "writetxt" mais on fait quand même tout ce qui suit...
    En fait si pas différent, on sort car le reste ne doit pas être réécrit en phase de test, j'avais fait comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if IPServer.Text<>IPServer2.Text then writetxt else exit ;
    Comme il y a déjà une procédure "Read" une "Write", je préférais voir celle du TTimer ainsi que l'inscription des taches dans l'historique, maintenant c'est vrai que je pourrai envisager aussi une procédure.

    Tant que maintenant, j'ai reçu un seul mail avec l'ip lors de l'exécution de la fiche, faudra voir maintenant si l'Ip change.

    @+,

    Cincap

  18. #18
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par cincap Voir le message
    En fait si pas différent, on sort car le reste ne doit pas être réécrit en phase de test, j'avais fait comme ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if IPServer.Text<>IPServer2.Text then writetxt else exit ;
    Comment veux-tu qu'on y arrive si tu ne postes pas le bon code ?

    [EDIT]
    Citation Envoyé par cincap Voir le message
    Si problèmes, j'essayerai de faire un check IP toutes les 96H puisque c'est le délai en général que Belgacom modifie l'Ip du modem,
    Quand j'ai ce genre de test à faire, plutôt que d'attendre 96 h (! ), je me fais un petit bricolo avec un edit où je force une valeur et un bouton qui va simuler le changement sans attendre 96 h...
    Et je vois tout de suite ce qui cloche ou pas.

    Citation Envoyé par cincap Voir le message
    maintenant je ne sais pas si un TTimer qui est lancé à l'exécution pourrai se relancer après 96H.
    Tant qu'il n'est pas arrêté (MonTimer.Enabled := False;), il tourne.
    Et s'il est arrêté, tu peux parfaitement le relancer : MonTimer.Enabled := True;
    Je ne comprends pas la question / le problème, là.
    Ou alors tu t'en inventes (des problèmes...)
    [/EDIT]
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  19. #19
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Jipété, au début de mes tests, j'avais simulé avec un TTimer la modification du champ du TEdit qui reçoit l'IP et comme il y avait d'autres problèmes qui sont venus se greffer, je préférais le faire en situation réelle, ce qui va se faire incessamment.

    Dès le lancement de l'application, le TTimer doit être à "true" car sinon le changement d'Ip soit toutes les 96H et encore dès fois plutôt doit être détecté.

    Maintenant pour un habitué de Delphi ou expert, il l'aura fait pas d'autres moyens.

    Le TTimer aurait aussi pu être remplacé par un plus précis mais dans ce cas il ne doit pas être si précis à la seconde.

    @+,

    cincap

  20. #20
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 425
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 425
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    Voila tout le déroulement concernant l'envoi du new Ip vers la messagerie et le site c'est ok car le fichier *.html créé est juste avec la new Ip.

    Sauf que dès le 1er envoi, à la frequence du TTimer, d'autres envoi se succèdent alors qu'à la fin, certainement en relation avec ceci :

    Le nombre chiffres de la new ip affiché dans FServer.text avait augmenté et donc le résultat dans FServer2.text n'était pas juste puisqu'il affichait un autre caractère du fichier créé avant en "*.html"

    Ce problème est débattu dans un autre topic !

    Edit : j'avais pensé aussi à arrêter le Timer dès que les 2 champs des TEdit seraient égaux mais alors, le check de la nouvelle serait aussi interrompu et plus mis à jour.

    Je persiste dans mes tests.

    @+,

    Cincap

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. open avec comport
    Par Goldocrack dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/04/2009, 08h12
  2. Réponses: 6
    Dernier message: 15/11/2007, 12h31
  3. [Free Pascal] Comportement de Exec
    Par néo333 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 01/11/2003, 17h46
  4. Réponses: 2
    Dernier message: 22/09/2003, 11h23
  5. [VB6] enabled récalcitrant
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 04/12/2002, 10h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo