Форум: "Начинающим";
Текущий архив: 2009.07.05;
Скачать: [xml.tar.bz2];
ВнизНе пойму в чем дело с TreeView Найти похожие ветки
← →
v1keeee (2009-05-11 20:53) [0]Здравствуйте мастера! Столкнулся с такой проблемой:
Сохраняю и загружаю содержимое компонента 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 созданы на этапе разработки вручную а не загружены из файла то все работает отлично. Вот не огу понять в чем трабла, может Вы знаете?
← →
Юрий Зотов © (2009-05-11 21:13) [1]1. Что-то в этой строке есть nil. Ловится отладчиком.
2. TTreeView сам умеет сохраняться в файл/поток и загружаться оттуда. Почему бы не использовать?
← →
v1keeee (2009-05-11 21:44) [2]А когда используеш эту его способность сохранятся в файл то он потом себя не читает :(
← →
ford © (2009-05-11 21:51) [3]не может такого быть
> А когда используеш эту его способность сохранятся в файл
> то он потом себя не читает :(
TTreeView
сохраняет себя в файл и читает прекрасно
проверенно не однократно
:))
а вот то что у тебя в строке
> if tv1.Items.Item[l-1].Selected = true then
ошибка вылетает
ты вначале перед это строкой проверь а вообще-то сществует твой элемент который ты хощ проверить
и еще
у TTreeView есть такое поле как
Selected:TTreeNode
сразу тебе выделенный пункт дает
TreeView1.Selected.Text:="выделенный пункт"
← →
KilkennyCat © (2009-05-11 21:59) [4]
> 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 22:06) [5]
> KilkennyCat © (11.05.09 21:59) [4]
это узел дерева для которого вызвалось событие OnCange
судя по всему
> сокращается до
не надо так сокращать
потом сам ногу сломищь пытаясь это прочесть
Ж)
← →
KilkennyCat © (2009-05-11 22:22) [6]
> потом сам ногу сломищь пытаясь это прочесть
ногу сломишь читая кучу бегинов, индов и сравнения с булевыми значениями.
> это узел дерева для которого вызвалось событие OnCange
> Проблема в том что перестает работать код обработки выделенного
> элемента:
← →
ford © (2009-05-11 22:38) [7]тут вообщето непонятно чег он хочет добиться этим кодом
пусть есть дерево из 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:42) [8]боюсь, аллах тоже бы не понял.
← →
v1keeee (2009-05-11 22:58) [9]Форд я зделал 3 элемента для теста себе на этапе разработки. Я прекрасно понимаю что в дереве из 100 элементов клик по 95 при моем коде не обработается. может Клюк в Delphi 2009 что он не читает свое сохранение этот TTreeView ?
← →
ford © (2009-05-11 23:07) [10]
> v1keeee (11.05.09 22:58) [9]
попробуй с убрать это
...
> write.ReadComponent(tv1);
и сделать
tv1.LoadFromStream(write);
100% получится
потому как, я не могу точно сказать, но при вызове метода readComponent и WriteComponent динамически выделяемые элементы объекта туда не запишутся
а Items это список с динамически выделяемымы элементами
← →
v1keeee (2009-05-11 23:11) [11]ок попробую благодарю за помощь всех кто откликнулся ;)
← →
Игорь Шевченко © (2009-05-12 00:17) [12]KilkennyCat © (11.05.09 21:59) [4]
> сокращается до
быстрого увольнения :)
← →
Германн © (2009-05-12 00:43) [13]Смущает меня строка
> Wb1.Navigate("file:\\"+extractfiledir(paramstr(0))+DataArray[l].
> Link);
Точнее присутствие в этой строке некоего "DataArray[l]", который более нигде не упоминается!
← →
v1keeee (2009-05-12 11:27) [14]Да DataArray это временный массив типа ссылок типа String, не писать же мне всю программу сюда...
← →
KilkennyCat © (2009-05-12 11:54) [15]Всю - нет. Описание типов, присутствующих в примере - неплохо бы.
← →
v1keeee (2009-05-12 12:12) [16]Да вообще задача стоит такая нужна программа "Разработка информационной среды обучения, проэктирование и конструирование мультимедийных курсов."
Я так подумал.. и решил что лучше всего зделать окно "Мастера создания мультимедийных учебных пособий" и "главное окно". Принцип решил осуществить такой - с помощью мастера создаем древовидную структуру TreeView и добавляем в массив HTML страницы, после генерируем 2 файла - первый это сохранение этого TreeView дерева а второй файл список ссылок добавленых ранее HTML страниц. Потом пользователь просто грузит программу (не "мастера" а "главное окно") и ему туда грузится первый файл тобиш TreeView из своего же сохраненного файла и файл с ссылками в массив. таким образом кликая по TreeView получаем индекс (Indx) выделенного элемента и отображаем в TWebBrowser страничку из массива DataArray[Indx]. Вот так задумал. Вроде просто и эффективно? :) с Мультимедиа файлами потом еще подумаю.. здать данную разработку нада до 30 числа данного месяца. Должен успеть по идее.
← →
v1keeee (2009-05-12 13:40) [17]Блин, ну я в шоке :( создаю 3 узла на этапе разработки - обработчик выбора узла отлично работает,
я его даже сократил до
Wb1.Navigate("file:\\"+extractfiledir(paramstr(0))+DataArray[treeview1.Selected.Index].Link);
когда гружу эти 3 узла программно при старте приложения вылетает ошибка :( что - то не то :(. Кстати заметил что если в обработчик прописать showmessage(treeview1.Selected.Text); то так же вылетает сообщение "EAccessViolation at Address"
Простой метод TTreeView.SaveToFile() сохраняет но потом невозможно загрузить полученный файл обратно :( появляется 1 пункт состоящий каракулей каких - то.
← →
KilkennyCat © (2009-05-12 14:10) [18]Создай новый проект. Кинь на форму дерево. Заполни его. Создай обработчик выбора узла. В нем напиши отображение индекса выбранной ноды.
И в конце концов, прочитай справку. Ничего из хитрого ты не используешь, все твои действия и желания полностью описаны в любой книжке.
← →
KilkennyCat © (2009-05-12 14:20) [19]и напоминаю, если не заметил [6] :
в обработчике события надо использовать его данные, т.е. работая с
procedure TMainForm.tv1Change(Sender: TObject; Node: TTreeNode); ты должен работать с Node.
Пример: (компонент дерева сторонний, но смысл должен быть понятен)procedure TF_main.TreeSChange(Sender: TObject; Node: TTreeNode);
var
i : word;
begin
case Node.absoluteIndex of
1, 2 : begin
for i := 1 to 2 do (TComponent(Sender) as THTMLTreeview).Items.Item[i].ImageIndex := 3;
node.ImageIndex := 4;
end;
427..431 : begin
for i := 427 to 431 do TreeS.Items.Item[i].ImageIndex := 3;
node.ImageIndex := 4;
end;
end;
end;
← →
v1keeee (2009-05-12 14:22) [20]Так дело в том что у меня раньше на других небольших проэктах это все работало. Щас вот думаю 2009 Delphi сменить на седьмую версию.. и попробовать там это все осуществить
← →
KilkennyCat © (2009-05-12 14:29) [21]делфи тут невиноватая.
← →
Германн © (2009-05-12 14:45) [22]
> v1keeee (12.05.09 14:22) [20]
Попробуй Эврику http://www.eurekalog.com/
триал 30 суток.
← →
v1keeee (2009-05-12 15:27) [23]Все проблему решил
> KilkennyCat © (12.05.09 14:29) [21]
> делфи тут невиноватая.
а ВОТ и нет! :)
2009 делфя, покрайней мере у меня (качал с торрентса), создает методом TTreeView.SaveToFile() файлы которые потом сама же не может загрузить! щас поставил старый родной Delphi 7 и все отлично работает и сохраняет и грузит! Вот оно как оказывается... Я почему и сказал что раньше у меня все работало - т.к. я работал в среде 7-мой Delphi, а как 2009 воткнул так многа там из всего что раньше работало или глючит или не работает.
← →
KilkennyCat © (2009-05-12 18:17) [24]Ты можешь обвинять делфи, железо и что угодно. Но глядя на код, я могу сказать снова: делфи невиноватая. Тем более, что я уже давно перешел и успешно перевел старые проекты на 2009. И практически без особых изменений.
← →
Не занят (2009-05-12 18:51) [25]
> treeview1.Selected.Text); то так же вылетает сообщение "EAccessViolation
> at Address"
Правильно вылетает, т.к. ни один элемент не выбран.
> Простой метод TTreeView.SaveToFile() сохраняет но потом
> невозможно загрузить полученный файл обратно :( появляется
> 1 пункт состоящий каракулей каких - то.
Загружаешь с помощью LoadFromFile?
← →
v1keeee (2009-05-14 09:40) [26]да загружаю с помощью LoadFromFile. Да уже все наладил я же говорю поставил 7 делфи и все нормально работает.
← →
scanerlexa © (2009-05-15 02:28) [27]Вобщем так ребята могу вам сказать одно, если загружаешь зи файла то пояляется только структура, как бы наглядная, а сами свойства не сохраняются, все nod"ы обнуляутсяю
Я в этом деле обошёлся так создал БД, и от туда отличненька перекачиваю данные сначало в столбец DBGRIDa, пототм в сому Treeviewку при этом в цикле задавая nod"ы )))
← →
scanerlexa © (2009-05-15 02:29) [28]Удалено модератором
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.07.05;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c