Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
ВнизПроблема с TStrings Найти похожие ветки
← →
Artem (2008-02-10 17:57) [0]На этапе создания формы:
i:=0;
im:=TStringList.Create;
при нажатии на кнопку "добавить":if opendialog1.Execute then
begin
im.add(opendialog1.FileName);
listBox1.Items.Add(im.strings[i-1]+" ------->"+" img"+inttostr(i));
inc(i);
end;
при нажатии на кнопку "удалить":listbox1.Items.delete(listbox1.ItemIndex);
im.delete(listbox1.ItemIndex);
Вот тут и вылетает ошибка "List Index out of bounds (-1)"
Как решить эту проблему?
← →
Anatoly Podgoretsky © (2008-02-10 18:04) [1]> Artem (10.02.2008 17:57:00) [0]
Не надо пытаться удалять, когда ItemIndex = -1
← →
Amoeba © (2008-02-10 18:05) [2]
> i:=0;
> ...
> listBox1.Items.Add(im.strings[i-1]+" ------->"+" img"+inttostr(i));
Смотрим внимательно: чему равно i? Нулю!
Так почему же
im.strings[i-1] а не im.strings[i]?
Теперь, надеюсь, понятно, "Как решить эту проблему"? Просто надо быть внимательнее с индексами.
← →
Artem (2008-02-10 18:10) [3]
> Amoeba ©
теперь List Index out of bounds (1)...
← →
Artem (2008-02-10 18:12) [4]причем при добавлении
← →
Anatoly Podgoretsky © (2008-02-10 18:17) [5]> Artem (10.02.2008 18:10:03) [3]
Опять же не надо удалять элемент с индексом 1 если у тебя его нет.
← →
Artem (2008-02-10 18:19) [6]Не могу догнать, что я пропускаю. Теперь все работает, но после удаления всех элементов при добавлении нового опять выскакивает ошибка List Index out of bounds (2)
что пропускаю?
← →
Anatoly Podgoretsky © (2008-02-10 18:20) [7]> Artem (10.02.2008 18:19:06) [6]
Теперь у тебя нет элемента с индексом 2
← →
Artem (2008-02-10 18:21) [8]какую-нибудь сортировку делать? как?
получается, что удалившиеся элементы становятся пустыми. я так понимаю на это ругается.
как решить?
← →
Anatoly Podgoretsky © (2008-02-10 18:22) [9]Не на пустые элементы не ругается.
← →
Artem (2008-02-10 18:22) [10]а что?
← →
Anatoly Podgoretsky © (2008-02-10 18:24) [11]> Artem (10.02.2008 18:22:10) [10]
А ошибка к коде. Ты оттрасируй его.
← →
Artem (2008-02-10 18:28) [12]Я же говорю, тут код простой.
Form.Create:i:=0;
im:=TStringList.Create;
Добавление:if opendialog1.Execute then
begin
im.add(opendialog1.FileName);
listBox1.Items.Add(im.strings[i]+" ------->"+" img"+inttostr(i));
inc(i);
end;
Удаление:listbox1.Items.delete(listbox1.ItemIndex);
im.delete(listbox1.ItemIndex+1);
Что пропускаю? Какую ситуацию? Что добавить?
← →
Игорь Шевченко © (2008-02-10 18:30) [13]Fencepost error
← →
Artem (2008-02-10 18:30) [14]Fencepost error - что это?
← →
Игорь Шевченко © (2008-02-10 18:41) [15]
> Fencepost error - что это?
Ошибка подсчета почтовых столбов. +- единица
← →
Artem (2008-02-10 18:44) [16]Я ни фига не понимаю. В чем здесь проблема? Как мне ее решить? Помогите чайнику :)
← →
Amoeba © (2008-02-10 18:46) [17]
> Artem (10.02.08 18:44) [16]
>
> Я ни фига не понимаю. В чем здесь проблема? Как мне ее решить?
> Помогите чайнику :)
>
Трассировать в отладчике и думать над логикой своего кода.
← →
Artem (2008-02-10 18:48) [18]Ясно. А подсказать никак что ли?
← →
Джо © (2008-02-10 18:53) [19]> [18] Artem (10.02.08 18:48)
> Ясно. А подсказать никак что ли?
Ну ведь подсказали же. [17] Amoeba ©
← →
Artem (2008-02-10 18:56) [20]
> Джо ©
скажите, что упускаю в коде? что не так делаю? ведь, наверняка, вы не раз встречались с вопросом добавления-удаления stringlist...
← →
Leonid Troyanovsky © (2008-02-10 19:20) [21]
> Artem (10.02.08 18:48) [18]
> Ясно. А подсказать никак что ли?
Здесь нужен листбокс со стилем lbVirtual*.
Или, на худой конец, lbOwnerDraw*.
--
Regards, LVT.
← →
Artem (2008-02-10 19:25) [22]
> Здесь нужен листбокс со стилем lbVirtual*
Если его таким сделать, то при добавлении элементов они не отображаются. Что делать ума ни приложу...???
← →
Leonid Troyanovsky © (2008-02-10 19:43) [23]
> Artem (10.02.08 19:25) [22]
> Если его таким сделать, то при добавлении элементов они
> не отображаются.
У тебя ошибка. В 17 строке.
> Что делать ума ни приложу...???
Почитать, например, книжку.
--
Regards, LVT.
← →
ketmar © (2008-02-10 19:48) [24]Удалено модератором
Примечание: В начинающих этой ошибки не бывает
← →
Artem (2008-02-10 20:30) [25]Все без проблем удаляется, если удалять подряд начиная с конца списка. Если элементов, например, 3 штуки, и пытаешься удалить элемент №2, то выдается ошибка.
Поэтому проблема, видимо, в этом в циклеfor loop:=0 to listbox1.Items.Count-1 do
if listbox1.selected[loop] then begin
listbox1.Items.delete(loop);
Где я ошибаюсь?
← →
Джо © (2008-02-10 20:44) [26]> [25] Artem (10.02.08 20:30)
> Все без проблем удаляется, если удалять подряд начиная с
> конца списка. Если элементов, например, 3 штуки, и пытаешься
> удалить элемент №2, то выдается ошибка.
> Поэтому проблема, видимо, в этом в цикле
> for loop:=0 to listbox1.Items.Count-1 do
> if listbox1.selected[loop] then begin
> listbox1.Items.delete(loop);
>
> Где я ошибаюсь?
В логике.
Каунт считается один раз перед началом цикла, и при удалении элемента он уже неактуален.
Поэтому, логика подсказывает удалять, например, так:
for Count-1 downto 0
или, например, и использованием while (если есть желание).
← →
Artem (2008-02-10 20:50) [27]Блин, вроде бы все работает. Огромное спасибо, Джо!
← →
sniknik © (2008-02-10 21:33) [28]> или, например, и использованием while (если есть желание).
а желание использовать clear не возникает? ;)
← →
{RASkov} © (2008-02-11 00:09) [29]> [28] sniknik © (10.02.08 21:33)
> а желание использовать clear не возникает? ;)
Дык там ему вроде не все нужно удалять, а только отмеченные :) > listbox1.selected[loop]
>>>
А вот, из первых постов, не понятно - зачем же ему одну и туже инфу хранить в двух списках.....
> im.add(opendialog1.FileName);
> listBox1.Items.Add(im.strings[i-1]+" ------->"+" img"+inttostr(i));
Вот эту фикню >+" ------->"+" img"+inttostr(i)
- можно и на OnDrawItem нарисовать....
← →
Leonid Troyanovsky © (2008-02-11 22:06) [30]
> {RASkov} © (11.02.08 00:09) [29]
> А вот, из первых постов, не понятно - зачем же ему одну
> и туже инфу хранить в двух списках.....
Не нужно.
См. также [21].
--
Regards, LVT.
← →
{RASkov} © (2008-02-11 22:22) [31]> [30] Leonid Troyanovsky © (11.02.08 22:06)
> Не нужно.
> См. также [21].
У автора с этим похоже проблемы. См [22]
Впрочем в [27] он все это как-то решил, а как - это его дело :)
Но подозреваю, что инфа так и хранится в двух листах(визуальном и невизуальном)
Согласен, это его право....
:о)
← →
Leonid Troyanovsky © (2008-02-11 22:28) [32]
> {RASkov} © (11.02.08 22:22) [31]
> У автора с этим похоже проблемы. См [22]
Видел, см [23] :)
Ну, что поделаешь, если книжек не читают,
и общаться не приспособлены.
--
Regards, LVT.
← →
Artem (2008-02-12 02:14) [33]Работаю с двумя списками, все верно. Первый нужен для визуального отображения (в него вносятся изменения
------->"+" img...
), а второй для дальнейшей обработки (в нем содержатся пути к картинкам).
Ну в общем-то верно сказали, это мое дело как это реализовать в дальнейшем :) А за реальную помощь (без которой не мог сдвинуться) большое спасибо.
P.S. Leonid Troyanovsky, книжки читаю. Но не всегда можно найти решение в них, тем более, когда его требуется получить оперативно. Общение на форуме очень помогает.
← →
{RASkov} © (2008-02-12 02:27) [34]> [33] Artem (12.02.08 02:14)
> Работаю с двумя списками, все верно.
:(
> Первый нужен для визуального отображения (в него вносятся
> изменения ------->"+" img... ),
Ну и вноси изменения на OnDrawItem зачем еще дополнительно список-то?procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
with TListBox(Control), TListBox(Control).Canvas do begin
FillRect(Rect);
TextOut(Rect.Left, Rect.Top, Items[Index]);
TextOut(Rect.Left+10+TextWidth(Items[Index]), Rect.Top, "-------> img"+IntToStr(Index));
end;
end;
← →
Artem (2008-02-12 02:29) [35]{RASkov}, спасибо, буду знать.
← →
ketmar © (2008-02-12 02:30) [36]>[33] Artem (2008-02-12 02:14:00)
>книжки читаю. Но не всегда можно найти решение в них
ты не поверишь: книжки (хорошие) — они не сборник заклинаний. они как раз учат искать решения самому.
---
Understanding is not required. Only obedience.
← →
Leonid Troyanovsky © (2008-02-12 12:26) [37]
> {RASkov} © (12.02.08 02:27) [34]
> with TListBox(Control), TListBox(Control).Canvas do begin
with Control as TListBox, Canvas
--
Regards, LVT.
← →
{RASkov} © (2008-02-12 13:53) [38]> [37] Leonid Troyanovsky © (12.02.08 12:26)
> with Control as TListBox, Canvas
А разве Канва в таком варианте будет ЛистБокса? Интересно, надо будет попробывать....
← →
{RASkov} © (2008-02-12 14:37) [39]> А разве Канва в таком варианте будет ЛистБокса?
Эх... точно, что-то я ступил :( Конечно же ЛистБокса.... Вот такой вот он "загадочный" - with :)
← →
ketmar © (2008-02-12 14:39) [40]правильно его Вирт выкинул нафиг.
---
Understanding is not required. Only obedience.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.03.09;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.041 c