Форум: "Начинающим";
Текущий архив: 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.057 c