Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.09;
Скачать: CL | DM;

Вниз

Проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.013 c
15-1201765184
Ega23
2008-01-31 10:39
2008.03.09
Дурной вопрос про QueryAnalyzer


10-1132058772
ForgotPass
2005-11-15 15:46
2008.03.09
COM-объект FlashGet ("JetCar.Netscape")


2-1202826365
smartleds
2008-02-12 17:26
2008.03.09
Народ , подскажите как мне можно узнать значение сигнала


3-1192537323
Antoxa2005
2007-10-16 16:22
2008.03.09
Как сделать Refresh для одной записи?


2-1202914748
алекс2
2008-02-13 17:59
2008.03.09
TFileStream +контрольная сумма