Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как перехватить ошибку?


Bad_B ©   (2007-07-05 23:45:00) 

List Index out of bounds (...).
Необходимо сделать что бы когда она возникает выдавать свой message, (что мол последовательность действий нарушена)

ЗЫ. с этим не работал, поэтому укажите куда хоть копать


Плохиш   (2007-07-06 11:46:00) [1]


>  ShowMessage('Блин! Ну когда же ты поймёшь наконец, что
> НЕЛЬЗЯ удалять Айтемы в цикле for???');

Почему нельзя, можно, только идти надо с другой стороны :-D


Anatoly Podgoretsky   (2007-07-06 07:45:00) [2]

> Германн  (06.07.2007 01:36:05)  [5]

Можно, но делать надо это правильно, а не красиво.


{RASkov}   (2007-07-06 04:41:00) [3]

> [13] Bad_B   (06.07.07 04:22)
> или начать-таки по плотнее изучать программирование

А ты еще раз глянь на свой код в [7] и включи "думалку"...
Правда я тоже не сразу сообразил, из-за твоего "стильного форматирования" и "умных" имен переменных, что там к чему.
Но потом "постепенно начал вникать".... (мне аж самому смешно стало:)). Отсюда и столько постов последовало...:)
А вот над тем, чем задумался, подумай серьезно.


Bad_B   (2007-07-06 04:22:00) [4]

Да че то я перемудрил с кодом:)


> {RASkov} ©   (06.07.07 04:10) [10]

Лихо))) Спс за очередную подсказку (в 10 так сказать))))

ОФФ:
ЗЫ. Вот в очередной раз задумался: или начать-таки по плотнее изучать программирование (в частности Delphi), или забросить все это дело, и не позориться))))....


{RASkov}   (2007-07-06 04:21:00) [5]

> form1.ListBox1.Count.... form1.ListBox1.Items[Nomer_Button] := '0';

Если этот код находиться в методе формы, то писать Form1 не нужно.... просто - ListBox1.Items[Nomer_Button] := '0';

> d.Add(form1.ListBox1.Items. Strings[h]);
....
> d. Strings[h]);

Так же свойство Strings не обязательно указывать, оно в TStrings по умолчанию... но это не важно....


{RASkov}   (2007-07-06 04:13:00) [6]

Т.е. вот так
var
Nomer_Button: integer;
...........
Dec(Nomer_Button);
if (form1.ListBox1.Count<=0) or (Nomer_Button<0) or (Nomer_Button>=form1.ListBox1.Count) then showmessage('......')
 else form1.ListBox1.Items[Nomer_Button] := '0';
........

:о)


{RASkov}   (2007-07-06 04:10:00) [7]

В итоге вот весь твой код:
var
 Nomer_Button: integer;
...........
 if form1.ListBox1.Count<=0 then showmessage('......')
  else form1.ListBox1.Items[Nomer_Button-1] := '0';
........

Пойдет? ;)


{RASkov}   (2007-07-06 04:01:00) [8]

> В итоге все свелось к 2-м строчкам :)
>  form1.ListBox1.Items.Delete(Nomer_Button-1);
>  form1.ListBox1.Items.Insert(Nomer_Button-1,'0');
> :)

Даже к одной :)
form1.ListBox1.Items[Nomer_Button-1]:='0';
:)


{RASkov}   (2007-07-06 03:59:00) [9]

> [7] Bad_B   (06.07.07 03:42)

Что к чему....

> думаю что всем понятен код

Зря ты так думаешь.... :)

>   for h:=0 to ListBox1.Count-1 do
>   d.Add(form1.ListBox1.Items.Strings[h]);

Все проще d.Assign(form1.ListBox1.Items);
Тоже самое и потом, наоборот...

В итоге все свелось к 2-м строчкам :)
  form1.ListBox1.Items.Delete(Nomer_Button-1);
  form1.ListBox1.Items.Insert(Nomer_Button-1,'0');

:)
Не ну я вообще фик его знает, может какой глубокий смысл есть в приведенном примере.... :)

> замена на 0 того что хранится в form1.ListBox1.Items.Strings[h]
> никак не изменяет количество ListBox1.Count

Ага :)

> извращение? да)))

Полнейшее :)
Даже....

> но для любителя, имхо, сойдет

... и не думай :)


Bad_B   (2007-07-06 03:42:00) [10]

Если интересно(мало ли)))), сделал так
.......
{делал для того чтобы потом записывать в ini-файл какие кнопки остались не нажаты, и пр., и пр.}
.......
var
s,s1:string;
h,g,Nomer_Button:integer;
d:Tstringlist;
...........
  g:=form1.ListBox1.Count;
  .....
  if g<=0 then showmessage('......')
  else
begin
   d:=TStringList.Create;
   for h:=0 to ListBox1.Count-1 do
   d.Add(form1.ListBox1.Items.Strings[h]);
   d.Delete(Nomer_Button-1);
   d.Insert(Nomer_Button-1,'0');
   listbox1.Clear;
   for h:=0 to d.Count-1 do
   form1.ListBox1.Items.Add(d.Strings[h]);
   d.Free;
end;
........

где Nomer_Button - это номер кнопки (с 1 начинается счет)

ЗЫ. думаю что всем понятен код, но на всякий случай -
замена на 0 того что хранится в form1.ListBox1.Items.Strings[h]
никак не изменяет количество ListBox1.Count, поэтому ошибочка исчезает)))

ЗЫЫ. извращение? да))) но для любителя, имхо, сойдет


{RASkov}   (2007-07-06 03:36:00) [11]

> ShowMessage('Блин! Ну когда же ты поймёшь наконец, что НЕЛЬЗЯ удалять Айтемы в цикле for???');

Не увидит это сообщение :( Если конечно "удовлетворяет некоему критерию" не вызовет исключения....
Да и удалятся максимум половина итемов...

> что НЕЛЬЗЯ удалять Айтемы в цикле for

downto?


Германн   (2007-07-06 01:36:00) [12]


> Bad_B   (05.07.07 23:45)
>
> List Index out of bounds (...).
> Необходимо сделать что бы когда она возникает выдавать свой
> message, (что мол последовательность действий нарушена)


try
 for i:=0 to ListBox1.Items.Count-1 do begin
   if ListBox1.Items[i] "удовлетворяет некоему критерию" then ListBox1.Items.Delete(i);
 end;
except
 ShowMessage('Блин! Ну когда же ты поймёшь наконец, что НЕЛЬЗЯ удалять Айтемы в цикле for???');
end;

:-)


Bad_B   (2007-07-06 00:23:00) [13]

Спасибо за подсказку))

Все-таки прийдется перекодить (не там ошибку видел оказывается), на будущее учту "ловушку".

ЗЫ. еще раз спс:)


{RASkov}   (2007-07-06 00:09:00) [14]

 try
   ShowMessage(ListBox1.Items[10000]);
 except
   On EStringListError do ShowMessage('Нет такого итема');
 end;

или просто:
 try
   ShowMessage(ListBox1.Items[10000]);
 except
   ShowMessage('Нет такого итема');
 end;

??
Запускай из проводника... или если в делфи включена "Stop on Delphi Exception" то жмем Ок и сразу F9...
Ну и, как и замечено в [1], нужно следить за границами....


MsGuns   (2007-07-06 00:09:00) [15]

try .. except ShowMessage('ошибка однако'); end;


turbouser   (2007-07-06 00:04:00) [16]

Такая ошибка в нормальной программе в принципене должна появляться.
Т.е. надо править код так, что бы небыло выходов за границы массива.


Наверх

Титульная страница Поиск, карта сайта Написать письмо