Организация цикла (Delphi 2007)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Karacь, 17 Dec 2008.

  1. Karacь

    Karacь New Member

    Joined:
    14 Nov 2007
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Здарово всем кто читает эту тему.
    Проблемка такая я пишу на delphi прогу которая раз в n минут посылает письмо с информацией мне на mail. Так как у многих стоит динамический ip. Всё уже сделал код написал но не могу заставить работать таймер... Кто знает помогите...Внизу перевожу лог того что есть...

    Code:
     implementation
    
    {$R *.dfm}
    function GetLocalIP: String;
    const WSVer = $101;
    var
    wsaData: TWSAData;
    P: PHostEnt;
    Buf: array [0..127] of Char;
    begin
    Result := '';
    if WSAStartup(WSVer, wsaData) = 0 then begin
    if GetHostName(@Buf, 128) = 0 then begin
    P := GetHostByName(@Buf);
    if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
    end;
    WSACleanup;
    end;
    end;
    
    
    
    procedure TForm3.Timer1Timer(Sender: TObject);
    var
     msg:TIdMessage;
     a:string;
    begin
    IdSMTP1.AuthType := atDefault;
    IdSMTP1.Username:='!!!!!!!!!!!!!';
    IdSMTP1.Password:='!!!!!!!!!!!!!!111';
    IdSMTP1.Host:='smtp.mail.ru';
    IdSMTP1.Connect();
    begin
    a:=formatdatetime('hh:mm',now);
    msg:=TIdMessage.Create(self);
    Msg.Subject:='ip';
    Msg.Recipients.EMailAddresses:='!!!!!!!!!!!';
    Msg.From.Address:='!!!!!!!!!!!!!!;
    Msg.Body.Add(a+' время =))э') ;
    Msg.Date:=StrToDate('11.11.2008');
    if IdSMTP1.Connected=True then  IdSMTP1.Send(Msg);
    end;
    IdSMTP1.Disconnect;
    end;
    
    end.  
    ps interval таймера 30000 типа 30 секунд..но надо сделать хотя бы 30 минут..у человека нет часто рвётся))
     
  2. NeXArmAor

    NeXArmAor Banned

    Joined:
    21 Apr 2007
    Messages:
    226
    Likes Received:
    161
    Reputations:
    6
    А не проще сделать так?

     
    1 person likes this.
  3. Karacь

    Karacь New Member

    Joined:
    14 Nov 2007
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Можеш прокоментировать данный тобой исходник?
    чё то я не втыкаю что тут ты юзаеш так как и что это?
    label send;
     
  4. NeXArmAor

    NeXArmAor Banned

    Joined:
    21 Apr 2007
    Messages:
    226
    Likes Received:
    161
    Reputations:
    6
    Я просто переделал исходный код отсылки E-Mail. Не так сложно сообразить куда надо вставить этот код.
    процедуру с таймером вообще убери. на обработчик кнопки поставь этот код
     
  5. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    если там есть окно оно будет зависать на время Sleep
    а вообще при инициализации таймера вставь
    timer1.Interval:=30000*60;
     
  6. NeXArmAor

    NeXArmAor Banned

    Joined:
    21 Apr 2007
    Messages:
    226
    Likes Received:
    161
    Reputations:
    6
    Если окно будет зависать поставь в исходный код эту строку

     
  7. Karacь

    Karacь New Member

    Joined:
    14 Nov 2007
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Всё хорошо но в это коде когда запускаю вылазиет ошибка.

    ps код
    Code:
    procedure TForm3.FormCreate(Sender: TObject);
    label send;
    var
     msg:TIdMessage;
     a:string;
    begin
    IdSMTP1.AuthType := atDefault;
    IdSMTP1.Username:='5465446';
    IdSMTP1.Password:='6565566565';
    IdSMTP1.Host:='smtp.mail.ru';
    IdSMTP1.Connect();
    begin
    a:=formatdatetime('hh:mm',now);
    msg:=TIdMessage.Create(self);
    Msg.Subject:='ip';
    Msg.Recipients.EMailAddresses:='55665656';
    Msg.From.Address:='556454';
    Msg.Body.Add(a+'время '+GetLocalip+' айпишник') ;
    if IdSMTP1.Connected=True then IdSMTP1.Send(Msg);
    end;
    IdSMTP1.Disconnect;
    end;
    [COLOR=DarkRed]Sleep[/COLOR](30000)
    goto send;
    end;
    end;
    Где красным там ошибка. На слове sleep он не хочет работать пишет
    Code:
    [DCC Error] Unit3.pas(72): E2029 Declaration expected but identifier 'Sleep' found
     
  8. NeXArmAor

    NeXArmAor Banned

    Joined:
    21 Apr 2007
    Messages:
    226
    Likes Received:
    161
    Reputations:
    6
    проверь так
     
  9. Karacь

    Karacь New Member

    Joined:
    14 Nov 2007
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Всеравно такая же ошибка..не понимает он что такое sleep
     
  10. NeXArmAor

    NeXArmAor Banned

    Joined:
    21 Apr 2007
    Messages:
    226
    Likes Received:
    161
    Reputations:
    6
    Пздц. Ты хоть библиотеку Windows подключил?
     
  11. crystalbit

    crystalbit Elder - Старейшина

    Joined:
    6 Jun 2008
    Messages:
    212
    Likes Received:
    88
    Reputations:
    8
    application.processmessages против sleep не поможет)
    если уж со sleep то в отдельном потоке делать

    а если по таймеру, то лучше так:
    Code:
    with TIdSMTP.Create do begin
    AuthType := atDefault;
    Username:='5465446';
    Password:='6565566565';
    Host:='smtp.mail.ru';
    Connect();
    a:=formatdatetime('hh:mm',now);
    msg:=TIdMessage.Create(self);
    Msg.Subject:='ip';
    Msg.Recipients.EMailAddresses:='55665656';
    Msg.From.Address:='556454';
    Msg.Body.Add(a+'время '+GetLocalip+' айпишник') ;
    if Connected=True then Send(Msg);
    Disconnect;
    Free;
    end;//with
    
    так как если idsmtp еще не завершил работу, а пошел новый заход таймера, была бы ошибка или не то, что ожидаешь, а тут старый удаляется, а новый создается

    NeXArmAor, sleep в SysUtils
     
    #11 crystalbit, 17 Dec 2008
    Last edited: 17 Dec 2008
  12. Karacь

    Karacь New Member

    Joined:
    14 Nov 2007
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Вот что подключено в моём проекте...

    Code:
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,    WinSock , Registry, StdCtrls, IdBaseComponent, IdComponent,
      IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
      IdSMTPBase, IdSMTP, IdPOP3, IdMessage, IdCustomTCPServer, IdTCPServer,
      IdCmdTCPServer, IdSMTPServer, ExtCtrls;
     
  13. crystalbit

    crystalbit Elder - Старейшина

    Joined:
    6 Jun 2008
    Messages:
    212
    Likes Received:
    88
    Reputations:
    8
    пиши SysUtils.Sleep
    ошибку в студию
     
  14. NeXArmAor

    NeXArmAor Banned

    Joined:
    21 Apr 2007
    Messages:
    226
    Likes Received:
    161
    Reputations:
    6
    тогда почему у него Sleep не пашет?
    ошибку он показал. юзай первую ветку

    это не связанно с самой функцией Sleep, а вот с этим

    зачем два begin
     
    #14 NeXArmAor, 17 Dec 2008
    Last edited: 17 Dec 2008
  15. Karacь

    Karacь New Member

    Joined:
    14 Nov 2007
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Без того beginа если его удалит будет вылазить ошибка в

    end;
    IdSMTP1.Disconnect; в этом месте.

    Если даже убрать его то ошибка остаётся

    Так ошибка не в слипе а в синтаксесе но где..там с ендами замудрил что то)
     
    #15 Karacь, 17 Dec 2008
    Last edited: 17 Dec 2008
  16. Karacь

    Karacь New Member

    Joined:
    14 Nov 2007
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Вот разобрался с endami всё запустилось =)
    Code:
    procedure TForm3.FormCreate(Sender: TObject);
    label send;
    var
    msg:TIdMessage;
    a:string;
    begin
    IdSMTP1.AuthType := atDefault;
    IdSMTP1.Username:='5465446';
    IdSMTP1.Password:='6565566565';
    IdSMTP1.Host:='smtp.mail.ru';
    IdSMTP1.Connect();
    //этот begin не нужен убери его
    send: //ты метку убрал зачем
    a:=formatdatetime('hh:mm',now);
    msg:=TIdMessage.Create(self);
    Msg.Subject:='ip';
    Msg.Recipients.EMailAddresses:='55665656';
    Msg.From.Address:='556454';
    Msg.Body.Add(a+'время '+GetLocalip+' айпишник') ;
    if IdSMTP1.Connected=True then IdSMTP1.Send(Msg);
    IdSMTP1.Disconnect;
    Sleep(30000) ;
    goto send;
    end;
    end.
    ps Маленький вопрос сколько и в чём измеряется время в delphi просто в таймере как я понел 1 сек = 1000 .
    А в слипе так же?
     
  17. NeXArmAor

    NeXArmAor Banned

    Joined:
    21 Apr 2007
    Messages:
    226
    Likes Received:
    161
    Reputations:
    6
    Да
     
  18. Karacь

    Karacь New Member

    Joined:
    14 Nov 2007
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Мда =) после не многочисленных проверок)) Повторно отправить мейл он отказывается... первый раз всё отправляется при запуске но формы не видно...и потом так и висит де то...
     
  19. crystalbit

    crystalbit Elder - Старейшина

    Joined:
    6 Jun 2008
    Messages:
    212
    Likes Received:
    88
    Reputations:
    8
    делай как я сказал и он отправит повторно и при ошибке отправки
     
  20. Karacь

    Karacь New Member

    Joined:
    14 Nov 2007
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Твоя форма для таймера?