![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не пойму в чем дело с TreeView [WinXP]
v1keeee © (2009-05-11 20:53:00)Здравствуйте мастера! Столкнулся с такой проблемой:
Сохраняю и загружаю содержимое компонента TreeView в файл и читаю потоками:
var
write:TFileStream;
begin
write := TFileStream.Create(ExtractFilePath(ParamStr(0))+'leaning_book.lbk', fmOpenRead);
write.ReadComponent(tv1);
write.Free;
с этим проблем нет. Проблема в том что перестает работать код обработки выделенного элемента:
rocedure TMainForm.tv1Change(Sender: TObject; Node: TTreeNode);
var
l:integer;
begin
for l := 1 to 3 do
begin
if tv1.Items.Item[l-1].Selected = true then
begin
Wb1.Navigate('file:\\'+extractfiledir(paramstr(0))+DataArray[l].Link);
end;
end;
end;
При клике на пункте вылетает собщение об ошибке "EAccessViolation at address..." на строку "if tv1.Items.Item[l-1].Selected = true then"
Причем если пункты в TreeView созданы на этапе разработки вручную а не загружены из файла то все работает отлично. Вот не огу понять в чем трабла, может Вы знаете?
KilkennyCat (2009-05-11 22:42:00) [21]боюсь, аллах тоже бы не понял.
ford (2009-05-11 22:38:00) [22]тут вообщето непонятно чег он хочет добиться этим кодом
пусть есть дерево из 100 элементов
а товарисч всегда проходит по элементам 0..2
проверяя его на выбранность
мало того сработает IF только тогда когда выбран элемент 0..2
т.е. если , как я написал выше брать дерево в котором 100 элементов, кликнуть на 95-й, то
> Wb1.Navigate('file:\\'+extractfiledir(paramstr(0))+DataArray[l].
> Link);
не сработает
а сработает тока в том случае ежели кликнули на ноду с 0 до 2-й
:)
причем еще, что не учтена абсолютно структура дерева
т.е. что он хотел сказать кодом, один аллах ведает
а вот ошибка у него вылетает потому, что нету таких нод у него в дереве у которых индексы 0..2
ну нету их
загружая из файла, они не создались у него
ему сказали используй
SaveToStream или SaveToFile для объекта класса TTreeView
и будет все ок
KilkennyCat (2009-05-11 22:22:00) [23]
> потом сам ногу сломищь пытаясь это прочесть
ногу сломишь читая кучу бегинов, индов и сравнения с булевыми значениями.
> это узел дерева для которого вызвалось событие OnCange
> Проблема в том что перестает работать код обработки выделенного
> элемента:
ford (2009-05-11 22:06:00) [24]
> KilkennyCat © (11.05.09 21:59) [4]
это узел дерева для которого вызвалось событие OnCange
судя по всему
> сокращается до
не надо так сокращать
потом сам ногу сломищь пытаясь это прочесть
Ж)
KilkennyCat (2009-05-11 21:59:00) [25]
> Procedure TMainForm.tv1Change(Sender: TObject; Node: TTreeNode);
Выделенное жирным - это что?
> for l := 1 to 3 do
> begin
> if tv1.Items.Item[l-1].Selected = true then
> begin
> Wb1.Navigate('file:\\'+extractfiledir(paramstr(0))+DataArray[l].
> Link);
> end;
> end;
сокращается до
for l := 0 to 2 do if tv1.Items.Item[l].Selected then Wb1.Navigate('file:\\'+extractfiledir(paramstr(0))+DataArray[l].Link);
ford (2009-05-11 21:51:00) [26]не может такого быть
> А когда используеш эту его способность сохранятся в файл
> то он потом себя не читает :(
TTreeView
сохраняет себя в файл и читает прекрасно
проверенно не однократно
:))
а вот то что у тебя в строке
> if tv1.Items.Item[l-1].Selected = true then
ошибка вылетает
ты вначале перед это строкой проверь а вообще-то сществует твой элемент который ты хощ проверить
и еще
у TTreeView есть такое поле как
Selected:TTreeNode
сразу тебе выделенный пункт дает
TreeView1.Selected.Text:='выделенный пункт'
v1keeee (2009-05-11 21:44:00) [27]А когда используеш эту его способность сохранятся в файл то он потом себя не читает :(
Юрий Зотов (2009-05-11 21:13:00) [28]1. Что-то в этой строке есть nil. Ловится отладчиком.
2. TTreeView сам умеет сохраняться в файл/поток и загружаться оттуда. Почему бы не использовать?