Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2017, 15:47   #1
kabak12
Новичок
Джуниор
 
Регистрация: 17.01.2016
Сообщений: 1
По умолчанию 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 в 10:17.
kabak12 вне форума Ответить с цитированием
Старый 10.12.2017, 17:46   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

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

как правило счет в массивах, списках начинается с НУЛЯ (0).
Код:
MsgCount := DataModule2.IdPOP3.CheckMessages(); //Узнаем количество писем
for i := 1 to MsgCount
for i := 0 to MsgCount-1
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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