Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> list index out of bounds (-1) при удалении 
:(
    Опции темы
Volkogriz
  Дата 25.1.2013, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 16.9.2007

Репутация: нет
Всего: 1



Доброе время суток!
При удалении строки из LISTBOX вылетает ошибка: list index out of bounds (-1)
Что не так?
Код

procedure TForm1.N11Click(Sender: TObject);
Var
LoadPlayList:TStringList;
begin
if ListBox.Items.Text ='' then
N11.Enabled:=false
else
listbox.Items.Delete(listbox.ItemIndex);
LoadPlayList.Delete(ListBox.ItemIndex);
N11.Enabled:=true;
end; 

Заранее благодарен!
С уважением,
Volkogriz!

Это сообщение отредактировал(а) Volkogriz - 25.1.2013, 00:29
--------------------
("`-''-/").___..--''"`-._`6_6  ) ,,,`-.  ( ''' ).` "_-.__.')(_Y_.)'  ._''' )  `._ `. ``-.__'.-'_..`--'_..-_/'''/--'_.' ,'(il).-'''''(li).'  ((!.-'
PM MAIL ICQ   Вверх
Данкинг
Дата 25.1.2013, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Там после else случайно всё это не нужно в begin...end оформить?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Volkogriz
Дата 25.1.2013, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 16.9.2007

Репутация: нет
Всего: 1



Не чего не помогает!(
--------------------
("`-''-/").___..--''"`-._`6_6  ) ,,,`-.  ( ''' ).` "_-.__.')(_Y_.)'  ._''' )  `._ `. ``-.__'.-'_..`--'_..-_/'''/--'_.' ,'(il).-'''''(li).'  ((!.-'
PM MAIL ICQ   Вверх
Данкинг
Дата 25.1.2013, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Скорее всего, там просто строка не выбрана, поэтому индекс и равен -1. Попробуй явно кликнуть по Item'у листбокса, а затем уже вызвать процедуру удаления.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
northener
Дата 25.1.2013, 01:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Volkogriz @  25.1.2013,  00:25 Найти цитируемый пост)
Что не так?

Судя по приведённому коду LoadPlayList - локальная переменная некоей процедуры. Что вы от неё хотите получить, если вы её никак не инициализировали?
И вообще  не создали.


Это сообщение отредактировал(а) northener - 25.1.2013, 01:44


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
Volkogriz
Дата 25.1.2013, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 16.9.2007

Репутация: нет
Всего: 1



я просто обозначил StringList а на самом деле она глобальная:)

Добавлено через 2 минуты и 6 секунд
LoadPlayList создаётся при FormCreate !
--------------------
("`-''-/").___..--''"`-._`6_6  ) ,,,`-.  ( ''' ).` "_-.__.')(_Y_.)'  ._''' )  `._ `. ``-.__'.-'_..`--'_..-_/'''/--'_.' ,'(il).-'''''(li).'  ((!.-'
PM MAIL ICQ   Вверх
gesper
Дата 25.1.2013, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 23.2.2005

Репутация: 1
Всего: 2



Код

Var
LoadPlayList:TStringList;
....

procedure TForm1.N11Click(Sender: TObject);
begin
if (ListBox.Items.Text ='') then
begin
N11.Enabled:=false;
end
else {if (listbox.ItemIndex<>-1) then} // по желанию, лучше чем на пустую строку проверять.
begin
// В таком порядке!!!
if LoadPlayList.strings.count>listbox.ItemIndex then
LoadPlayList.Delete(ListBox.ItemIndex);
// Это последней!!
if listbox.Items.count>listbox.ItemIndex then
listbox.Items.Delete(listbox.ItemIndex);
N11.Enabled:=true;
end; 
end;



и вобще, для N11.Enabled:=true; используй ActionList... все проще будет. Когд по сути своей криво составлен.

Это сообщение отредактировал(а) gesper - 25.1.2013, 16:31
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
northener
Дата 25.1.2013, 16:32 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(Volkogriz @  25.1.2013,  00:25 Найти цитируемый пост)
listbox.Items.Delete(listbox.ItemIndex);

После этого удаления выделение в листбоксе теряется и listbox.ItemIndex становится равным -1. И на следующей строке
Код

LoadPlayList.Delete(ListBox.ItemIndex);

получаешь ту самую ошибку.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
ZBugz
Дата 26.1.2013, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: нет
Всего: 6



Че то не понял кода, ты чего удалит ь в итоге хочешь ? Тока строку или вообще очистить TStrigList ?

Это сообщение отредактировал(а) ZBugz - 26.1.2013, 08:05
PM MAIL   Вверх
Volkogriz
Дата 26.1.2013, 08:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 16.9.2007

Репутация: нет
Всего: 1



вообще очистить TStrigList.Clear ))
Мне нужно просто строку удалить в ListBox1 при этом строку с этим же индексам в TStrigList но эта не проблема.
проблема в ошибке после удаления: list index out of bounds (-1)
Избавился тупо проверив на ошибку:  
Код

try except

 Но пытаюсь сделать по человечески))
С уважением,
Volkogriz!

Добавлено через 3 минуты и 58 секунд
Спасибо gesper, избавился от ошибки!)
--------------------
("`-''-/").___..--''"`-._`6_6  ) ,,,`-.  ( ''' ).` "_-.__.')(_Y_.)'  ._''' )  `._ `. ``-.__'.-'_..`--'_..-_/'''/--'_.' ,'(il).-'''''(li).'  ((!.-'
PM MAIL ICQ   Вверх
ZBugz
Дата 26.1.2013, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 636
Регистрация: 15.2.2006
Где: Москва

Репутация: нет
Всего: 6



Тогда проще smile
FreeAndNil(LoadPlayList) и все smile 
Потом не забудь создать заново smile 
А вообще begin end ставь как надо и у тебя чего делает ListBox.Items.Text ='' он всегда ''


Код

procedure TForm1.N11Click(Sender: TObject);
Var
LoadPlayList:TStringList;
begin
if ListBox.Items.Text ='' then
N11.Enabled:=false
else
begin
listbox.Items.Delete(listbox.ItemIndex);
LoadPlayList.Delete(ListBox.ItemIndex);
end;
N11.Enabled:=true;
end; 

Короче, или давай нормальный код или нормально формулируй1 вопрос.
PM MAIL   Вверх
dizJis
Дата 29.1.2013, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.5.2009

Репутация: нет
Всего: нет



Цитата(Volkogriz @  25.1.2013,  00:25 Найти цитируемый пост)
Код

procedure TForm1.N11Click(Sender: TObject);
Var
LoadPlayList:TStringList;
begin
if ListBox.Items.Text ='' then
N11.Enabled:=false
else
listbox.Items.Delete(listbox.ItemIndex);
LoadPlayList.Delete(ListBox.ItemIndex);
N11.Enabled:=true;
end; 
 бегин энд потерял - логика как минимум нарушена. Далее northener правильно все подметил, но почему то это все проигнорировали, взять хотя бы gesper с его куском непонятного кода
Цитата(gesper @  25.1.2013,  16:28 Найти цитируемый пост)
Код

if listbox.Items.count>listbox.ItemIndex then
вообще бредятина

Код


...
  var LoadPlayList:TStringList;
...

procedure TForm1.N11Click(Sender: TObject);
var
  index: integer;
begin
  if ListBox.Items.Text ='' then
    N11.Enabled := false
  else
  begin
    index := listbox.ItemIndex;
    if index = -1 then exit; //ничего не выбрали для удаления
    listbox.Items.Delete(index);
    LoadPlayList.Delete(index);
    N11.Enabled:=true;
  end;
end; 


Проверку на рассинхронизацию двух списков сделаешь сам smile 

Это сообщение отредактировал(а) dizJis - 29.1.2013, 08:57
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0875 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.