Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > list index out of bounds (-1) при удалении


Автор: Volkogriz 25.1.2013, 00:25
Доброе время суток!
При удалении строки из 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!

Автор: Данкинг 25.1.2013, 01:05
Там после else случайно всё это не нужно в begin...end оформить?

Автор: Volkogriz 25.1.2013, 01:09
Не чего не помогает!(

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

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

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

Автор: Volkogriz 25.1.2013, 15:58
я просто обозначил StringList а на самом деле она глобальная:)

Добавлено через 2 минуты и 6 секунд
LoadPlayList создаётся при FormCreate !

Автор: gesper 25.1.2013, 16:28
Код

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... все проще будет. Когд по сути своей криво составлен.

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

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

LoadPlayList.Delete(ListBox.ItemIndex);

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

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

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

try except

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

Добавлено через 3 минуты и 58 секунд
Спасибо gesper, избавился от ошибки!)

Автор: ZBugz 26.1.2013, 20:51
Тогда проще 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 вопрос.

Автор: dizJis 29.1.2013, 08:55
Цитата(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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)