Прошу помощи, пожалуйста!
Пишу программу почтового клиента. При нажатии на кнопку "Получить" проходит ошибка List index out of bounds (77).
И каждый раз, при нажатии на кнопку "Получить", число в скобках меняется, разное. Почтовый сервер - yandex.ru
Привожу код программы:
Код:
procedure TForm_Pochta.ToolButton2Click(Sender: TObject);
var
i, t: Integer;
s: Variant;
id, aname: String;
begin
id := '';
attdir := '';
path := '';
aname := '';
workdir := ExtractFilePath(Application.ExeName); // получения адреса папки, в которой находиться наша программа
Pocht_yashik := Form_Pochta.Panel6.Caption;
Pocht_yashik := workdir+'\Mail\'+Pocht_yashik;
if not DirectoryExists(Pocht_yashik) then
CreateDir(Pocht_yashik);
path := Pocht_yashik+'\Vxod_Pochta';
if not DirectoryExists(path) then
CreateDir(path);
attdir := path+'\Vxod_Pochta_files';
TDirectory.Delete(attdir, True); //Удаляю папку с файлами, для экономии места на диске
if not DirectoryExists(attdir) then
CreateDir(attdir);//Создать папку для вложений, path: Mail/Pocht_yashik/Vxod_Pochta/Vxod_Pochta_files
attdir := path+'\Vxod_Pochta_files';
//Очистка WebBrowser1
WebBrowser1.Navigate2('about:blank');
t := GetTickCount();
repeat
Application.ProcessMessages;
until
GetTickCount() >= t;
//Конец очистки WebBrowser1
if DataModule0.FDQuery_PochtaParametr.FieldByName('Tip_Servera').AsString = 'POP3' then
begin
with DataModule2.IdPOP3, DataModule2 do
if (DataModule0.FDQuery_PochtaParametr.FieldByName('SSL_bit').AsBoolean = False) then
begin
Host := DataModule0.FDQuery_PochtaParametr.FieldByName('AdresPOPservera').AsString; //Адрес почтового сервера
Port := DataModule0.FDQuery_PochtaParametr.FieldByName('PortPOP').AsInteger; //Порт POP3 по которому будет осуществляться подключение
Username := DataModule0.FDQuery_PochtaParametr.FieldByName('E_mail').AsString; //Логин пользователя
Password := DataModule0.FDQuery_NashiSotrudniki.FieldByName('Parol_Email').AsString; //пароль пользователя
IOHandler := nil; //если не используем SSL - устанавливаем все по умолчанию
UseTLS := utNoTLSSupport;
Connect; //подключение по протоколу POP3, по настройкам в компоненте IdPOP3, с именем POP3
end
else
if (DataModule0.FDQuery_PochtaParametr.FieldByName('SSL_bit').AsBoolean = True) then
begin
Host := DataModule0.FDQuery_PochtaParametr.FieldByName('AdresPOPservera').AsString; //Адрес почтового сервера
Port := DataModule0.FDQuery_PochtaParametr.FieldByName('PortPOP').AsInteger; //Порт POP3 по которому будет осуществляться подключение
Username := DataModule0.FDQuery_PochtaParametr.FieldByName('E_mail').AsString; //Логин пользователя
Password := DataModule0.FDQuery_NashiSotrudniki.FieldByName('Parol_Email').AsString; //пароль пользователя
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmClient;
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
UseTLS := utUseImplicitTLS;
Connect; //подключение по протоколу POP3
end;
//-------Проверка почты-------
MsgCount := DataModule2.IdPOP3.CheckMessages(); //Узнаем количество писем
//-------Получаем письма с почтового ящика сервера-------
if MsgCount > 0 then
begin
for i := 1 to MsgCount do
begin
ButtonGroup1.Items[0].Caption := 'Входящие';
ButtonGroup1.Items[0].Caption := ButtonGroup1.Items[0].Caption + ' ('+IntToStr(MsgCount)+')';
DataModule2.IdMessage1.Clear; // очистка буфера для сообщения
DataModule2.IdPOP3.Retrieve(i,DataModule2.IdMessage1); // получение одного сообщения
//s := DataModule2.IdPOP3.RetrieveMsgSize(i); //Узнаю размер письма
id := DataModule2.IdMessage1.MsgId;
id := THashMD5.GetHashString(id);
id := DataModule2.IdMessage1.From.Address+'-'+id;
{Сохранение письма в папке в которой находиться наша программа}
DataModule2.IdMessage1.SaveToFile(path+'\'+id+'.eml');//сохранить сообщение для пути Mail/folder_by_date/messdir/id.eml
if DataModule2.IdMessage1.Subject = '' then
DataModule2.IdMessage1.Subject := 'Без темы';
with Form_Pochta.ListView1 do
begin
Item := Form_Pochta.ListView1.Items.Add;
Item.Caption := '';
Item.SubItems.Add('');
Item.SubItemImages[0] := 0;
Item.SubItems.Add(DataModule2.IdMessage1.From.Address+' '+#13+DataModule2.IdMessage1.Subject);
Item.SubItems.Add(FormatDateTime('dd.mm.yyy', DataModule2.IdMessage1.Date)+' '+#13+FormatDateTime('hh:mm', DataModule2.IdMessage1.Date));
Item.SubItems.Add(Form_Pochta.ListBox_Vxoduashue.Items[i]);
end;
ListView1.CustomSort(nil, 3); // Сортировка ListView1 по дате, для четвертой колонки - 3
end;
end
else
if MsgCount = 0 then
begin
ButtonGroup1.Items[1].Caption := 'Входящие';
ShowMessage('У Вас нет новых писем!');
end;
DataModule2.IdPOP3.Disconnect; // разрыв связи
//-------Конец проверка почты-------
end;
end;
Эта проблема возникает при обработки заполнения списка ListView. Если убрать обработку ListView, проблема пропадает. Такое ощущение, что не хватает времени на обработку. Хотя...? Когда на почтовом сервере не было писем, ошибки нет. А после поступления письма, очередного нажатия проверки, ошибка появляется уже на первом письме.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор