![]() |
| ||
|
|
Новости |
Поиск |
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 созданы на этапе разработки вручную а не загружены из файла то все работает отлично. Вот не огу понять в чем трабла, может Вы знаете?
scanerlexa (2009-05-15 02:29:00) [1]Удалено модератором
scanerlexa (2009-05-15 02:28:00) [2]Вобщем так ребята могу вам сказать одно, если загружаешь зи файла то пояляется только структура, как бы наглядная, а сами свойства не сохраняются, все nod'ы обнуляутсяю
Я в этом деле обошёлся так создал БД, и от туда отличненька перекачиваю данные сначало в столбец DBGRIDa, пототм в сому Treeviewку при этом в цикле задавая nod'ы )))
v1keeee (2009-05-14 09:40:00) [3]да загружаю с помощью LoadFromFile. Да уже все наладил я же говорю поставил 7 делфи и все нормально работает.
Не занят (2009-05-12 18:51:00) [4]
> treeview1.Selected.Text); то так же вылетает сообщение "EAccessViolation
> at Address"
Правильно вылетает, т.к. ни один элемент не выбран.
> Простой метод TTreeView.SaveToFile() сохраняет но потом
> невозможно загрузить полученный файл обратно :( появляется
> 1 пункт состоящий каракулей каких - то.
Загружаешь с помощью LoadFromFile?
KilkennyCat (2009-05-12 18:17:00) [5]Ты можешь обвинять делфи, железо и что угодно. Но глядя на код, я могу сказать снова: делфи невиноватая. Тем более, что я уже давно перешел и успешно перевел старые проекты на 2009. И практически без особых изменений.
v1keeee (2009-05-12 15:27:00) [6]Все проблему решил
> KilkennyCat © (12.05.09 14:29) [21]
> делфи тут невиноватая.
а ВОТ и нет! :)
2009 делфя, покрайней мере у меня (качал с торрентса), создает методом TTreeView.SaveToFile() файлы которые потом сама же не может загрузить! щас поставил старый родной Delphi 7 и все отлично работает и сохраняет и грузит! Вот оно как оказывается... Я почему и сказал что раньше у меня все работало - т.к. я работал в среде 7-мой Delphi, а как 2009 воткнул так многа там из всего что раньше работало или глючит или не работает.
Германн (2009-05-12 14:45:00) [7]
> v1keeee (12.05.09 14:22) [20]
Попробуй Эврику http://www.eurekalog.com/
триал 30 суток.
KilkennyCat (2009-05-12 14:29:00) [8]делфи тут невиноватая.
v1keeee (2009-05-12 14:22:00) [9]Так дело в том что у меня раньше на других небольших проэктах это все работало. Щас вот думаю 2009 Delphi сменить на седьмую версию.. и попробовать там это все осуществить
KilkennyCat (2009-05-12 14:20:00) [10]и напоминаю, если не заметил [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;
KilkennyCat (2009-05-12 14:10:00) [11]Создай новый проект. Кинь на форму дерево. Заполни его. Создай обработчик выбора узла. В нем напиши отображение индекса выбранной ноды.
И в конце концов, прочитай справку. Ничего из хитрого ты не используешь, все твои действия и желания полностью описаны в любой книжке.
v1keeee (2009-05-12 13:40:00) [12]Блин, ну я в шоке :( создаю 3 узла на этапе разработки - обработчик выбора узла отлично работает,
я его даже сократил до
Wb1.Navigate('file:\\'+extractfiledir(paramstr(0))+DataArray[treeview1.Selected.Index].Link);
когда гружу эти 3 узла программно при старте приложения вылетает ошибка :( что - то не то :(. Кстати заметил что если в обработчик прописать showmessage(treeview1.Selected.Text); то так же вылетает сообщение "EAccessViolation at Address"
Простой метод TTreeView.SaveToFile() сохраняет но потом невозможно загрузить полученный файл обратно :( появляется 1 пункт состоящий каракулей каких - то.
v1keeee (2009-05-12 12:12:00) [13]Да вообще задача стоит такая нужна программа "Разработка информационной среды обучения, проэктирование и конструирование мультимедийных курсов."
Я так подумал.. и решил что лучше всего зделать окно "Мастера создания мультимедийных учебных пособий" и "главное окно". Принцип решил осуществить такой - с помощью мастера создаем древовидную структуру TreeView и добавляем в массив HTML страницы, после генерируем 2 файла - первый это сохранение этого TreeView дерева а второй файл список ссылок добавленых ранее HTML страниц. Потом пользователь просто грузит программу (не "мастера" а "главное окно") и ему туда грузится первый файл тобиш TreeView из своего же сохраненного файла и файл с ссылками в массив. таким образом кликая по TreeView получаем индекс (Indx) выделенного элемента и отображаем в TWebBrowser страничку из массива DataArray[Indx]. Вот так задумал. Вроде просто и эффективно? :) с Мультимедиа файлами потом еще подумаю.. здать данную разработку нада до 30 числа данного месяца. Должен успеть по идее.
KilkennyCat (2009-05-12 11:54:00) [14]Всю - нет. Описание типов, присутствующих в примере - неплохо бы.
v1keeee (2009-05-12 11:27:00) [15]Да DataArray это временный массив типа ссылок типа String, не писать же мне всю программу сюда...
Германн (2009-05-12 00:43:00) [16]Смущает меня строка
> Wb1.Navigate('file:\\'+extractfiledir(paramstr(0))+DataArray[l].
> Link);
Точнее присутствие в этой строке некоего "DataArray[l]", который более нигде не упоминается!
Игорь Шевченко (2009-05-12 00:17:00) [17]KilkennyCat © (11.05.09 21:59) [4]
> сокращается до
быстрого увольнения :)
v1keeee (2009-05-11 23:11:00) [18]ок попробую благодарю за помощь всех кто откликнулся ;)
ford (2009-05-11 23:07:00) [19]
> v1keeee (11.05.09 22:58) [9]
попробуй с убрать это
...
> write.ReadComponent(tv1);
и сделать
tv1.LoadFromStream(write);
100% получится
потому как, я не могу точно сказать, но при вызове метода readComponent и WriteComponent динамически выделяемые элементы объекта туда не запишутся
а Items это список с динамически выделяемымы элементами
v1keeee (2009-05-11 22:58:00) [20]Форд я зделал 3 элемента для теста себе на этапе разработки. Я прекрасно понимаю что в дереве из 100 элементов клик по 95 при моем коде не обработается. может Клюк в Delphi 2009 что он не читает свое сохранение этот TTreeView ?