Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

нужен совет по 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.018 c
15-1224751183
int64
2008-10-23 12:39
2008.12.21
Эксперты для IDE Delphi2007


15-1224062789
Илья Корстин
2008-10-15 13:26
2008.12.21
SQL Monitor для MSAccess


10-1150811466
Smith
2006-06-20 17:51
2008.12.21
Как создать объект из dll?


2-1226599478
vegarulez
2008-11-13 21:04
2008.12.21
Подскажите как сделать картинку на канве TButton(VCL)


2-1226403905
IVAKA_27
2008-11-11 14:45
2008.12.21
нужен совет по TreeNode