Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TreeNode [D7, XP]


IVAKA_27 ©   (2008-11-12 22:46:00) 

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

Подскажите пожалуйста, как правильно в цикле из файла загрузить данные в свойство 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;


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


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


> 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)), иначе неминуемы утечки памяти


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

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

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

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


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

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

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


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

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

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

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

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

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


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

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


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

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


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

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


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

Не смешно.


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

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


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

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

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


При восстановлении дерева открываешь файлстрим с указанием файла, куда дерево было ранее сохранено, грузишь дерево (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:18:00) [11]

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


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

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

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


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

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


Andy BitOff   (2008-11-12 23:15:00) [14]

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


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

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

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


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

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


Andy BitOff   (2008-11-12 22:59:00) [17]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо