Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1242324854
VoznikVopros
2009-05-14 22:14
2009.07.05
Использование CheckBox в DBGrid с Integer-полями


2-1242561252
Mer
2009-05-17 15:54
2009.07.05
Насколько приемлемо делать два конструктора


15-1240979173
Урсулапов_
2009-04-29 08:26
2009.07.05
Какой ученый первым рассказал о делении атома?


15-1241469002
Юрий
2009-05-05 00:30
2009.07.05
С днем рождения ! 5 мая 2009 вторник


3-1223294960
DelphiN!
2008-10-06 16:09
2009.07.05
Утечка памяти при работе с TIbDataSet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский