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

Вниз

TKOLTreeView -> ToFile   Найти похожие ветки 

 
DummyCoder   (2005-01-20 17:57) [0]

Привет, всем =)
Люди помогите пожалуйста как сохранить структуру TreeView из KOL в файл, очень надо, весь проект тормозит из-за этого, ведь кто-то наверняка занимался этим...очень нужно...


 
thaddy   (2005-01-20 18:22) [1]

something like this pseaudo code, untested:
Pass it a valid strlist and save the strlist when the procedue returns.

procedure SaveTreeView(aTreeview:Pcontrol;var aStrlist:Pstrlist);
var
 i:integer;t:string;

 procedure Recurse(aHandle:Thandle);
 var
   j:integer;
   H:Thandle;
 begin
    aList.Add(aTreeview.ItemText[aHandle]
    If aTreeview.TvItemHasChildren then
    begin
        Recurse(aTreeview,H);
      for j:=1 to aTreeview.TvChildcount-1 do
      begin
          H:=aTreeview.TItemNext[H]
          Recurse(aTreeview,h);
      end;
  end;
begin
 Recurse(aTreeview, TVI_ROOT);
end;


 
DummyCoder   (2005-01-20 19:39) [2]

Ok, i try this...
THX :)


 
DummyCoder   (2005-01-23 18:35) [3]

Хм...
Не работает :(
Может кто еще какие способы знает :(((


 
BelchonokH   (2005-01-23 19:44) [4]

Самый лучший способ это рекурсия, какого рода данные в дереве сохранять надо? с восстановлением? если надо пиши в приват, в прошлом году я такое делал...


 
DummyCoder   (2005-01-23 20:05) [5]

Не знаю как писать в приват, поэтому напишу здесь :)
Данные - обычный текст, структура такова что в корне компонента будет только один элемент, а остальные будут его детями :)
Да желательно с восстановлением.

Заранее благодарен!


 
z007   (2005-01-23 23:56) [6]

Вариант:
тупо пройтись по всем элементам, получить для каждого tvitempath (ROOT\NODE\SUBNODE\Item etc.), а потом загрузить из файла таким же образом.

Или как это делается в vcl:
ROOT
  NODE
     SUBNODE1
        Item1
        Item2
     SUBNODE2

В прошлом году я скачивал на сайте пример восстановления TreeView из такого списка. Работает. И сохраняется.
Или я не понял существо проблемы?


 
DummyCoder   (2005-01-24 00:04) [7]

Буду очень благодарен если дадите прямую ссылку на пример.


 
Slay   (2005-01-24 11:28) [8]

Вот пример сохранения и загрузки данных TreeView. У меня работает.

//Сохранение TreeView в файл (Base.dat)

function Save2File(Sender:TKOLTreeView): Boolean;
var
F: HFile;

procedure item2file(ind:cardinal);
var
 len:cardinal;
 path: String;
begin
 while ind<>0 do
 begin
  path := sender.TVItemPath(ind,"\");
  len :=length(path) ;
  FileWrite( F, len,4);
  FileWrite( F, path[1], len );
  if Sender.TVItemChild[ind]<>0 then item2file(Sender.TVItemChild[ind]);
  ind := sender.TVItemNext[ind];
 end;
end;

begin
 result := false;
 F := FileCreate("Base.dat", ofOpenWrite or ofCreateAlways);// or ofShareExclusive ofShareDenyRead or ofShareDenyWrite
 if F = INVALID_HANDLE_VALUE then Exit;

 item2file(Sender.TVRoot);

 FileClose( F );
 result := true;
end;


//Загрузка из файла(Base.dat) в TreeView

function LoadFromFile(Sender:TKOLTreeView): Boolean;
var
  len,ind : cardinal;
  F : HFile;
  Path: String;

function IndPath:cardinal;
var
  tmpPath,tmpText: String;
begin
tmpPath := ExtractFilePath(Path);
result := Sender.TVRoot;
tmpText := parse(tmpPath,"\");
while result<>0 do
 if sender.TVItemText[result] = tmpText then
 begin
  if length(tmpPath)=0 then exit;
  result:= sender.TVItemChild[result];
  tmpText := parse(tmpPath,"\");
 end else result:= sender.TVItemNext[result];
end;

begin
 result := false;
 F := FileCreate("Base.dat", ofOpenRead or ofOpenExisting);//  or ofShareExclusive
 if F = INVALID_HANDLE_VALUE then Exit;
 Sender.BeginUpdate;
 while FileRead(F,len,4)<>c0 do
 begin
  SetLength(Path,len);
  FileRead(F,Path[1],len);
  ind := IndPath;
  Sender.TVInsert(ind,TVI_SORT,ExtractFileName(path))
 end;
 Sender.EndUpdate;
 FileClose( F );
 result := true;
end;


 
thaddy   (2005-01-24 15:46) [9]

Here"s the example based on the pseaudo code that saves/loads to strlist:

procedure LoadTreeview(aTreeview:Pcontrol;list:Pstrlist);
var
 i,j:integer;
 CurLvl,
 PrevLvl,
 Diff:integer;
 H:Thandle;
 T:string;
begin
 H:=aTreeview.tvroot;
 PrevLvl:=0;
 Curlvl :=0;
 if not assigned(List) then exit;
 for i:=0 to List.count-1 do
 begin
   PrevLvl:=Curlvl;
   Curlvl:=0;
   T:=List.Items[i];
   // Determine the level and clean up the string
   while  pos(#9,T)=1 do
   begin
     inc(CurLvl);
     Delete(T,1,1);
   end;
   Diff:=Curlvl-PrevLvl;
   // same level
   if Diff = 0 then
   begin
     H:=aTreeview.TvItemParent[H];
     H:=aTreeview.TVInsert(h,0,T);
   end else
   // one level up, note can be only one level up!
   if Diff = 1 then
   begin
     H:=aTreeview.TVInsert(H,0,T);
   end else
   // This is more complicated, because you can move several levels down.
   if Diff < 0 then
   begin
     diff:= -Diff;
     for j:=0 to diff do H:=aTreeview.TVItemParent[h];
     H:=aTreeview.TVInsert(h,0,T);
   end;
 end;
end;

procedure SaveTreeview(aTreeView:Pcontrol;List:Pstrlist);

 procedure Recurse(Handle:Thandle; Reset:Boolean = false);
 const
   C:integer = 0;
 var
   Temp:Thandle;
   I:Integer;
 begin
   If reset then c:=-1;
   inc(c);
   List.Add(strrepeat(#9,c)+aTreeview.TVItemText[Handle]);
   if atreeview.TVItemHasChildren[handle] then
   begin
     Temp:=aTreeview.TVItemChild[handle];
     Recurse(Temp);
     for i:=1 to atreeview.TVItemChildCount[handle]-1 do
     begin
        Temp:=aTreeview.TVItemNext[Temp];
        dec(c);
        Recurse(Temp);
      end;
      dec(c);
     end;
 end;

begin
 if not assigned(List) then exit;
 Recurse(aTreeview.TVRoot, true);
end;


 
DummyCoder   (2005-01-24 20:25) [10]

Спасибо всем за помощь!
Код данный Slay действительно работает, огромное ему спасибо :)

Блин как я рад!!!!!!!


 
Slay   (2005-01-24 20:31) [11]

Всегда рад помочь :o)



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

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

Наверх




Память: 0.49 MB
Время: 0.046 c
2-1123225744
Гость22
2005-08-05 11:09
2005.09.04
Простой вопрос.


2-1076748058
bllem
2004-02-14 11:40
2005.09.04
помогите с треем


14-1123683162
Kerk
2005-08-10 18:12
2005.09.04
Абрамович предложил своим футболистам отдохнуть на Чукотке


4-1121182970
Volumer
2005-07-12 19:42
2005.09.04
Повторный запуск


3-1122279717
salexn
2005-07-25 12:21
2005.09.04
Проблема с Oracle под дебагером