list index out of bounds (-1) при удалении

 
0
 
Delphi, Kylix & Pascal
ava
Volkogriz | 25.01.2013, 01: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!
Kommentare (13)
ava
Данкинг | 25.01.2013, 01:05 #
Там после else случайно всё это не нужно в begin...end оформить?
ava
Volkogriz | 25.01.2013, 01:09 #
Не чего не помогает!(
ava
Данкинг | 25.01.2013, 01:17 #
Скорее всего, там просто строка не выбрана, поэтому индекс и равен -1. Попробуй явно кликнуть по Item'у листбокса, а затем уже вызвать процедуру удаления.
ava
northener | 25.01.2013, 01:43 #
Цитата (Volkogriz @  25.1.2013,  00:25 findReferencedText)
Что не так?

Судя по приведённому коду LoadPlayList - локальная переменная некоей процедуры. Что вы от неё хотите получить, если вы её никак не инициализировали?
И вообще  не создали.
ava
Volkogriz | 25.01.2013, 15:58 #
я просто обозначил StringList а на самом деле она глобальная:)

später ergänzt:
LoadPlayList создаётся при FormCreate !
ava
gesper | 25.01.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... все проще будет. Когд по сути своей криво составлен.
ava
northener | 25.01.2013, 16:32 #
Цитата (Volkogriz @  25.1.2013,  00:25 findReferencedText)
listbox.Items.Delete(listbox.ItemIndex);

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

LoadPlayList.Delete(ListBox.ItemIndex);

получаешь ту самую ошибку.
ava
ZBugz | 26.01.2013, 08:05 #
Че то не понял кода, ты чего удалит ь в итоге хочешь ? Тока строку или вообще очистить TStrigList ?
ava
Volkogriz | 26.01.2013, 08:41 #
вообще очистить TStrigList.Clear ))
Мне нужно просто строку удалить в ListBox1 при этом строку с этим же индексам в TStrigList но эта не проблема.
проблема в ошибке после удаления: list index out of bounds (-1)
Избавился тупо проверив на ошибку:  

try except

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

später ergänzt:
Спасибо gesper, избавился от ошибки!)
ava
ZBugz | 26.01.2013, 08:05 #
Че то не понял кода, ты чего удалит ь в итоге хочешь ? Тока строку или вообще очистить TStrigList ?
ava
Volkogriz | 26.01.2013, 08:41 #
вообще очистить TStrigList.Clear ))
Мне нужно просто строку удалить в ListBox1 при этом строку с этим же индексам в TStrigList но эта не проблема.
проблема в ошибке после удаления: list index out of bounds (-1)
Избавился тупо проверив на ошибку:  

try except

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

später ergänzt:
Спасибо gesper, избавился от ошибки!)
ava
ZBugz | 26.01.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 вопрос.
ava
dizJis | 29.01.2013, 08:55 #
Цитата (Volkogriz @  25.1.2013,  00:25 findReferencedText)


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 findReferencedText)


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 
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden