![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с TStrings [D6]
Artem © (2008-02-10 17:57:00)На этапе создания формы:
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)"
Как решить эту проблему?
ketmar (2008-02-12 14:39:00) [1]правильно его Вирт выкинул нафиг.
---
Understanding is not required. Only obedience.
{RASkov} (2008-02-12 14:37:00) [2]> А разве Канва в таком варианте будет ЛистБокса?
Эх... точно, что-то я ступил :( Конечно же ЛистБокса.... Вот такой вот он "загадочный" - with :)
{RASkov} (2008-02-12 13:53:00) [3]> [37] Leonid Troyanovsky © (12.02.08 12:26)
> with Control as TListBox, Canvas
А разве Канва в таком варианте будет ЛистБокса? Интересно, надо будет попробывать....
Leonid Troyanovsky (2008-02-12 12:26:00) [4]
> {RASkov} © (12.02.08 02:27) [34]
> with TListBox(Control), TListBox(Control).Canvas do begin
with Control as TListBox, Canvas
--
Regards, LVT.
ketmar (2008-02-12 02:30:00) [5]>[33] Artem (2008-02-12 02:14:00)
>книжки читаю. Но не всегда можно найти решение в них
ты не поверишь: книжки (хорошие) — они не сборник заклинаний. они как раз учат искать решения самому.
---
Understanding is not required. Only obedience.
Artem (2008-02-12 02:29:00) [6]{RASkov}, спасибо, буду знать.
{RASkov} (2008-02-12 02:27:00) [7]> [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:14:00) [8]Работаю с двумя списками, все верно. Первый нужен для визуального отображения (в него вносятся изменения
------->'+' img...), а второй для дальнейшей обработки (в нем содержатся пути к картинкам).
Ну в общем-то верно сказали, это мое дело как это реализовать в дальнейшем :) А за реальную помощь (без которой не мог сдвинуться) большое спасибо.
P.S. Leonid Troyanovsky, книжки читаю. Но не всегда можно найти решение в них, тем более, когда его требуется получить оперативно. Общение на форуме очень помогает.
Leonid Troyanovsky (2008-02-11 22:28:00) [9]
> {RASkov} © (11.02.08 22:22) [31]
> У автора с этим похоже проблемы. См [22]
Видел, см [23] :)
Ну, что поделаешь, если книжек не читают,
и общаться не приспособлены.
--
Regards, LVT.
{RASkov} (2008-02-11 22:22:00) [10]> [30] Leonid Troyanovsky © (11.02.08 22:06)
> Не нужно.
> См. также [21].
У автора с этим похоже проблемы. См [22]
Впрочем в [27] он все это как-то решил, а как - это его дело :)
Но подозреваю, что инфа так и хранится в двух листах(визуальном и невизуальном)
Согласен, это его право....
:о)
Leonid Troyanovsky (2008-02-11 22:06:00) [11]
> {RASkov} © (11.02.08 00:09) [29]
> А вот, из первых постов, не понятно - зачем же ему одну
> и туже инфу хранить в двух списках.....
Не нужно.
См. также [21].
--
Regards, LVT.
{RASkov} (2008-02-11 00:09:00) [12]> [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 нарисовать....
sniknik (2008-02-10 21:33:00) [13]> или, например, и использованием while (если есть желание).
а желание использовать clear не возникает? ;)
Artem (2008-02-10 20:50:00) [14]Блин, вроде бы все работает. Огромное спасибо, Джо!
Джо (2008-02-10 20:44:00) [15]> [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:30:00) [16]Все без проблем удаляется, если удалять подряд начиная с конца списка. Если элементов, например, 3 штуки, и пытаешься удалить элемент №2, то выдается ошибка.
Поэтому проблема, видимо, в этом в цикле
for loop:=0 to listbox1.Items.Count-1 do
if listbox1.selected[loop] then begin
listbox1.Items.delete(loop);
Где я ошибаюсь?
ketmar (2008-02-10 19:48:00) [17]Удалено модератором
Примечание: В начинающих этой ошибки не бывает
Leonid Troyanovsky (2008-02-10 19:43:00) [18]
> Artem (10.02.08 19:25) [22]
> Если его таким сделать, то при добавлении элементов они
> не отображаются.
У тебя ошибка. В 17 строке.
> Что делать ума ни приложу...???
Почитать, например, книжку.
--
Regards, LVT.
Artem (2008-02-10 19:25:00) [19]
> Здесь нужен листбокс со стилем lbVirtual*
Если его таким сделать, то при добавлении элементов они не отображаются. Что делать ума ни приложу...???
Leonid Troyanovsky (2008-02-10 19:20:00) [20]
> Artem (10.02.08 18:48) [18]
> Ясно. А подсказать никак что ли?
Здесь нужен листбокс со стилем lbVirtual*.
Или, на худой конец, lbOwnerDraw*.
--
Regards, LVT.