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

Вниз

Вывод ресалтов поиска   Найти похожие ветки 

 
Magic_STI   (2005-01-11 20:28) [0]

Вот столкнулся с проблемой. Есть файл с такой вот структурой:
[BZONE]
Type=Menu
Name=BZO
Title=Бла-Бла-Бла
All=2

[BZONE_BZO1]
Type=File
Content=Бла-Бла-Бла
Title=Бла-Бла-Бла

[BZONE_BZO2]
Type=Menu
Title=Бла-Бла-Бла
Name=Def
All=3

[BZONE_BZO2_DEF1]
type=Menu
....
....
....

И так до бесконечности. Так вот после поиска у меня есть массив записей типа
TSearch = record
         section:string;
         index:integer;
         intitle:boolean;
         end;

В Section записано имя секции INI-файла, если взять пример, приведенный выше, то например BZONE_BZO2_DEF1. Так вот нужно в Тривью построить дерево, в котором были бы все секции, которые являются родителями найденное например для секции BZONE_BZO2_DEF1 дерево будет выглядеть так:
BZONE
 BZONE_BZO2
   BZONE_BZO2_DEF1

Как это можно БЫСТРО реализовать? Я сделал, вроде работает, но настолько медленно, что я успеваю хорошо в кресле потянуться, пока оно добавит 50 элементов. Как можно сделать, чтобы побыстрее?

З.Ы. Я конечно немного непонятно выражаюсь, но надеюсь на ваше понимание %)


 
begin...end ©   (2005-01-11 22:16) [1]

> Magic_STI   (11.01.05 20:28)

Я бы загрузил файл в StringList, и потом уже с ним работал.

Примерно так:

var
 I, L, Index: Integer;
 S, Section: String;
 ParentNode: TTreeNode;
begin
 Section := {имя секции};
 Section := "[" + Section + "]";
 with TStringList.Create do
   try
     LoadFromFile("C:\MyFile.ini");
     Index := IndexOf(Section);
     if Index >= 0 then
     begin
       ParentNode := TreeView.Items.Add(NIL, "Дерево ini-файла");
       for I := 0 to Index do
       begin
         S := Strings[I];
         L := Length(S);
         if L > 0 then
           if (S[1] = "[") and (S[L] = "]") then
             ParentNode := TreeView.Items.AddChild(ParentNode, S)
       end
     end
   finally
     Free
   end
end.


А в том случае, если заданная секция (Section) гарантированно встречается в файле (а следовательно, и в StringList), то можно обойтись и без IndexOf, а просто сразу идти от начала списка, добавляя имена секций в TreeView, до тех пор, пока в списке не встретится Section.

P.S. Ни в коем разе не претендую на оптимальность.


 
Palladin ©   (2005-01-11 22:19) [2]


> Как это можно БЫСТРО реализовать?

ОТКАЗАТЬСЯ от INI файлов.


 
Magic_STI   (2005-01-12 19:39) [3]

Хм... зачем? Меня они вполне устраивают скоростью... Дело в том, что полнотекстовый поиск в TMemIniFile размером 1,6 мегов идет от силы секунды 3... а то и меньше... Но вот добавляет он результаты как черепаха... Может дело в Treeview?


 
begin...end ©   (2005-01-12 19:42) [4]

> [3] Magic_STI   (12.01.05 19:39)

TTreeView.Items.[BeginUpdate, EndUpdate] ?

P.S. А [1] Вы пробовали?


 
Magic_STI   (2005-01-12 19:54) [5]

куда ж без этого... и сортировку выключил...



Страницы: 1 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
14-1104982216
Думкин
2005-01-06 06:30
2005.01.23
С Днем рождения! 6 января


1-1104858342
Sun bittern
2005-01-04 20:05
2005.01.23
WIN32_FIND_DATA (большой размер файла)


4-1101999562
Priest
2004-12-02 17:59
2005.01.23
Остановка дочернего потока


4-1101814088
pavel_guzhanov
2004-11-30 14:28
2005.01.23
Определение монитора с помощью WMI


1-1105362176
П7
2005-01-10 16:02
2005.01.23
String в Single без погрешностей