Просмотр полной версии : Организация цикла (Delphi 2007)
Здарово всем кто читает эту тему.
Проблемка такая я пишу на delphi прогу которая раз в n минут посылает письмо с информацией мне на mail. Так как у многих стоит динамический ip. Всё уже сделал код написал но не могу заставить работать таймер... Кто знает помогите...Внизу перевожу лог того что есть...
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 минут..у человека нет часто рвётся))
NeXArmAor
17.12.2008, 16:03
А не проще сделать так?
label send;
begin
send:
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;
Sleep(30000)
goto send;
Можеш прокоментировать данный тобой исходник?
чё то я не втыкаю что тут ты юзаеш так как и что это?
label send;
NeXArmAor
17.12.2008, 16:08
Можеш прокоментировать данный тобой исходник?
чё то я не втыкаю что тут ты юзаеш так как и что это?
label send;
Я просто переделал исходный код отсылки E-Mail. Не так сложно сообразить куда надо вставить этот код.
процедуру с таймером вообще убери. на обработчик кнопки поставь этот код
если там есть окно оно будет зависать на время Sleep
а вообще при инициализации таймера вставь
timer1.Interval:=30000*60;
NeXArmAor
17.12.2008, 16:41
Если окно будет зависать поставь в исходный код эту строку
Application.ProcessMessages;
Всё хорошо но в это коде когда запускаю вылазиет ошибка.
ps код
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;
Sleep(30000)
goto send;
end;
end;
Где красным там ошибка. На слове sleep он не хочет работать пишет
[DCC Error] Unit3.pas(72): E2029 Declaration expected but identifier 'Sleep' found
NeXArmAor
17.12.2008, 20:38
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 //этот 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);
end;
IdSMTP1.Disconnect;
end;
Sleep(30000) ;
goto send;
end;
end;
проверь так
Всеравно такая же ошибка..не понимает он что такое sleep
NeXArmAor
17.12.2008, 20:46
Всеравно такая же ошибка..не понимает он что такое sleep
Пздц. Ты хоть библиотеку Windows подключил?
crystalbit
17.12.2008, 20:46
application.processmessages против sleep не поможет)
если уж со sleep то в отдельном потоке делать
а если по таймеру, то лучше так:
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
Вот что подключено в моём проекте...
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;
crystalbit
17.12.2008, 20:54
пиши SysUtils.Sleep
ошибку в студию
NeXArmAor
17.12.2008, 20:55
NeXArmAor, sleep в SysUtils
тогда почему у него Sleep не пашет?
ошибку он показал. юзай первую ветку
[DCC Error] Unit3.pas(72): E2029 Declaration expected but identifier 'Sleep' found
это не связанно с самой функцией Sleep, а вот с этим
begin
IdSMTP1.AuthType := atDefault;
IdSMTP1.Username:='5465446';
IdSMTP1.Password:='6565566565';
IdSMTP1.Host:='smtp.mail.ru';
IdSMTP1.Connect();
begin
send: //ты метку убрал зачем
a:=formatdatetime('hh:mm',now);
зачем два begin
Без того beginа если его удалит будет вылазить ошибка в
end;
IdSMTP1.Disconnect; в этом месте.
Если даже убрать его то ошибка остаётся
Так ошибка не в слипе а в синтаксесе но где..там с ендами замудрил что то)
Вот разобрался с endami всё запустилось =)
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 .
А в слипе так же?
NeXArmAor
17.12.2008, 21:12
Вот разобрался с endami всё запустилось =)
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 .
А в слипе так же?
Да
Мда =) после не многочисленных проверок)) Повторно отправить мейл он отказывается... первый раз всё отправляется при запуске но формы не видно...и потом так и висит де то...
crystalbit
17.12.2008, 21:37
делай как я сказал и он отправит повторно и при ошибке отправки
crystalbit
17.12.2008, 22:12
да, лучше на таймер поставить
а если хочешь независающий цикл, то
procedure sleep(ms:cardinal);
var
i:cardinal;
begin
i:=GetTickCount;
repeat
Application.ProcessMessages;
until GetTickCount-i>=ms;
end;
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot