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

Вниз

TreeNode   Найти похожие ветки 

 
IVAKA_27   (2008-11-12 22:46) [0]

Добрый вечер, Мастера!

Подскажите пожалуйста, как правильно в цикле из файла загрузить данные в свойство Data компонента TreeView?

В прошлый раз мне на форуме подсказали как сохранить структуру и данные в файл:


procedure TForm1.Button1Click(Sender: TObject);
var
FS: TFileStream;
SL: TStringList;
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;


Сейчас разбираюсь и пытаюсь решить обратную задачу - загрузить.


procedure TForm1.Button2Click(Sender: TObject);
var
FS: TFileStream;
SL: TStringList;
i: Integer;
s: string;
begin
 FS := TFileStream.Create("c:\test.dat", fmOpenRead);
 SL := TStringList.Create;
try
  SL.LoadFromStream(FS);
  for i:=0 to SL.Count-1 do
  s:= sl[i];
  treeview1.Items[i].Data:= pchar(s[i]);
  finally
  SL.Free;
  FS.Free;
end;
end;


Помогите пожалуйста!


 
Andy BitOff ©   (2008-11-12 22:59) [1]

Ты, для начала, расскажи нам как ты ПОНИМАШЬ, что делается в сохранении.


 
IVAKA_27   (2008-11-12 23:11) [2]

Создаем FileStream. Туда же пишем все дерево.
Потом в цикле пробегаюсь по дереву и сохраняю в StringList строки из свойства Data.


 
Поросенок Винни-Пух ©   (2008-11-12 23:13) [3]

treeview1.Items[i].Data:= pchar(s[i]);
история учит, что история нас ничему не учит.

Стринглист и все его строки умирают сразу после выхода из Button2Click


 
Andy BitOff ©   (2008-11-12 23:15) [4]

Это не всё. Нет ключевого момента, который ты пропустил и поэтому не правильно пишешь загрузку.


 
IVAKA_27   (2008-11-12 23:16) [5]

Тогда укажите путь из истории, как нужно правильно понимать историю.


 
IVAKA_27   (2008-11-12 23:18) [6]

Я заметил что в дерево грузится все содержтмое файла, так как пробежался по всему списку из файла и присвоил дереву.

Что должно быть в качестве момента?


 
Поросенок Винни-Пух ©   (2008-11-12 23:18) [7]

тебе еще днем все разжевали и в рот положили.
и теперь ситуация та же самая.


 
IVAKA_27   (2008-11-12 23:25) [8]

Зачем так громко?
Разжевали и положили......
Ну не могу я немного понять. Тока начинаю, ведь.....

Сергей М. мне говорил сделать так.


При восстановлении дерева открываешь файлстрим с указанием файла, куда дерево было ранее сохранено, грузишь дерево (TreeView.LoadFromStream), тут же из того же файлстрима грузишь стринглист, после чего бежишь по нему в цикле, считывая строки ин назначая их св-вам Data соотв.узлов восстановленного дерева.



 FS := TFileStream.Create("c:\test.dat", fmOpenRead);
 SL := TStringList.Create;
try
  treeview1.LoadFromStream(FS);//грузишь дерево (TreeView.LoadFromStream),
  SL.LoadFromStream(FS); //из того же файлстрима грузишь стринглист
  for i:=0 to SL.Count-1 do //бежишь по нему в цикле
  s:=SL[i]; //считывая строки
  treeview1.Items[0].Data:=pchar(s[i]);//назначая их св-вам Data соотв.узлов восстановленного дерева
  finally
  SL.Free;
  FS.Free;


Так ведь?


 
Поросенок Винни-Пух ©   (2008-11-12 23:26) [9]

ты - председатель исполкома.
вызвал к себе в кабинет 10 жителей своего района и вручил им ордера на новые квартиры в доме №13.
а сразу после того, как счастливые новоселы вышли из твоего кабинета ты нажал кнопку, и сбросил на дом №13 боеприпас объемного взрыва.
финальная сцена:
жильцы и ты стоят у развалин и все вместе удивляются, почему ордера есть, а квартир нет.


 
IVAKA_27   (2008-11-12 23:28) [10]

Не смешно.


 
IVAKA_27   (2008-11-12 23:30) [11]

Извиняюсь....
Ордера - это сами item"ы
Квартиры - это свойство data.
???


 
Поросенок Винни-Пух ©   (2008-11-12 23:36) [12]

data это ордер, в котором написан адрес квартиры.
в момент вручения она еще цела, а после файнали ее уже нет.
а в ордере остался ее адрес.


 
IVAKA_27   (2008-11-12 23:45) [13]

Чета не могу въехать......


 
Поросенок Винни-Пух ©   (2008-11-12 23:52) [14]

treeview1.Items[0].Data:=pchar(s[i]);

s - локальная переменная процедуры. строкового типа.
подсчет ссылок работает.
как только переменная выходит за пределы видимости, строка убивается.

и твоя дата (которая благодаря все той же s указывает на одну и ту же строку) начинает указывать на галактику m31 в созвездии андромеды.

Все тоже самое было бы и без буферной переменной s, но на время выполнения процедуры дата узлов смотрела бы на свои строки, а не на одну.

но в итоге результат все равно одинаков.


 
IVAKA_27   (2008-11-12 23:56) [15]

Понятно.
Т.е. строка только одна получается. Но я же в цикле с ней работаю.
Почему же тогда дата уничтожается

Как тогда работать? Покажите пожалуйста отрывок правильного пути. Постараюсь догадаться с своей негРаматЕ ;)


 
Поросенок Винни-Пух ©   (2008-11-13 00:13) [16]

попробуй для начала понять что есть большая разница между

i := 2;
a := i;
i := 3;
b := i;

и случаем, когда в один и тот же буфер записывают разные данные, и всем раздают ссылки на этот буфер.
в итоге все читатели прийдя по ссылке за данными получат одно и тоже значение. (значение присвоенное на последней итерации цикла)


 
Сергей М. ©   (2008-11-13 08:37) [17]


> IVAKA_27   (12.11.08 23:56) [15]


Ошибочка вышла грубая.

var
 s: String;
 pStr: PChar;
..
FS := TFileStream.Create("c:\test.dat", fmOpenRead);
SL := TStringList.Create;
try
 treeview1.LoadFromStream(FS);//грузишь дерево (TreeView.LoadFromStream),
 SL.LoadFromStream(FS); //из того же файлстрима грузишь стринглист
 for i:=0 to SL.Count-1 do //бежишь по нему в цикле
//назначая их адреса их копий св-вам Data соотв.узлов восстановленного дерева
   treeview1.Items[0].Data := StrNew(PChar(SL[i]));
 finally
 SL.Free;
 FS.Free;



при разрушении объекта TreeView в его обработчике OnDeletion обязательно выполни StrDispose(PChar(Node.Data)), иначе неминуемы утечки памяти



Страницы: 1 вся ветка

Текущий архив: 2008.12.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
2-1226475983
Uno-84
2008-11-12 10:46
2008.12.21
Вывод на печать текст из PaintBox


2-1226321890
MegaVolt_old
2008-11-10 15:58
2008.12.21
Подскажите про работу с PWideChar.


2-1226216765
hinst
2008-11-09 10:46
2008.12.21
TMethod


2-1226492779
Andrey_ka
2008-11-12 15:26
2008.12.21
ошибка при присвоении результату функции пустоты!


15-1224047537
kay
2008-10-15 09:12
2008.12.21
Выбор СУБД