Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.05;
Скачать: CL | DM;

Вниз

Не пойму в чем дело с 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.01 c
15-1240840826
TStas
2009-04-27 18:00
2009.07.05
Насколько такая защита эффективна?


15-1241591266
Медвежонок Пятачок
2009-05-06 10:27
2009.07.05
файерфокс тупит или я


2-1242671998
TStas
2009-05-18 22:39
2009.07.05
Приведение типов в циклах


2-1242577574
Wind
2009-05-17 20:26
2009.07.05
Получить список Экспортируемых функций


15-1241123403
Юрий
2009-05-01 00:30
2009.07.05
С днем рождения ! 1 мая 2009 пятница