![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TKOLTreeView -> ToFile [Delphi, Windows]
DummyCoder © (2005-01-20 17:57:00)Привет, всем =)
Люди помогите пожалуйста как сохранить структуру TreeView из KOL в файл, очень надо, весь проект тормозит из-за этого, ведь кто-то наверняка занимался этим...очень нужно...
Slay (2005-01-24 20:31:00) [1]Всегда рад помочь :o)
DummyCoder (2005-01-24 20:25:00) [2]Спасибо всем за помощь!
Код данный Slay действительно работает, огромное ему спасибо :)
Блин как я рад!!!!!!!
thaddy (2005-01-24 15:46:00) [3]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;
Slay (2005-01-24 11:28:00) [4]Вот пример сохранения и загрузки данных 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;
DummyCoder (2005-01-24 00:04:00) [5]Буду очень благодарен если дадите прямую ссылку на пример.
z007 (2005-01-23 23:56:00) [6]Вариант:
тупо пройтись по всем элементам, получить для каждого tvitempath (ROOT\NODE\SUBNODE\Item etc.), а потом загрузить из файла таким же образом.
Или как это делается в vcl:
ROOT
NODE
SUBNODE1
Item1
Item2
SUBNODE2
В прошлом году я скачивал на сайте пример восстановления TreeView из такого списка. Работает. И сохраняется.
Или я не понял существо проблемы?
DummyCoder (2005-01-23 20:05:00) [7]Не знаю как писать в приват, поэтому напишу здесь :)
Данные - обычный текст, структура такова что в корне компонента будет только один элемент, а остальные будут его детями :)
Да желательно с восстановлением.
Заранее благодарен!
BelchonokH (2005-01-23 19:44:00) [8]Самый лучший способ это рекурсия, какого рода данные в дереве сохранять надо? с восстановлением? если надо пиши в приват, в прошлом году я такое делал...
DummyCoder (2005-01-23 18:35:00) [9]Хм...
Не работает :(
Может кто еще какие способы знает :(((
DummyCoder (2005-01-20 19:39:00) [10]Ok, i try this...
THX :)
thaddy (2005-01-20 18:22:00) [11]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;