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 :

Insérer une pause entre chaque action !


Sujet :

Delphi

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut Insérer une pause entre chaque action !
    Bonjour à toutes et à tous,

    J'ai une fonction qui me permet de voir mon ip actuelle :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    function TFServer.GetLocalIp: string;
    var
    HTMLSource:string;
      wsaData: TWSAData;
      addr: TSockAddrIn;
      Phe: PHostEnt;
      szHostName: array[0..128] of Char;
      BeginDelimit,EndDelimit:integer;
    begin
     
      if Radiobutton1.Checked then
      begin
    try
        try
          if WSAStartup($101, WSAData) <> 0 then
            raise Exception.Create('Cannot initialize WSA');
          try
            if GetHostName(szHostName, 128) <> SOCKET_ERROR then
            begin
              Phe := GetHostByName(szHostName);
              if Assigned(Phe) then
              begin
                addr.sin_addr.S_addr := longint(plongint(Phe^.h_addr_list^)^);
                Result := inet_ntoa(addr.sin_addr);
              end;
            end;
          finally
            WSACleanup;
          end;
        except
          on e:Exception do begin
            Result:='Error: '+e.Message;
            raise;
          end else
            raise;
        end;
      finally
        //StaticText1.Caption:='Automatic Ip detection: '+Result;
      end;
      end;
     
      if Radiobutton2.Checked then
      begin
      Try
        HTMLSource:=IdHTTP1.Get('http://checkip.dyndns.org/');   //http://www.adresseip.com    http://checkip.dyndns.org/
        delete(HTMLSource,1,pos(':',HTMLSource)+1);
        delete(HTMLSource,pos('<',HTMLSource),80);
        result:=HTMLSource;
      Except
    //  Result:=false;
      end;
      end;
     
      if Radiobutton3.Checked then
      Try
       result:=IdHTTP1.Get('http://filezilla.sourceforge.net/misc/ip.php');
      Except
    //  Result:=false;
      end;
     
      if Radiobutton4.Checked then
      begin
      Try
        HTMLSource:= IdHTTP1.Get('http://www.showmyip.com/fr/'); //http://www.showmyip.com/fr/On demande le contenu de la page et on le récupère dans HTMLSource
        BeginDelimit:=length(Copy(HTMLSource,1, Pos('INTERNET',HTMLSource)+ 9 ) );//);76 ,77
        EndDelimit:=length(Copy(HTMLSource,Pos('-->',HTMLSource)-1,Length(HTMLSource)));
        Result:=Copy(HTMLSource,BeginDelimit,Length(HTMLSource)-BeginDelimit-EndDelimit+1); //On extrait l'adresse IP de HTMLSource
      Except
    //  Result:=false;
      end;
      end;
      IPServer2.Text:= 'Votre IP actuel est http://' +Result;//'Automatic Ip detection: '
      IPServer.Text:= Result ;//'Automatic Ip detection: '
     
      //if IPServer.Text= Result then Rbsite.checked :=true;
    end;
    Je récupère dans un Tedit, le résultat.

    Dans ma commande, j'appelle cette fonction :

    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.localIPClick(Sender: TObject);
    var
     F: TextFile;
    begin
     
      GetLocalIp;
     
      //Sleep(1000); 
     
    //Action 1
     if RBsite.Checked then begin
     try
     
     //Fichier texte
      AssignFile(F, 'Ip.txt');
      Rewrite(F);
      //WriteLn(F, '<a href="Http:/">'+ipserver.Text+'</a>');
      WriteLn(F, ipserver.Text);
      CloseFile(F);
     
    //Action 2
     
    //Action 3
    Ma question, y a t'il un moyen plus correct que "sleep(1000)" pour être sur que mon fichier soit bien écrit afin de ne pas l'envoyer vide ?

    Merci d'avance.

    @+,

    Cincap

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je dis peut-être une bêtise mais, pourquoi ne par essayer de boucler jusqu'à ce que ton String ai la longueur voulu (celle de ton IP) ?

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 857
    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 857
    Points : 11 291
    Points
    11 291
    Billets dans le blog
    6
    Par défaut
    Peut-être FlushFile, mais Windows peut quand même différer l'écriture...
    Tester l'existence et la longueur du fichier dans une boucle ? Suppose de l'effacer si existait auparavant.
    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 !

  4. #4
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Dans le même ordre d'idée que Tourlourou :
    - mémoriser la taille du fichier après le Assign
    - faire les opération de write et de close
    - puis boucler tant que la taille du fichier n'est pas différente de celle mémorisée au départ
    (en insérant un processMessages dans la boucle afin de pas figer le PC et laisser libre court à windows de faire son écriture des fois qu'il ait décidé opiniatrement de la décaler dans le temps (quel petit coquin)).

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 685
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    Tout est synchrone, je ne vois pas pourquoi il faudrait une pause. Par contre la gestion des erreurs laisse à désirer
    Ensuite qu'un fichier soit effectivement écrit sur le disque ou encore en cache n'a aucune importance. Le tout est transparent au niveau des applications.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 420
    Points : 1 325
    Points
    1 325
    Par défaut
    Merci à tous, j'ai placé le code de création et de sauvegarde de l'Ip directement dans la fonction "GetLocalIp".

    Pour le reste de la gestion des erreurs, l'application est en phase de test, car pour le moment, j'ai des émails trop nombreux avec une fois le fichier vide et une fois le fichier avec l'IP alors que je ne devrai avoir un émail que si l'Ip change (chez Belgacom, toutes les 96H).

    Je continue les tests.

    @+,

    Cincap

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

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

    Si j'ai bien compris, dans le bloc "try", je place le code qui doit être exécuté comme l'ouverture du serveur et dans le "finally" la fermeture du serveur ?

    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
     
    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 l'envoie
     
      Connect_State_Ed.Text:='Site Connecté !';
      FPrincipale.AddHistorique('Site Connecté !');
      FTransfert.BconnecterClick(Sender);
     
      Connect_State_Ed.Text:='IP Envoyée sur le site !';
      FPrincipale.AddHistorique('IP Envoyée sur le site !');
      FTransfert.BenvoyerClick(Sender);
     
      finally
     
      FTransfert.BDeconnecterClick(Sender);
      Connect_State_Ed.Text:='Site Déconnecté !';
      FPrincipale.AddHistorique('Site Déconnecté !');
     
     
      //Fichier émail
      If Mail_Transmition(Exp_Ed.Text,Dest_Ed.Text,SMTP_Ed.Text, IPServer2.Text) then
      Begin
      Connect_State_Ed.Text:='Mail Envoyé !';
      end;
     end;
    end;
     
    end;
    Je pourrai placer une exception si bien connecté et une si pas connecté ?

    @+,

    Cincap

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

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

    J'ai un souci dans le code de mon timer qui contrôle l'envoi des émails, en effet dès qu'il est en enable, il m'envoie les mails suivant la fréquence réglée même si l'ip n'est pas changée.

    En regardant mon code de plus prêt, lastip devrait être comparé à ipactual il me semble :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    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 l'envoie
    Sinon je n'arrive pas à appliquer l'idée de Tourlourou et Peter27x.

    @+,

    Cincap

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

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

    En ce qui concerne la comparaison des deux Tedit, c'est ok car dans un, j'ajoutais "'Votre IP actuel est http://'" et donc pas le même champ, je l'ajoute maintenant dans l'envoi du mail :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    If Mail_Transmition(Exp_Ed.Text,Dest_Ed.Text,SMTP_Ed.Text, 'Votre IP actuel est http://' + IPServer2.Text) then
      Begin
      Connect_State_Ed.Text:='Mail Envoyé !';
    Par contre j'ai deux fiches, la 1ère donne l'ip et commande dans le onshow la 2ième qui est le petit serveur "IdFTP1".

    J'utilise le sender des 3 "Tbuttons" de cette fiche.

    Lorsque la fiche serveur est affichée pour contrôle tout est ok, connection/envoi/déconnection.

    Par contre lorsque la fiche serveur est en hide, seul connection/envoi se fait à moins que le Tmemo ne donne pas l'exactitude.

    J'ai testé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TFTransfert.IdFTP1Disconnected(Sender: TObject);
    begin
      Edit4.Text := '/';
      ListBox1.Clear;
      EnableControls(true);
    Beep;
    end;
    Si quelqu'un à déjà eu le cas, merci.

    @+,

    Cincap

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

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

    Pour le problème de la connexion, apparemment quand la fiche est cachée, le Tmemo n'est pas une indication absolue, la déconnection est bien réalisée.

    En ce qui concerne les 2 Tedit, la comparaison comme je la fait n'est pas au top.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      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
    Je bloque la dessus donc si vous estimez m'apporter une direction, merci.

    @+,

    Cincap

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

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

    Je ferme ce topic car dès la 1ère exécution du module, je recherche l'Ip, je la sauve dans un fichier texte et ensuite pour la comparaison, je teste ce fichier texte avec la nouvelle et si il y a une différence, je l'envoie sur le site et à mon émail.

    @+,

    Cincap

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. mettre une pause entre deux instructions
    Par christianf dans le forum C#
    Réponses: 3
    Dernier message: 21/02/2008, 14h43
  2. Insérer une procédure dans chaque feuille automatiquement
    Par melouille56 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/01/2008, 14h45
  3. Insérer une pause dans une communication série
    Par aiantreize dans le forum MATLAB
    Réponses: 5
    Dernier message: 23/04/2007, 12h25
  4. Créer une pause entre 2 questions
    Par naunau02 dans le forum Assembleur
    Réponses: 1
    Dernier message: 27/09/2006, 21h38
  5. [C#] Insérer une pause
    Par david71 dans le forum C#
    Réponses: 3
    Dernier message: 10/11/2005, 19h20

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