Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.046 c
15-1224831530
Kolan
2008-10-24 10:58
2008.12.21
Регулярное выражение для поиска begin и end


2-1226312563
vegarulez
2008-11-10 13:22
2008.12.21
CLX + Flash. Как?


15-1224152807
stas
2008-10-16 14:26
2008.12.21
Вопрос по ASP.NET


2-1226510112
art
2008-11-12 20:15
2008.12.21
Помогите переделать задачу из Pascal в Delphi


15-1224058462
matt
2008-10-15 12:14
2008.12.21
Рабочий день





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский