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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2014, 20:49   #1
frte
Новичок
Джуниор
 
Регистрация: 09.12.2014
Сообщений: 2
Вопрос Странная ошибка при удалении пункта popupmenu в рантайм

Есть popupmenu со статическим набором пунктов, включая пару разделителей "-" и одно сабменю.
В рантайм создаю несколько пунктов по количеству строк checklistbox.
Создаю так:
Код:
procedure addmenu;//добавление меню
var
index: Integer;
NewItem: TMenuItem;
begin
//добавление пунктов меню

for index := 0 to uglobal.global.checklistbox3.Items.Count-1 do
    begin
NewItem := TMenuItem.Create(umain.main.PopupMenu1); 
umain.main.PopupMenu1.Items.Add(NewItem);
NewItem.Caption :=uglobal.global.checklistbox3.Items.Strings[index];
NewItem.Tag := index;
NewItem.Visible:=uglobal.global.checklistbox3.Checked[index];
NewItem.OnClick := umain.main.PopupMenuItemsClick;end;
end;
Когда приходит время их удалить, делаю так:
Код:
procedure delmenu;
var
ItemToDelete: TMenuItem;i,j : integer;
//построение меню
begin
j := umain.main.PopupMenu1.Items.Count-1;
for i := 0 to   j do if umain.main.PopupMenu1.Items[i].Tag <>-1 then umain.main.PopupMenu1.Items.Delete(i);
end;
Значение tag для статических пунктов присвоено -1.

Происходит ошибка list index out of bounds
Вроде простая ошибка, означающая превышение счётчика, но его уменьшение на 1 и даже более пунктов не приводит к её устранению. Всё равно list index out of bounds

Надеюсь кто-то увидит то, что не заметил я
frte вне форума Ответить с цитированием
Старый 09.12.2014, 21:07   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цикл удаления от конца сделай
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.12.2014, 21:13   #3
frte
Новичок
Джуниор
 
Регистрация: 09.12.2014
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Цикл удаления от конца сделай
Цитата:
for i := j downto 0 do if umain.main.PopupMenu1.Items[i].Tag <>-1 then umain.main.PopupMenu1.Items.Delete( i);
Ура, заработало!
Спасибо, Аватар, про downto я и забыл совсем
frte вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при удалении строк в Экселе reihtmonbern Общие вопросы Delphi 0 28.05.2012 04:12
Ошибка при удалении компонента Putin-mode Общие вопросы Delphi 18 24.01.2012 23:28
Ошибка при удалении из БД!!! Delphi 7. NuR1k БД в Delphi 2 21.08.2010 19:19
ошибка при удалении символа Virus191288 Общие вопросы Delphi 13 15.08.2009 14:50
Ошибка при удалении... JRcoker Общие вопросы Delphi 8 29.07.2008 22:53