Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Virtual Treeview заполнение и оформление


Автор: firs70 17.5.2007, 12:35
Доброго времени суток.
Решил сделать программку которая бы заходила в инет на сайт FileFactory и скачаивала от туда страничку со списком "залитых туда моими файликами"  smile  Скачать скачал, даже с парсингом вроде бы разобрался (правда говорят что кривой у меня парсер, но пашет).
Код старинички следующий:
Код

---===вырезана не информативная часть===----
<div id="folder_14451" class="folder hidden" title="2007-02-February">
---===вырезана не информативная часть===----
<div id="files_14451" class="folder-contents" style="display:none;"><div class="file-list">
    <div id="file_894f54" title="http://www.filefactory.com/file/894f54" class="file" onmouseover="register_draggable(this);">
    <a href="http://www.filefactory.com/file/894f54" onmousedown="link_down();" onclick="return link_up();">SA34HA06.avi</a>
    ---===вырезана не информативная часть===----
    <div class="file-downloads" title="117">117</div>
    <div class="file-size" title="6054166">5.77 MB</div>
    ---===вырезана не информативная часть===----
    <div id="file_01a95b" title="http://www.filefactory.com/file/01a95b" class="file" onmouseover="register_draggable(this);">
    <a href="http://www.filefactory.com/file/01a95b" onmousedown="link_down();" onclick="return link_up();">SA34HA06.part10.rar</a>
    ---===вырезана не информативная часть===----
    <div class="file-downloads" title="192">192</div>
    <div class="file-size" title="28056454">26.76 MB</div>
                
---===вырезана не информативная часть===----
<div id="folder_26908" class="folder hidden" title="2007-03-March">
---===вырезана не информативная часть===----
<div id="files_26908" class="folder-contents" style="display:none;"><div class="file-list">
    <div id="file_eccc4e" title="http://www.filefactory.com/file/eccc4e" class="file" onmouseover="register_draggable(this);">
    <a href="http://www.filefactory.com/file/eccc4e" onmousedown="link_down();" onclick="return link_up();">P78207.part08.rar</a>
    ---===вырезана не информативная часть===----
    <div class="file-downloads" title="17">17</div>
    <div class="file-size" title="83886080">80.00 MB</div>
    ---===вырезана не информативная часть===----
    <div id="file_d00a3d" title="http://www.filefactory.com/file/d00a3d" class="file" onmouseover="register_draggable(this);">
    <a href="http://www.filefactory.com/file/d00a3d" onmousedown="link_down();" onclick="return link_up();">P78207.part10.rar</a>
    ---===вырезана не информативная часть===----
    <div class="file-downloads" title="17">17</div>
    <div class="file-size" title="59684524">56.92 MB</div>
                    
---===вырезана не информативная часть===----
<div id="folder_0" class="folder hidden" title="Default">
---===вырезана не информативная часть===----
<div id="files_0" class="folder-contents" style="display:none;"><div class="file-list">
    <div id="file_b42b59" title="http://www.filefactory.com/file/b42b59" class="file" onmouseover="register_draggable(this);">
    <a href="http://www.filefactory.com/file/b42b59" onmousedown="link_down();" onclick="return link_up();">lub.kak.lub_52.part4.rar</a>
    ---===вырезана не информативная часть===----
    <div class="file-downloads" title="0">0</div>
    <div class="file-size" title="100431872">95.78 MB</div>
    ---===вырезана не информативная часть===----
    <div id="file_5c7264" title="http://www.filefactory.com/file/5c7264" class="file" onmouseover="register_draggable(this);">
    <a href="http://www.filefactory.com/file/5c7264" onmousedown="link_down();" onclick="return link_up();">lub.kak.lub_52.part3.rar</a>
    ---===вырезана не информативная часть===----
    <div class="file-downloads" title="0">0</div>
    <div class="file-size" title="100431872">95.78 MB</div>
---===вырезана не информативная часть===----            

Специально привёл пример по 2 строки в каждой из "папок" что бы не было громоздко...

Сделал я только заполнение строк имя файла, ссылка на файл, размер и количество скачек...
user posted image

Но, как видно из кода, там существуют "папки" в которых "лежат" файлы.
Хотелось бы сделать что бы тотбражалась папка (с плюсиком/минусом), а под ней располагались файлы этой папки как дочерние элементы...

Например:
-2007-02-February
|--SA34HA06.avi (и дальше ссылка, размер и кол-во скачек)
|--SA34HA06.part10.rar (и дальше ссылка, размер и кол-во скачек)
-2007-03-March
|--P78207.part08.rar (и дальше ссылка, размер и кол-во скачек)
|--P78207.part10.rar (и дальше ссылка, размер и кол-во скачек)
-Default
|--lub.kak.lub_52.part4.rar (и дальше ссылка, размер и кол-во скачек)
|--lub.kak.lub_52.part3.rar (и дальше ссылка, размер и кол-во скачек)

Хотелось бы что бы эта вот вся красота сама формировалась при загрузке, я читал статью в ней написаны примеры в которых описано как добавляются дочерние элементы в выделеном элементе (то есть на том на котором я сейчас стою). Здесь немного другая ситуация.

Я конечно был бы очень благодарен если бы мне здесь привели полноценный пример, но и любая помощь будет не лишней.

Заранее всем спасибо!!!

Автор: Sansa 17.5.2007, 13:47
От здесь глянь http://forum.vingrad.ru/topic-97620/view-all.html

Автор: firs70 17.5.2007, 13:49
Sansa, спасибо конечно  smile 
Я же говорю что статью читал...
Цитата

я читал статью в ней написаны примеры в которых описано как добавляются дочерние элементы в выделеном элементе (то есть на том на котором я сейчас стою). Здесь немного другая ситуация.

Автор: aktuba 17.5.2007, 14:03
firs70,  smile Я же тебе говорил - читай внимательнее!!!

Добавить элемент в нужный узел - VT.AddChild(Node);

Автор: firs70 17.5.2007, 14:16
aktuba, ну пример напиши хоть малюсенький  smile , не понимаю как можно это организовать всё  smile , ПЛИИИЗЗЗЗ

Автор: firs70 17.5.2007, 15:51
так вроде с добавлением папок и файлов в папки разобрался, вот теперь бы сделать так что бы файлы добавлялись какждый в свою папку (у меня парсер ищет отдельно имя файла, ссылку, размер, и скачки и при формировании я не могу разделить куда какие кидать ).
Скорее всего надо парсер организовать как то по другому. подскажите хотя бы идею  smile 

Автор: Sansa 18.5.2007, 09:30
Все зависит от того, какова структура исходного документа. Если гарантируется, что записи для всех файлов (расположенных в определенной папке) идут после записи для этой папки, и нигде больше в документе не встречаются, то при вставке в дерево узла папки его необходимо запоминать, и все узлы файлов, встреченных до следующей папки, добавлять как детей сохраненного узла папки.

Если записи файлов не группированы по папкам, то при добавлении очередного файла необходимо пробегать по всему дереву и искать ветку нужной папки

Автор: firs70 18.5.2007, 11:07
Sansa, да именно так. Идёт название папки потом содержащиеся в ней файлы, потом название другой папки и следом файлы 2-й папки...
Вот код моего парсера, НО что то не работает посмотрите может поможите кто чем может.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  lNode1, lNode2: PVirtualNode;
  lData: PDataNode;
  str, txt, ID, Name, Downl, Size: string;
  len, Idx: Integer;
begin
 VirtualStringTree1.Clear;
//------------
str:=Memo2.Text; // в memo2 хранится код странички которую мы и парсим
Idx := Pos('<div id="folder_', str);
if Idx > 0 then
  while Idx < Length(str) do
   begin
    //------------------------------------------------------
    //==Папка==
    len := Length('<div id="folder_');
    if Copy(str, Idx, len) = '<div id="folder_' then
      begin
       txt := '';
       Inc(Idx, len);
        while (str[Idx] + str[Idx+1]+str[Idx+2] <>'e="') do
         begin Inc(Idx)end; Inc(Idx,3);
        while (str[Idx] <> '"') do
         begin
          txt :=txt + str[Idx];
          Inc(Idx);
         end;
        lNode1 := Form1.VirtualStringTree1.AddChild(nil);
        lData := Form1.VirtualStringTree1.GetNodeData(lNode1);
         with lData^ do
           begin
            MName := txt;
           end;
      end;
     //=========
     //==ID файла===
     len := Length('id="file_');
     if Copy(str, Idx, len) = 'id="file_' then
      begin
       txt := '';
       Inc(Idx, len);
       while (str[Idx] <> '"') do
        begin
         txt :=txt + str[Idx];
         Inc(Idx);
        end;
       ID := 'http://www.filefactory.com/file/' + txt;
      end else ID:='';
     //=============
     //==Имя файла===
     len := Length('return link_up();">');
     if Copy(str, Idx, len) = 'return link_up();">' then
      begin
       txt := '';
       Inc(Idx, len);
       while (str[Idx] + str[Idx+1] <>'</') do
        begin
         txt := txt + str[Idx];
         Inc(Idx);
        end;
       Name := txt;
      end else Name:='';
     //==============
     //==Скачки==
     len := Length('downloads" title="');
     if Copy(str, Idx, len) = 'downloads" title="' then
      begin
       txt := '';
       Inc(Idx, len);
       while (str[Idx]+str[Idx+1] <>'">') do
        begin
         txt := txt + str[Idx];
         Inc(Idx);
        end;
       Downl := txt;
      end else Downl:='';
     //==========
     //===Размер==
     len := Length('file-size" title="');
     if Copy(str, Idx, len) = 'file-size" title="' then
      begin
       txt := '';
       Inc(Idx, len);
       while (str[Idx] + str[Idx+1] <>'">') do
        begin Inc(Idx) end; Inc(Idx,2);
       while (str[Idx] + str[Idx+1] <>'</') do
        begin
         txt := txt + str[Idx];
         Inc(Idx);
        end;
       Size := txt;
      end else Size:='';
     //===========
    //------------------------------------------------------
    Inc(Idx);
    if (ID<>'')and(Name<>'')and(Downl<>'')and(Size<>'')then
     begin
      lNode2 := Form1.VirtualStringTree1.AddChild(lNode1);
      lData := Form1.VirtualStringTree1.GetNodeData(lNode2);
      with lData^ do
       begin
        MName := Name;
        MID := ID;
        MD := Downl;
        Msz := Size;
       end;
      end;
    end;
//------------
end;

Автор: Sansa 18.5.2007, 11:49
Можешь приатачить исходный текст html полностью? А то у тебя много тэгов порезано (незакрытые)

Автор: firs70 18.5.2007, 12:19
конечно могу  как файлик ибо код большой сам по себе...
http://images.dala.by.ru/list%20for%20parser.txt

Автор: Sansa 18.5.2007, 15:54
Subj

Автор: firs70 21.5.2007, 08:37
Sansa, по моему парсеру если задавать одно из 4-х искомых (имя, ссылку, размер или скачки) работает как и в этом примере, впринципе разницы в работе нет!!! мне надо что бы добавлялись все 4 атрибута в строку.

Автор: firs70 21.5.2007, 11:19
Всё победил!!!  smile  вот код парсера (может кому нибудь пригодится)
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  lNode1, lNode2: PVirtualNode;
  lData: PDataNode;
  str, txt, ID, Name, Downl, Size: string;
  len, Idx, Idx1: Integer;
  label perebor;
begin
 VirtualStringTree1.Clear;
//------------
str:=Memo2.Text;
if str <> '' then
Idx := Pos('<div id="folder_', str);
//------------------------------------------------------
while Idx < Length(str) do
 begin
  //==Папка==
  len := Length('<div id="folder_');
  txt := '';
  Inc(Idx, len);
  Idx1:=PosEx('<div id="folder_', str, Idx);
  If Idx1 = 0 then Idx1:=Length(str);
  while (str[Idx] + str[Idx+1]+str[Idx+2] <>'e="') do
   begin Inc(Idx)end; Inc(Idx,3);
  while (str[Idx] <> '"') do
   begin
    txt :=txt + str[Idx];
    Inc(Idx);
   end;
  lNode1 := Form1.VirtualStringTree1.AddChild(nil);
  lData := Form1.VirtualStringTree1.GetNodeData(lNode1);
   with lData^ do
    begin
     MName := txt;
    end;
  //=======
perebor:
   while Idx < Idx1 do
    begin
     //==ID файла===
     Idx:= PosEx('id="file_', str, Idx);
     if Idx > Idx1 then begin Idx:=Idx1; GoTo perebor; end;
     if Idx = 0 then begin Idx:=Length(str); GoTo perebor; end;
     len := Length('id="file_');
     txt := '';
     Inc(Idx, len);
     while (str[Idx] <> '"') do
      begin
       txt :=txt + str[Idx];
       Inc(Idx);
      end;
     ID := 'http://www.filefactory.com/file/' + txt;
     //=============
     //==Имя файла===
     Idx:= PosEx('return link_up();">', str, Idx);
     len := Length('return link_up();">');
     txt := '';
     Inc(Idx, len);
     while (str[Idx] + str[Idx+1] <>'</') do
      begin
       txt := txt + str[Idx];
       Inc(Idx);
      end;
     Name := txt;
     //==============
     //==Скачки==
     Idx:= PosEx('downloads" title="', str, Idx);
     len := Length('downloads" title="');
     txt := '';
     Inc(Idx, len);
     while (str[Idx]+str[Idx+1] <>'">') do
      begin
       txt := txt + str[Idx];
       Inc(Idx);
      end;
     Downl := txt;
     //==========
     //===Размер==
     Idx:= PosEx('file-size" title="', str, Idx);
     len := Length('file-size" title="');
     txt := '';
     Inc(Idx, len);
     while (str[Idx] + str[Idx+1] <>'">') do
      begin Inc(Idx) end; Inc(Idx,2);
     while (str[Idx] + str[Idx+1] <>'</') do
      begin
       txt := txt + str[Idx];
       Inc(Idx);
      end;
     Size := txt;
     //===========
//------------------------------------------------------
    //-----Добавление файлов----------
    if (ID<>'')and(Name<>'')and(Downl<>'')and(Size<>'')then
     begin
      lNode2 := Form1.VirtualStringTree1.AddChild(lNode1);
      lData := Form1.VirtualStringTree1.GetNodeData(lNode2);
      with lData^ do
       begin
        MName := Name;
        MID := ID;
        MD := Downl;
        Msz := Size;
       end;
     end;
//-----------------------------------
  end;
 end;
//------------
end;


Теперь возникли вопросики такого плана:
1. как сделать что бы последняя папка была раскрыта (-) и видно были содержащиеся в ней файлы.
2. хотелось бы ещё сделать копирование ссылок по пр. кнопке мыши ВЫДЕЛЕННЫЕ файлы (меню пр. кнопки и выделение нужных файлов реализовать смогу), необходим только код который бы копировал в буфер обмена переменные 2-го столбца ВЫДЕЛЕННЫХ строк.

Ну а добавление картинки (папки) надеюсь сам догоню, в статье что то подобное было...
Всем заранее спасибо!!!  smile 

Автор: Sansa 21.5.2007, 11:57
В моем примере поправь:
Код

procedure TForm1.DoFinishParse();
begin
  vtMain.Expanded[vtMain.RootNode.LastChild]:= True;
end;

Автор: firs70 21.5.2007, 13:14
а как привязать к моему?
я немного не понял как реализовано "раскрытие" последней папки?
поподробнее можно пояснить? плизззз  smile 

Автор: Sansa 21.5.2007, 15:50
VirtualStringTree1.RootNode.LastChild - последний "ребенок" корневого узла (у тебя это папка)
VirtualStringTree1.Expanded[<Узел>] - проверка/установка "раскрытости" узла. Если True - узел раскрыт, иначе нет

Автор: firs70 22.5.2007, 09:10
вот спасибо, сразу всё понял и всё получилось. только вот раскрывается список и вверху таблички папка которая раскрыта, а хотелось бы что бы и предыдущие папки были видны.
вот так:
===========
+1-я папка
+2-я папка
-3-я папка
|---файл
|---файл
===========
возможно такое? или я опять невозможное захотел? smile

Автор: Sansa 22.5.2007, 16:57
А если их много и они вытеснят раскрытую?

Автор: aktuba 22.5.2007, 23:06
FullExpand - ну почитай ты хоть немного справку или статью про VT...  smile 

Автор: firs70 23.5.2007, 08:42
Цитата

А если их много и они вытеснят раскрытую?

ничего страшного, пусть вытесняют.
Главное что бы показывались все папки сначала...

Цитата

FullExpand - ну почитай ты хоть немного справку или статью про VT...   


ну вот ругаешься на меня, а у меня уже мозги закипают...  smile 

Автор: aktuba 23.5.2007, 08:59
Цитата

ну вот ругаешься на меня


Да я не ругаюсь, просто ты задаешь вопросы, на которые есть ответы в хелпе и в статье про VT... Чтобы развернуть узел - FullExpand(Node). В результате, узел Node и все его подузлы будут развернуты...

Автор: firs70 30.5.2007, 14:14
Всем спасибо. Тема закрыта. Сам с половиной разобрался, а другую "добрые люди" помогли разобрать и здесь и в "реальном мире"  smile 

Автор: aktuba 30.5.2007, 14:28
Цитата

Всем спасибо. Тема закрыта. Сам с половиной разобрался, а другую "добрые люди" помогли разобрать и здесь и в "реальном мире" 


Сейчас снова обидишься... Да не надо тебе разбираться - задачу у тебя простейшая... Тебе надо было просто посидеть часок над документацией...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)