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

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

Access Violation


Страницы:   1 2

AIK ©   (2009-03-10 08:48:00) 

Здравствуйте Уважаемые.
Не могу понять принцип ошибки «обращения к запрещенной памяти» в данном случае:

procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
 Selected: Boolean);
var
 Nom: String;
begin
BEGIN
 nom:= ListView1.Items[ListView1.ItemIndex].Caption;

 If nom='0' then
     Button1.Enabled:= true else
     Button1.Enabled:= false;
END;
end;


Код я уже подправил:

...
If ListView1.SelCount > 0 then
BEGIN

 nom:= ListView1.Items[ListView1.ItemIndex].Caption;
...


Но почему первый вариант выдает ошибку? Ведь итемы ListView’a уже заранее созданы да и ошибка вылетает только со второго клика.


AIK   (2009-03-10 11:15:00) [1]


> Palladin ©   (10.03.09 10:57) [22]


Ууу... теперь понял. Спасибо


Palladin   (2009-03-10 10:57:00) [2]

Объясняю на пальцах, еще раз. Событие OnItemSelect, как видно из справки, возбуждается в случае выделении элемента, а так же и при снятии отметки о выделении, что же произошло, нам рассказывает параметр Selected, если отметка была снята, как по твоему, в какие места будет указывать ListView1.Selected ? Правильно, туда где не светит солнце.


AIK   (2009-03-10 10:42:00) [3]


> Palladin ©   (10.03.09 10:29) [20]
> В этом случае все вышесказаное мной справедливо.


Полностью с вами согласен, а можно спросить почему в данном случаи вылетает ошибка?


Palladin   (2009-03-10 10:29:00) [4]

В этом случае все вышесказаное мной справедливо.


AIK   (2009-03-10 10:28:00) [5]


> Хм, а ты вообще о каких таких полях говоришь?


Строчки в у ListView'а


Palladin   (2009-03-10 10:07:00) [6]

Хм, а ты вообще о каких таких полях говоришь?


Palladin   (2009-03-10 09:56:00) [7]

я в шоке от тебя :) коллекция TListView.Items[]: TListItem- это что? фикция? так вот на событие TListView.OnSelectItem передается объектItem: TListItemиз этой коллекции... неужели это так трудно понять?


AIK   (2009-03-10 09:53:00) [8]


> Palladin ©   (10.03.09 09:46) [15]


Нутоесть типа создал несколько полей и у каждого свой итем чтоли?


Palladin   (2009-03-10 09:46:00) [9]


> вот я выбираю одно из полей ListView1 Item'у присваивается
> соответствующий номер поля

фантазии фантазии... они редко пересекаются с реальностю... Item'у ничего не присваивается, Item и есть тот Item который реально существует.... кажется я тебе доходчиво еще в [1] обяснил, что означает параметр selected... думани логически, что произойдет если selected будет false ?


> Может я опять туплю

"Может" - лишнее


AIK   (2009-03-10 09:40:00) [10]


> ... ( пусть даже если  ListView1.Selected.Caption )...


:)


korneley   (2009-03-10 09:39:00) [11]


> Palladin ©   (10.03.09 09:33) [11]
>боюсь тебя разочаровать, но ItemIndex отнюдь не тот элемент
> который был выделен

Не, не разочаруешь. Я же не спорю. ;) Я по поводу откуда у автора AV нарисовалось :))) А уж то он там анализирует, не то, ему уже в [1] показали.
 Да, автор, в [3] Selected запросто nil может оказаться. Будет AV номер два.


AIK   (2009-03-10 09:38:00) [12]


> А чего не Button1.Enabled := nom = '0';?


Да хоть  Button1.caption:='абвгд';

Меня интересовала суть ошибки
Может я опять туплю но вот я выбираю одно из полей ListView1 Item'у присваивается соответствующий номер поля и я вытаскиваю Caption из этого поля   ListView1.Items[ListView1.ItemIndex].Caption( пусть даже если   ListView1.Selected.Caption, а тут вылетает ошибка типа обращаюсь туда где ничего нет, всеголиш хотелось понять почему?


Palladin   (2009-03-10 09:33:00) [13]


> korneley ©   (10.03.09 09:29) [9]

боюсь тебя разочаровать, но ItemIndex отнюдь не тот элемент который был выделен


Сергей М.   (2009-03-10 09:30:00) [14]


> AIK ©   (10.03.09 09:26) [8]


> Это поле


"Поле" по-непорусски - это "Field".
Гдев объявлении формального параметра Item ты видишь слово "Field" ?


korneley   (2009-03-10 09:29:00) [15]


> Palladin ©   (10.03.09 09:25) [7]

Дык, понятно... Ну хочет человек через... ItemIndex делать, пусть. Его проблемы. Но проверить-то индекс на валидность надо :)


AIK   (2009-03-10 09:26:00) [16]


> > Так в ItemIndex он и передаетсяда что ты говоришь, это
> тебе приснилось сегодня? или откуда ты это узнал? убеждения?
>


Да я ступил :о)


>  Item это что по твоему?

Это поле.


Palladin   (2009-03-10 09:25:00) [17]


> korneley ©   (10.03.09 09:22) [6]

не только сначала, но и при уведомлении о снятии выделения


korneley   (2009-03-10 09:22:00) [18]


> AIK ©   (10.03.09 09:07) [2]
> > нужный пункт тебе в параметрах передаетсяТак в ItemIndex
> он и передается

Ага, только сначала в ИтемИндекс -1приходит, на которое ты никаких проверок не поставил.

>  If nom='0' then      Button1.Enabled:= true else      Button1.
> Enabled:= false;

А чего не Button1.Enabled := nom = '0';?


brother   (2009-03-10 09:21:00) [19]

> procedure TForm1.ListView1SelectItem(Sender: TObject; Item:
> TListItem;

> Selected: Boolean);

это про [1]


Palladin   (2009-03-10 09:13:00) [20]


> Так в ItemIndex он и передается

да что ты говоришь, это тебе приснилось сегодня? или откуда ты это узнал? убеждения?


> AIK ©   (10.03.09 09:11) [3]

я с тебя фигею. ты на параметры события вообще смотрел хоть раз в жизни? Item это что по твоему?


Страницы:   1 2

Наверх

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