Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1224833606
matt
2008-10-24 11:33
2008.12.21
Ищу работу


2-1226328530
@!!ex
2008-11-10 17:48
2008.12.21
класс, который не нужно создавать.


15-1224067825
Аскар
2008-10-15 14:50
2008.12.21
Какие есть разновидности у C++?


15-1224575628
Vlad Oshin
2008-10-21 11:53
2008.12.21
Ошибка загрузки dll. at $7C812A5B. Почему такое может быть?


2-1226475983
Uno-84
2008-11-12 10:46
2008.12.21
Вывод на печать текст из PaintBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский