Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2008, 01:34   #1
AnalogXP
Пользователь
 
Аватар для AnalogXP
 
Регистрация: 11.01.2008
Сообщений: 42
По умолчанию Как такое реализовать?

Можете помочь с такой проблемой?
Нужно загладки браузера Опера загрузить в компонент (VirtualStringTree) в виде дерева. Вот пример файла загладок:

Код:
#FOLDER
    ID=11
    NAME=Корзина
    TRASH FOLDER=YES
    UNIQUEID=a86af3602b5641109de0dac709aeddbd
#URL
    ID=12
    NAME=Windows Media
    URL=http://www.microsoft.com/isapi/redir.dll?prd=ie&ar=windowsmedia
    CREATED=1190179486
    VISITED=1190179486
-
#FOLDER
    ID=720
    NAME=New
    CREATED=1202681116
#URL
    ID=722
    NAME=AccuFind
    URL=http://accufind.com/
#FOLDER
    ID=11
    NAME=Скачать
#URL
    ID=12
    NAME=Windows Media
    URL=http://www.microsoft.com/isapi/redir.dll?prd=ie&ar=windowsmedia
    CREATED=1190179486
    VISITED=1190179486
-
-
#URL
    ID=724
    NAME=Active Window Tips & Tricks
    URL=http://www.activewin.com/frames/frmhome.shtml
#URL
    ID=726
    NAME=Add Me!  Submission to Search engines
    URL=http://www.addme.com/

В итоге, в комноненте, результат должен выглядеть примерно так:

Код:
+Корзина                                - это папка
    Windows Media                    - это ссылка (в Корзина)
+New                                     - это папка
   +Скачать                             - это подпапка (в New)
      Windows Media                  - это ссылка  (в Скачать)
    AccuFind                            - это ссылка  (в New)
 Active Window Tips & Tricks      - это ссылка  (не находится ни в какой папке)
 Add Me!  Submission to Search engines  - это ссылка  (не находится ни в какой папке)
Как это можно сделать, никак не догоняю. Разделить папки от ссылок я могу, не понимаю как создать древовидную структуру.
Буду признателен за любую подсказку, помощь.
AnalogXP вне форума Ответить с цитированием
Старый 12.02.2008, 03:08   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Папка - это родительский узел дерева.
Подпапка или УРЛ - детки этого узла.
Итак.
Кидаем на форму TreeView, тыкаем в него мышкой, чтобы выделить, а потом жмем пимпу F1.
Вываливается хэлп по ТTreeView. Выбираем его свойства, в них - свойство Items, у него тыркаем по его классу TTreeNodes, в TTreeNodes выбираем методы, а в них, например AddChild.
На открывшейся страничке тыркаем по надписи "Delphi example".
А вот там, о чудо - совершенно готовый к употреблению пример
Цитата:
как создать древовидную структуру
mihali4 вне форума Ответить с цитированием
Старый 12.02.2008, 08:29   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Правильно, остается только считать из файла, и проанализировать мол если считанная строка #FOLDER то ТTreeView.add, если #URL то ТTreeView.addChild причем применительно к текущему, и после добавления запомнить текущий

О и еще если встретилось "-" то подняться на уровень выше )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.02.2008, 11:06   #4
AnalogXP
Пользователь
 
Аватар для AnalogXP
 
Регистрация: 11.01.2008
Сообщений: 42
По умолчанию

Наверное я не совсем ясно выразился.
Мне нужно только считать из файла и создать древовидную структуру. Вот что мне удалось сделать, но я не уверер что ошибок нет.
Смог только загрузить папки, с ссылками пока не получается.

Код:
procedure GetDirWithUrlOpera(VT: TVirtualStringTree; node: PVirtualNode);
var 	s: Widestring;
      name, urls: widestring;
      NewNode, node1: PVirtualNode;
      Date: PLinks;
      ListFile : TextFile;
begin
        AssignFile (ListFile, 'Путь к файлу закладок');
        Reset (ListFile);
        while not eof(ListFile) do //........Начало цикла
        begin
            Readln (ListFile, s);
            if Trim(s) = '#FOLDER' then  //........Если папка
            begin
                while not eof(ListFile) do 
                begin
                    Readln (ListFile, s);
                    if Pos('#', s) > 0 then Break;
                    if Pos(trim('-'), s) > 0 then Break;
                    if pos('NAME=', s)>0 then
                    begin
                        name:=copy(s, pos('NAME=',s)+5, length(s)-pos('NAME=',s));
                        node := VT.AddChild(node, nil);
                        Date := VT.GetNodeData(node);
            	          if Assigned(Date) then
              	        with Date^ do
              	        begin
                            Category:=UTF8ToANSI(name);
                            links:='';
                            imageindex:=6;
                            isDir:=true;
             	          end;
                    end;
                end; 
            end; 

            if Trim(s) = '-' then
            begin
                node:=node.Parent;
            end;
        end;
        CloseFile (ListFile);
end;
Мне нужно у #FOLDER узнать его NAME=, а у #URL я должен узнать и NAME=, и URL=
AnalogXP вне форума Ответить с цитированием
Старый 12.02.2008, 12:45   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Мне алгоритм видится примерно таким образом:
1. Ваша строка
if Trim(s) = '#FOLDER' then //........Если папка
begin
...
2. Очевидно, что нужно брать вторую строку после этой или, если строже - искать подстроку "NAME=". Это и будет имя узла. Создаем его.
3. Аналогично для УРЛа - 2 и 3-я строки - наименование и урл - параметры создаваемого "детеныша".
4. Если же после решетки встретился не #URL, а #FOLDER, то (если до этого не встретился "-") - создаем подчиненный узел - подпапку.
5. А вот если встретился "-", то идем к 1 шагу...
С Date мне кажется, вы что-то перемудрили...
Все узлы имеют имя (NAME), и только "бездетные" УРЛы - имеют DATE.URL.

Последний раз редактировалось mihali4; 12.02.2008 в 12:50.
mihali4 вне форума Ответить с цитированием
Старый 12.02.2008, 13:41   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Кстати есть еще один способ:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var a,b:TStringList;i:integer;s,tbs:string;
begin
a:=TStringList.Create;
b:=TStringList.Create;  tbs:='';
a.LoadFromFile('operadef6.adr');
 //********* FOR ******************
 for i :=3  to a.Count-1 do
 begin
   s:=Trim(a[i]);
   if pos('#FOLDER',s)<>0 then begin
    tbs:='';
    b.Add(tbs+a[i+1]);
   end;
   if pos('#URL',s)<>0 then begin
    tbs:=#9;

    b.Add(tbs+a[i+2]);
   end;

  // Delete(a[i],1,1);
  if a[i]='-' then delete(tbs,1,1);
//   if a[i]<>'' then b.Add(tbs+a[i]);

 end;
 //******* END FOR ****************{}
a.Free;
b.SaveToFile('qw');
b.Free;  sleep(1000);
TreeView1.LoadFromFile('qw');
end;

end.
ТОлько не нужно кричать что он некошерный, это просто альтернатива.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.02.2008, 20:31   #7
AnalogXP
Пользователь
 
Аватар для AnalogXP
 
Регистрация: 11.01.2008
Сообщений: 42
По умолчанию

Всем спасибо, в общем с загрузкой я разобрался. Но теперь мне надо например из программы, переместить одну или несколько ссылок и папок в другую папку, между собой, удалить ссылки, папки, и т.д.
Как это сделать, как понять что и где находится, как переместить строки куда надо в этом самом файле?
AnalogXP вне форума Ответить с цитированием
Старый 16.02.2008, 20:53   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Если я вас правильно понял, решить это можно следующим образом:
1. Произведите все нужные операции НАД ДЕРЕВОМ
2. Напишите процедуру, обратную той, которая послужила причиной создания темы - т.е. процедуру создания нового файла из дерева.
Поскольку с первой задачей вы, кажется, разобрались до конца, то решить эту для вас не составит труда.
Тем более, что она гораздо проще...
mihali4 вне форума Ответить с цитированием
Старый 16.02.2008, 23:21   #9
AnalogXP
Пользователь
 
Аватар для AnalogXP
 
Регистрация: 11.01.2008
Сообщений: 42
По умолчанию

Такая идея у меня возникала, но появляется другая проблема. Ведь кроме строк с именами, ссылками, существуют еще и другие, с разными данными описывающие эти самые папки и ссылки. Тогда получается что они будут уничтоженны, и боюсь что пользователи пошлют меня лесом, за такое решение. А если искать для каждой ветки в файле, дополнительные данные, то не возникнут тормоза? А если одинаковых ссылок будет несколько, и у каждой свое описание? Снова придется определять, что, да где находится. Как в таком случае поступить?

Последний раз редактировалось mihali4; 21.12.2009 в 23:30.
AnalogXP вне форума Ответить с цитированием
Старый 17.02.2008, 00:22   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Все эти проблемы вы придумали, чтобы напугать самого себя.
"Разные данные" при построении дерева ассоциируются с каждым нодом в виде объекта (к примеру, метод AddObject, а не Add) и могут быть точно так же восстановлены в файл.
Искать их не нужно. Как только вы выбираете какой-либо НОД, в вашем распоряжении тут же оказывается его объект, к любому свойству которого вы спокойно обращаетесь. Какое замедление???
В дереве нет одинаковых НОДов и для определения "что, да где находится" есть методы для Children-ов и Parent-ов.
Вся эта проблема решается за один проход по дереву сверху вниз, лучше - рекурсивно.

Последний раз редактировалось mihali4; 21.12.2009 в 23:31.
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно реализовать такое Devourer12345 Microsoft Office Access 10 15.08.2008 08:08
3D фигуры, как реализовать? Nikiforov Помощь студентам 2 22.02.2008 00:24
можно ли такое реализовать Димарик Общие вопросы Delphi 6 22.07.2007 13:18
то такое мастерство в программировании, что такое мастер программист и что он может? Cezar Свободное общение 29 02.06.2007 23:48
Как реализовать ASin Romanus Общие вопросы C/C++ 2 16.04.2007 09:46