Текущий архив: 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