![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
нужен совет по TreeNode [D7, XP]
IVAKA_27 © (2008-11-11 14:45:00)Здравствуйте!
Скажите пожалуйста, как хранить свойство DATA в файле.
Псмотрите пожалуйста код, где у меня неточности в выводе строки
procedure TForm1.Button1Click(Sender: TObject);
var MyData: string;
s: string;
begin
s:= dialogs.InputBox('Внимание!','Имя ветки','');
Mydata:= pchar(dialogs.InputBox('Внимание!','Данные ветки',''));
treeview1.Items.Add(nil, s).Data:= pchar(mydata);
end;
procedure TForm1.TreeView1Click(Sender: TObject);
var i: integer;
begin
for i:=0 to form1.TreeView1.Items.Count-1 do
if treeview1.Items[i].Selected = true then
Edit1.Text := pchar(TreeView1.Selected.Data);
end;
Сергей М. (2008-11-11 16:41:00) [1]сохранение:
var
FS: TFileStream;
i: Integer;
begin
FS := TFileStream.Create('c:\test.dat', fmCreate);
SL := TStringList.Create;
try
TreeView1.SaveToStream(FS);
for i:=0 to treeview1.Items.Count - 1 do
SL.Add(PChar(treeview1.Items[i].Data));
SL.SaveToStream(FS);
finally
SL.Free;
FS.Free;
end;
end;
IVAKA_27 (2008-11-11 16:35:00) [2]так?
procedure TForm1.Button1Click(Sender: TObject);
var
F: TFileStream;
begin
F := TFileStream.Create('c:\test.txt', fmCreate or fmShareCompat);
for i:=0 to treeview1.Items.Count do
begin
list.Add(StrNew(PChar(s2)));
end;
list.Free;
f.Free;
end;
Сергей М. (2008-11-11 16:26:00) [3]
> IVAKA_27
Пишешь дерево в файлстрим (TreeView.SaveToStream), при этом сохраняется иерархия и подписи узлов.
Тут же бежишь в цикле по списку TreeView.Items и сохраняешь строки из св-в Data каждого из узлов в стринглист.
Не закрывая файл-стрим дописываешь ему в хвост полученный стринглист.
Закрываешь файлстрим.
При восстановлении дерева открываешь файлстрим с указанием файла, куда дерево было ранее сохранено, грузишь дерево (TreeView.LoadFromStream), тут же из того же файлстрима грузишь стринглист, после чего бежишь по нему в цикле, считывая строки ин назначая их св-вам Data соотв.узлов восстановленного дерева.
Вуаля !
IVAKA_27 (2008-11-11 16:22:00) [4]Я в конце имел в виду List.savetofile(...)
т.е. я понимаю так, при формировании дерева в stringlist заносить значения свойства data, уж потом сохранять
Сергей М. (2008-11-11 16:16:00) [5]
> т.е. так?
Не-а..
Где тут сохранение ?
Это интерактивное формирование дерева, а не его сохранение.
IVAKA_27 (2008-11-11 16:13:00) [6]т.е. так?
list:= TStringlist.Create;
s1:= dialogs.InputBox('Внимание!','Имя ветки','');
s2 := InputBox('Внимание!','Данные ветки','');
List.Add(s1+s2);
with treeview1.Items.Add(nil, s1) do
Data:= StrNew(PChar(s2));
Поросенок Винни-Пух (2008-11-11 16:10:00) [7]Тогда как быть, когда выходим и сохранить все в файл с данными
Щас начнется.
А как когда снова заходим, то впихнуть все в зад из файла.
Сергей М. (2008-11-11 16:08:00) [8]Можно и так, если дерево небольшое
IVAKA_27 (2008-11-11 16:03:00) [9]т.е. завести TStringList и все это заносить туда и потом сохранятью
должно получится следующего содержания:
item1 запись1
item2 запись2
item3 запись3
Правильно?
Сергей М. (2008-11-11 16:00:00) [10]Вот именно так и быть, как следует из [14]
IVAKA_27 (2008-11-11 15:58:00) [11]Тогда как быть, когда выходим и сохранить все в файл с данными
Сергей М. (2008-11-11 15:58:00) [12]Для каждого сохраняемого узла сначала записывается длина строки, на которую указывает св-во Data (она находится по смещению -4 отн-но адреса, на который указывает Data), а затем собственно указываемая строка.
В тойже последовательности все это хозяйство считывается и восстанавливается
Поросенок Винни-Пух (2008-11-11 15:56:00) [13]свойство Data сохранять в файле нет никакого смысла.
IVAKA_27 (2008-11-11 15:53:00) [14]Ясно, Спасибо!
А как в цикле свойстиво DATA в файл посоветуете сохранять
Сергей М. (2008-11-11 15:27:00) [15]
> IVAKA_27 (11.11.08 15:18) [9]
Неправильные грибы потому что ел)
procedure TForm1.Button1Click(Sender: TObject);
var
s1, s2: String;
begin
s1:= dialogs.InputBox('Внимание!','Имя ветки','');
s2 := InputBox('Внимание!','Данные ветки','');
with treeview1.Items.Add(nil, s1) do
Data:= StrNew(PChar(s2));
end;
procedure TForm1.TreeView1Click(Sender: TObject);
begin
for i:=0 to form1.TreeView1.Items.Count-1 do
if treeview1.Items[i].Selected = true then
ShowMessage(PChar(TreeView1.Items[i].Data));
end;
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
StrDispose(Node.Data);
end;
Поросенок Винни-Пух (2008-11-11 15:26:00) [16]мало энтропии в коде.
IVAKA_27 (2008-11-11 15:18:00) [17]Мастера, что-то не включаюсь я немного......
procedure TForm1.Button1Click(Sender: TObject);
var MyData: string;
s: string;
node: TTreeNode;
i: integer;
begin
s:= dialogs.InputBox('Внимание!','Имя ветки','');
Node.Data:=StrNew(Pchar(InputBox('Внимание!','Данные ветки','')));
// Mydata:= pchar(dialogs.InputBox('Внимание!','Данные ветки',''));
treeview1.Items.Add(nil, s).Data:= node.Data;
end;
procedure TForm1.TreeView1Click(Sender: TObject);
var i: integer;
node: TTreenode;
MyData: string;
begin
for i:=0 to form1.TreeView1.Items.Count-1 do
if treeview1.Items[i].Selected = true then
begin
Edit1.Text := strnew(TreeView1.Items[i].Data);
end;
end;
Поросенок Винни-Пух (2008-11-11 15:15:00) [18]ну я и говорю, что попутал с strnew
Сергей М. (2008-11-11 15:13:00) [19]
> Поросенок Винни-Пух © (11.11.08 15:06) [5]
StrAlloc allocates a buffer for a null-terminated string with a maximum length of Size - 1
Поросенок Винни-Пух (2008-11-11 15:08:00) [20]перпутал, сори
Node.Data := StrNew(Pchar(InputBox(...)));