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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2011, 13:30   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию EListError при удалении 0-ого элемента ListView

Доброго времени суток!
Обнаружил странный баг у себя:
В ListView добовляется 1 элемент, и одновременно он добовляется в TObjectList

и происходят удивительно странные вещи:
Код:
{
ErrWindCaptList - TListView
ErrList - TObjectList
}
var
  i: Integer;
begin
     for i := ErrWindCaptList.Items.Count - 1 downto 0 do
           if ErrWindCaptList.Items[i].Selected then
              begin
                ErrList.DeleteWindow(i);
                ErrWindCaptList.Items.Delete(i);
              end;
            ErrList.Save;
          end;
      end;
Код отмечекный синим, выпадает в EListError: Index of bounds(0) но в списке ListView и в TObjectList всего по 1 элементу, и их индексы равны 0...

Код:
property ErrWindows[Indx: integer]: TErrorWindow read GetWindow;

procedure TErrorWindowList.DeleteWindow(Indx: Integer);
begin
  ErrWindows[indx].Free;
  Delete(Indx);
end;

function TErrorWindowList.GetWindow(Indx: integer): TErrorWindow;
begin
  try
    Result := (Items[Indx] as TErrorWindow);
  except
    on E: Exception do
      AddMessageEventToLOG('TErrorWindowList.GetWindow[' + IntTOStr(Indx) + '] E class: ' + E.ClassName + ' E text: ' + E.Message);
  end;
end;

Последний раз редактировалось Человек_Борща; 23.10.2011 в 16:10.
Человек_Борща вне форума Ответить с цитированием
Старый 23.10.2011, 16:12   #2
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

У Вас один объект в двух списках: так определитесь - где вы его уничтожаете как объект? И что будет, если в одном его уничтожили, а затем попытаетесь сделать тоже самое во втором списке?
ReportCube вне форума Ответить с цитированием
Старый 23.10.2011, 16:48   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Нет, TListView - визуальное отображение обьектов, которые в TObjectList. Списки не связаны. Единственное, что является "мостиком" между списками, это индекс элемента.

Вариант, что обьект в ObjectList не создан, тоже исключён.
т.к. обьект создаётся и добовляется в ObjectList первым, и только потом он добовляется в ListView.

Ошибка происходит, именно, при удалении обькта из ListView.

Стоп..

Непонимаю..
Почему в коде:
Код:
procedure TErrorWindowList.DeleteWindow(Indx: Integer);
begin
  ErrWindows[indx].Free;
  Delete(Indx);
end;
Delete(Indx); выпадает в Access Violation ?
После Free Ссылка на обьект вроде не обнуляется сама, или обнуляется?



[ОБНОВЛЕНО]
Ошибку нашёл, проблема была в TobjectList.
Цитата:
freeing an object when its index is reassigned; when it is removed from the list with the Delete, Remove, or Clear method; or when the TObjectList instance is itself destroyed.
Я сам вызвал FREE, а затем его пытается вызвать список.

Последний раз редактировалось Человек_Борща; 23.10.2011 в 17:34.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при удалении из БД!!! Delphi 7. NuR1k БД в Delphi 2 21.08.2010 19:19
Ошибка при воспроизведении элемента ListView .Phoenix Мультимедиа в Delphi 3 22.03.2010 20:36
Удалить 7-ого Осла и вместо него поставить 6-ого Altera Софт 2 25.10.2009 08:44
ошибка при удалении символа Virus191288 Общие вопросы Delphi 13 15.08.2009 14:50
Ошибка при удалении... JRcoker Общие вопросы Delphi 8 29.07.2008 22:53