Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.037 c
15-1201981468
Reactor
2008-02-02 22:44
2008.03.09
Форум превратился в болото.


2-1202650542
Петр
2008-02-10 16:35
2008.03.09
перехватить открытие ссылки


15-1201900320
ProgRAMmer Dimonych
2008-02-02 00:12
2008.03.09
Подскажите, плз, направление поиска


15-1202148496
Petr V. Abramov
2008-02-04 21:08
2008.03.09
Как отлаживать DLL под XP. D 7 и ниже.


15-1202051221
Dmitry S
2008-02-03 18:07
2008.03.09
UpdateLayeredWindow





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский