![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как сохранить и данные свойства Data к узлам Treeview в файл?
linuxoid © (2010-07-02 13:59:00)type
PRec = ^Rec;
Rec = Record
S : string;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
R : PRec;
TreeNode : TTreeNode;
TreeNode2 : TTreeNode;
begin
New(R);
R.S := edit2.Text;
TreeNode := TreeView1.Items.AddObject(nil,edit1.Text,R);
end;
procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
begin
if treeview1.Selected<>nil then edit1.Text:=treeview1.Selected.Text;
edit2.Text:= Rec(Node.Data^).S;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
treeview1.SaveToFile('test.trv'); //сохранение
//.........
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
treeview1.LoadFromFile('test.trv'); //загрузка
//...........
end;
узлы сохраняются и загружаются без проблем, а вот с node.data не могу понять....
linuxoid (2010-07-02 18:05:00) [1]вроде что-то начинается получаться но все равно
значение i никак не могу связать с нужным узлом.
12 (2010-07-02 17:17:00) [2]> SL[i];
или SL.strings[i]?
короче, строка из списка, как там она точно получается..
12 (2010-07-02 17:14:00) [3]> inc(i);
linuxoid (2010-07-02 17:12:00) [4]R.Str := SL[i];
откуда берется значение i?
12 (2010-07-02 17:02:00) [5]ну, как то так
могут быть опечатки, на синтаксис не проверил
SL:= tStringList.Create; // список строк
SL.LoadfFomFile('ValueOfNode.von'); // записать в файло
n := treeview1.Items.GetFirstNode; //первый нод
while n <> nil do // пока не кончатся
begin
new(R);
R.Str := SL[i];
N.Data := R;
n := n.GetNext; // взять следующий
inc(i);
end;
FreeAndNil(SL); // больше не нужен список
linuxoid (2010-07-02 16:51:00) [6]
> > Сам что-то напишешь уже?
я первый раз сталкиваюсь с этим. хотелось бы все это на примере разобраться.
незнаю как связать нод с деревом
12 (2010-07-02 16:34:00) [7]> теперь как это обратно загрузить
дерево должно быть готово
считать значения
перебирать ноды и присваивать им считанные значения
Сам что-то напишешь уже?
linuxoid (2010-07-02 16:24:00) [8]так. все сохранилось в указанный файл.
теперь как это обратно загрузить (formcreate) и при выделении(TreeView1Changing) на определенный узел показывал нужный нам нод.
12 (2010-07-02 16:11:00) [9]не, все у нас получится :)
вот пример записи - пишите по аналогии загрузку
Записать так можно
N :TTreeNode;
SL : tStringList;
SL:= tStringList.Create; // список строк
n := treeview1.Items.GetFirstNode; //первый нод
while n <> nil do // пока не кончатся
begin
SL.Add(Rec(N.Data^).Str); // значение в список
n := n.GetNext; // взять следующий
end;
SL.SaveToFile('ValueOfNode.von'); // записать в файло
FreeAndNil(SL); // больше не нужен список
ps
могут быть опечатки, на синтаксис не проверил
linuxoid (2010-07-02 15:42:00) [10]я уже лишен этого удовольствия. в нодах вообще что не получается.
благодаря вам немного разобрался в добавлении.
но теперь хотелось бы чтоб все это сохранять в файл и загружать из него.
ну и потом изменять когда это нужно будет.
12 (2010-07-02 15:33:00) [11]могу
но не буду лишать тебя удовольствия решить самому
linuxoid (2010-07-02 15:25:00) [12]все равно еле врубаюсь.
если не трудно, можешь дописать код в ...
procedure TForm1.Button2Click(Sender: TObject);
begin
treeview1.SaveToFile('test.trv'); //сохранение
//.........
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
treeview1.LoadFromFile('test.trv'); //загрузка
//...........
end;
12 (2010-07-02 15:12:00) [13]да причем тут это
идея - обойти все ноды
n := TreeView1.Items.GetFirstNode;
while n <> nil do
begin
ShowMessage(N.Text);
n := n.GetNext;
end;
linuxoid (2010-07-02 14:52:00) [14]откуда берется значение Owner[0]; ???
12 (2010-07-02 14:41:00) [15]можно, алгоритм указан в
if Count > 0 then
begin
ANode := Owner[0];
while ANode <> nil do
begin
NodeStr := '';
for i := 0 to ANode.Level - 1 do NodeStr := NodeStr + TabChar ;
NodeStr := NodeStr + ANode.Text + EndOfLine;
Stream.Write(Pointer(NodeStr)^, Length(NodeStr));
ANode := ANode.GetNext;
end;
end;
linuxoid (2010-07-02 14:35:00) [16]не понял с этим - TCustomTreeView.SaveToFile???
нельзя ли все это в кнопку сохранить записать?
12 (2010-07-02 14:24:00) [17]да, генофонд трогать не надо :)
надо сделать наследника и свой метод
или выдрать только идею
12 (2010-07-02 14:23:00) [18]нажимаем ctrl, жмакаем по treeview1.SaveToFile
попадаем на
procedure TCustomTreeView.SaveToFile(const FileName: string);
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
нажимаем ctrl, жмакаем по SaveToStream(Stream);
попадаем на
procedure TCustomTreeView.SaveToStream(Stream: TStream);
begin
with TTreeStrings.Create(Items) do
try
SaveTreeToStream(Stream);
finally
Free;
end;
end;
нажимаем ctrl, жмакаем по SaveTreeToStream(Stream);
попадаем на
procedure TTreeStrings.SaveTreeToStream(Stream: TStream);
const
TabChar = #9;
EndOfLine = #13#10;
var
i: Integer;
ANode: TTreeNode;
NodeStr: string;
begin
if Count > 0 then
begin
ANode := Owner[0];
while ANode <> nil do
begin
NodeStr := '';
for i := 0 to ANode.Level - 1 do NodeStr := NodeStr + TabChar ;
NodeStr := NodeStr + ANode.Text + EndOfLine;
Stream.Write(Pointer(NodeStr)^, Length(NodeStr));
ANode := ANode.GetNext;
end;
end;
end;
for i := 0 to ANode.Level - 1 do NodeStr := NodeStr +(Например сюда можно вставить инфу из нода, как понравится, только придется подгружать с учетом этого изменения, по аналогии) + TabChar;
linuxoid (2010-07-02 14:10:00) [19]не понял что-то? я впервые работаю с этим компонентом.
12 (2010-07-02 14:04:00) [20]treeview1.SaveToFile
ctrl + клик, допрыгиваем до
procedure TTreeStrings.SaveTreeToStream(Stream: TStream);
и делаем по аналогии