Форум: "Начинающим";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];
Внизнужен совет по TreeNode Найти похожие ветки
← →
IVAKA_27 (2008-11-11 14:45) [0]Здравствуйте!
Скажите пожалуйста, как хранить свойство 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 14:56) [1]Майдата умирает сразу после выхода из Button1Click
← →
Сергей М. © (2008-11-11 15:01) [2]Node.Data := StrAlloc(Length(Mydata)+1);
StrCopy(Node.Data, PChar(MyData));
в событии TreeView.OnDeletion обязательно вызывать StrDispose(Node.Data);
← →
IVAKA_27 (2008-11-11 15:02) [3]Почему? Что неправильно в коде?
Если явно указать
MyData:="Мои данные";
TreeView1.Items[0].Data := MyData;
..........
if (TreeView1.Items[0].Selected) = True
then Edit1.Text := String(TreeView1.Items[0].Data);
То работает нормально.
А мне на каждый индекс нужно разные значения записывать в свойство DATA
← →
Поросенок Винни-Пух © (2008-11-11 15:05) [4]тяжелый случай ....
← →
Поросенок Винни-Пух © (2008-11-11 15:06) [5]Node.Data := StrAlloc(Length(Mydata)+1);
StrCopy(Node.Data, PChar(MyData));
Node.Data := StrAlloc(Length(Mydata));
StrCopy(Node.Data, PChar(MyData));
← →
Поросенок Винни-Пух © (2008-11-11 15:08) [6]перпутал, сори
Node.Data := StrNew(Pchar(InputBox(...)));
← →
Сергей М. © (2008-11-11 15:13) [7]
> Поросенок Винни-Пух © (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:15) [8]ну я и говорю, что попутал с strnew
← →
IVAKA_27 (2008-11-11 15:18) [9]Мастера, что-то не включаюсь я немного......
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:26) [10]мало энтропии в коде.
← →
Сергей М. © (2008-11-11 15:27) [11]
> 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;
← →
IVAKA_27 (2008-11-11 15:53) [12]Ясно, Спасибо!
А как в цикле свойстиво DATA в файл посоветуете сохранять
← →
Поросенок Винни-Пух © (2008-11-11 15:56) [13]свойство Data сохранять в файле нет никакого смысла.
← →
Сергей М. © (2008-11-11 15:58) [14]Для каждого сохраняемого узла сначала записывается длина строки, на которую указывает св-во Data (она находится по смещению -4 отн-но адреса, на который указывает Data), а затем собственно указываемая строка.
В той же последовательности все это хозяйство считывается и восстанавливается
← →
IVAKA_27 (2008-11-11 15:58) [15]Тогда как быть, когда выходим и сохранить все в файл с данными
← →
Сергей М. © (2008-11-11 16:00) [16]Вот именно так и быть, как следует из [14]
← →
IVAKA_27 (2008-11-11 16:03) [17]т.е. завести TStringList и все это заносить туда и потом сохранятью
должно получится следующего содержания:
item1 запись1
item2 запись2
item3 запись3
Правильно?
← →
Сергей М. © (2008-11-11 16:08) [18]Можно и так, если дерево небольшое
← →
Поросенок Винни-Пух © (2008-11-11 16:10) [19]Тогда как быть, когда выходим и сохранить все в файл с данными
Щас начнется.
А как когда снова заходим, то впихнуть все в зад из файла.
← →
IVAKA_27 (2008-11-11 16:13) [20]т.е. так?
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:16) [21]
> т.е. так?
Не-а..
Где тут сохранение ?
Это интерактивное формирование дерева, а не его сохранение.
← →
IVAKA_27 (2008-11-11 16:22) [22]Я в конце имел в виду List.savetofile(...)
т.е. я понимаю так, при формировании дерева в stringlist заносить значения свойства data, уж потом сохранять
← →
Сергей М. © (2008-11-11 16:26) [23]
> IVAKA_27
Пишешь дерево в файлстрим (TreeView.SaveToStream), при этом сохраняется иерархия и подписи узлов.
Тут же бежишь в цикле по списку TreeView.Items и сохраняешь строки из св-в Data каждого из узлов в стринглист.
Не закрывая файл-стрим дописываешь ему в хвост полученный стринглист.
Закрываешь файлстрим.
При восстановлении дерева открываешь файлстрим с указанием файла, куда дерево было ранее сохранено, грузишь дерево (TreeView.LoadFromStream), тут же из того же файлстрима грузишь стринглист, после чего бежишь по нему в цикле, считывая строки ин назначая их св-вам Data соотв.узлов восстановленного дерева.
Вуаля !
← →
IVAKA_27 (2008-11-11 16:35) [24]так?
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:41) [25]сохранение:
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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c