Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail



Ответ
 
Опции темы
Старый 10.12.2017, 16:47   #1
kabak12
Новичок
 
Регистрация: 17.01.2016
Сообщений: 1
Репутация: 10
По умолчанию List index out of bounds (77) - при получении почты - Delphi

Прошу помощи, пожалуйста!
Пишу программу почтового клиента. При нажатии на кнопку "Получить" проходит ошибка 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)
Модератор

Последний раз редактировалось Serge_Bliznykov; 11.12.2017 в 11:17.
kabak12 вне форума   Ответить с цитированием
Старый 10.12.2017, 18:46   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,503
Репутация: 2041
По умолчанию

Цитата:
Такое ощущение, что не хватает времени на обработку. Хотя...
Это не время, а неправильное обращение к элементу списка.
использование НЕСУЩЕСТВУЮЩЕГО элемента.

как правило счет в массивах, списках начинается с НУЛЯ (0).
Код:

MsgCount := DataModule2.IdPOP3.CheckMessages(); //Узнаем количество писем
for i := 1 to MsgCount
for i := 0 to MsgCount-1

__________________
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
list index out of bounds (-1) при удалении Volkogriz Общие вопросы Delphi 4 25.01.2013 10:33
list index out of bounds 0 при обращении к процедуре Egor2 Общие вопросы Delphi 5 04.05.2012 23:37
Delphi Ошибка list index out of bounds(2) Sergeevna Помощь студентам 9 02.04.2012 13:16
При поиске возникает ошибка List index out of bounds (-1) Алекссс БД в Delphi 10 22.07.2011 16:40
При запуске ComboBoxEx пишет List index out of bounds -1. dx+ Общие вопросы Delphi 6 12.06.2008 22:32




00:55.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru