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

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

Проблема с TStrings [D6]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

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