Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не пойму в чем дело с TreeView [WinXP]


Страницы:   1 2

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 ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо